对于ARM体系结构,我是相当陌生的人,我正在努力唤醒唤醒机制。

因此,首先,我发现很难找到有关此方面的好信息。 ARM的文档似乎在这个主题上非常简洁。

我想了解的是Cortex(特别是M0,因为这就是我正在使用的)何时会醒来。

作为引用,我还引用了以下内容:

  • What is the purpose of WFI and WFE instructions and the event signals?
  • Why does the processor enter standby when using WFE instruction but not when using WFI instruction?

  • 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}。

    到目前为止,我已经添加了模糊的理解。请帮我这张 table 。
  • 000-不能阻止WFE或WFI进入,但是
  • 都没有唤醒条件
  • 001-as 000
  • 010-等待如何影响WFE和WFI进入休眠模式?
  • 011-我猜这里的答案是010,但唤醒条件可能不同?
  • 100-我想WFE和WFI都可以进入低功耗模式并退出低功耗模式。
  • 101-WFE和WFI功耗模式有何区别?
  • 110-不知道!
  • 111-不知道!

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

    如果SEVONPEND为0,则不包括SEV和事件信号,WFE的行为是否与WFI相同?

    最佳答案

    您将在Cortex-M上看到的主要唤醒机制是中断,因此是WFI(等待中断)。我看到的所有实现都会导致时钟对内核进行时钟门控,尽管如果设计支持,有时可以使用更深的 sleep /更高的延迟模式。

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

    关于这些问题-
    1.中断和系统处理程序在Cortex-M中非常相似,主要区别在于它们的触发方式。体系结构将它们区分开,但是实际上它们是相同的。

    对于您的位表,它们实际上没有任何意义。每个Cortex-M实现对WFI期间发生的事情都有其自己的解释。从基本的时钟门控到深度 sleep 模式,它可能会有所不同。请查阅您的微处理器文档以获取真实的故事。

    PRIMASK不会影响从 sleep 行为中唤醒。

    09-30 18:11