手臂睡眠模式进入和退出差异WFE,WFI

时间:2014-11-28 12:33:44

标签: arm interrupt cortex-m

我是ARM架构的新手,我正试图围绕唤醒机制。

首先,我发现很难找到关于此的好消息。 ARM的文档似乎非常简洁。

我想要了解的是,当Cortex(尤其是我正在使用的M0)醒来时。

作为参考,我还咨询了以下内容:

WFE指令的文档是:

    3.7.11. WFE
    Wait For Event.
    Syntax
    WFE
    Operation
    If the event register is 0, WFE suspends execution until 
      one of the following events occurs:
    an exception, unless masked by the exception mask registers or the current
      priority level
    an exception enters the Pending state, if SEVONPEND in the 
      System Control Register is set
    a Debug Entry request, if debug is enabled
    an event signaled by a peripheral or another processor in a 
      multiprocessor system using the SEV instruction.
    If the event register is 1, WFE clears it to 0 and completes immediately.
    For more information see Power management.
    Note
    WFE is intended for power saving only. When writing software assume 
      that WFE might behave as NOP.
    Restrictions
    There are no restrictions.
    Condition flags
    This instruction does not change the flags.
    Examples
        WFE  ; Wait for event

WFI:

    3.7.12. WFI
    Wait for Interrupt.
    Syntax
    WFI
    Operation
    WFI suspends execution until one of the following events occurs:
    an exception
    an interrupt becomes pending, which would preempt if PRIMASK was clear
    a Debug Entry request, regardless of whether debug is enabled.
    Note
    WFI is intended for power saving only. When writing software assume 
    that WFI might behave as a NOP operation.
    Restrictions
    There are no restrictions.
    Condition flags
    This instruction does not change the flags.
    Examples
        WFI ; Wait for interrupt

所以,有些问题:

1)首先,有人可以澄清之间的区别:

a)系统处理程序优先级寄存器

b)中断优先级寄存器。 是否只是b)用于与系统无关的中断,例如pendSv?

现在有些情况。真的,我想了解这些场景如何受以下因素控制: NVIC IRQ启用 NVIC待定 PRIMASK

影响WFE和WFI的进入和退出。

因此,这些位的各种组合产生了8种不同的场景 {NVIC_IRQ启用,NVIC待定,PRIMASK}。

到目前为止,我已经加入了模糊的理解。请帮我这张桌子。

  • 000 - 无法防止WFE或WFI进入,但也没有唤醒条件
  • 001 - as 000
  • 010 - 对于WFE和WFI,挂起如何影响进入睡眠模式?
  • 011 - 我猜这里的答案是010但可能有不同的唤醒条件?
  • 100 - 我猜WFE和WFI都进入低功耗模式并退出低功耗模式没问题。
  • 101 - WFE和WFI电源模式的任何差异都会从此处退出?
  • 110 - 不知道!
  • 111 - 不知道!

我在这里排除了优先级,因为我还不太关心异常处理顺序。

排除SEV和事件信号,如果SEVONPEND为0,WFE的行为是否与WFI相同?

2 个答案:

答案 0 :(得分:4)

您在Cortex-M上看到的唤醒的主要机制是中断,因此是WFI(等待中断)。在我所见的所有实现导致时钟门控核心的实现中,如果设计支持它,有时可以使用更深的睡眠/更高延迟模式。

WFE在多处理器设计中更具相关性。

关于问题 - 1.中断和系统处理程序在Cortex-M中非常相似,主要区别在于它们的触发方式。该架构区分它们,但在实践中它们是相同的。

对于你的位表,它们真的没有意义。每个Cortex-M实现都有自己对WFI期间发生的事情的解释。它可以从基本时钟门控到深度睡眠模式。有关真实故事,请参阅微处理器文档。

PRIMASK不会影响睡眠行为。

答案 1 :(得分:1)

我的回答你关于WFI和WFE之间的差异是基于ARM Cortex-A9 MPcore的问题,请看一下这个链接 ARM cortex-a9 MPcore TRM

基本上,有四种CPU模式运行模式,待机模式,休眠模式,关机模式。

WFI和WFE的区别在于将CPU带入运行模式。

WFE可以在多处理器系统中的任何处理器上执行SEV指令,也可以使用EVENTI输入信号的断言。

WFI没有这两个。

他们处理原因的方式。

WFI必须使用IRQ_Handler,WFE不必。