背景

今天阅读Nordic SDK里的example时发现里面功耗管理使用的power_manage()函数主要就是调用了一个__WFE()函数。查阅资料了解到WFE是一条汇编指令,它可以让CPU内核进入idle模式,与其相应的还有另外一条汇编指令WFI。

/**@brief   Sleep until an event is received. */
static void power_manage(void)
{
#ifdef SOFTDEVICE_PRESENT
    (void) sd_app_evt_wait();
#else
    __WFE();
#endif
}

WFI与WFE

WFI和WFE都是cortex内核进入低功耗模式的指令,WFI指的是wait for interrupt,WFE指的是wait for event。从字面上理解,WFI是等待中断,WFE是等待事件。等待中断很好明白,中断是嵌入式编程常用的硬件机制,大家都很熟。但是等待事件到底是等待什么,事件和中断一样吗?那肯定是不一样的,不然就不会区分WFI和WFE了。

二者区别:

WFE

WFE实际上是受控于一个1bit event register。当CPU执行WFE指令时,如果event register没有被置位(0),则当前CPU就会进入低功耗模式;如果event register被置位(1)了,则会将事件寄存器对应当前CPU的位复位(0),然后返回继续执行接下来的指令,不会进入低功耗模式。
WFE进入低功耗模式后的唤醒条件:

  • 发生了未被屏蔽的IRQ中断
  • 发生了未被屏蔽的FIQ中断
  • CPU对应的event register被置位(1)。如果通过这种方式唤醒,CPU会在唤醒后立即将event register复位(0)

WFI

WFI指令执行后CPU立即进入低功耗状态。
WFI进入低功耗模式后的唤醒条件:

  • 发生了未被屏蔽的IRQ中断
  • 发生了未被屏蔽的FIQ中断
posted on 2022-07-28 17:20  WORMARZ  阅读(2373)  评论(2)    收藏  举报