背景
今天阅读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中断
浙公网安备 33010602011771号