ARM休眠模式进入和退出的差异:WFE,WFI

10

我对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-作为000
  • 010-待决如何影响WFE和WFI进入睡眠模式?
  • 011-我猜答案在这里就像010一样,但可能具有不同的唤醒条件?
  • 100-我猜WFE和WFI都可以进入低功耗模式并正常退出低功耗模式。
  • 101-WFE和WFI功耗模式退出是否有任何不同?
  • 110-没想法!
  • 111-没想法!

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

如果SEVONPEND为0,除了SEV和事件信号之外,WFE是否与WFI表现相同?


1
我无法完全理解你的问题。然而,ARM文档相当模糊,因为将这些信号连接到不同的逻辑是SOC实现者的责任。我认为这与NVIC无关(我更了解GIC),所以也许有人可以直接回答你的问题;但是,你应该查阅SOC文档,看看它是否有关于这种行为的内容。例如,许多SOC都有一个寄存器,进一步细化了在“WFI”时会发生什么;从“仅暂停CPU”到“关闭所有时钟,但DDR 32kHz自刷新”。 - artless noise
1
例如,在某些SOC上,中断是否会影响“WFI”是通过一个特定于SOC的单独寄存器进行配置的。例如,UART模块可能支持异步静态逻辑,可以检测到传入字符。您可以将其配置为从最深的睡眠模式唤醒。因此,NVIC寄存器可能根本不涉及。有一些内部的WFI_WAKE类型信号,SOC将其路由到核心。 - artless noise
谢谢提供这些信息。我之前不知道还有这些额外的信号。我的问题与上述位的含义有关。 - Gregory Kuhn
2个回答

6

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

在多处理器设计中,WFE更为相关。

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

对于您的位表,它们并没有真正意义上的解释。每个Cortex-M实现都有自己的解释,关于WFI期间发生的情况。它可能因基本时钟门控制或深度睡眠模式而异。请参考您的微处理器文档了解真实情况。

PRIMASK不会影响从睡眠状态唤醒的行为。


2
我的回答关于WFI和WFE的区别是基于ARM Cortex-A9 MPcore,可以查看这个链接 ARM cortex-a9 MPcore TRM

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

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

WFE可以与多处理器系统中任何处理器上的SEV指令执行一起工作,并且也可以与EVENTI输入信号的断言一起工作。

WFI则没有这两个功能。

此外,它们处理原因的方式也不同。

WFI必须与IRQ_Handler一起使用,而WFE则不必。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接