一、 概述
本章主要简述 WFE 和 WFI 使用。(这里主要参考 armv7m)。这两者都可以是的 CPU 暂停执行,但又有区别。
二、WFE
对于 WFE,即是 Wait For Event。WFE 和 SEV 支持基于软件的系统事件同步。WFE 可以:
(1)使用WFE指令表明它能够挂起进程或线程的执行,直到事件发生才解除挂起,从而允许硬件进入低功耗状态。
(2)依赖于对软件透明的机制,并提供低延迟唤醒。
WFE 机制取决于以下因素的相互作用:
(1)WFE 唤醒事件
(2)事件寄存器
(3)SEV指令
(4)WFE 指令
2.1 WFE 唤醒事件
(1)在多处理器系统中的任何处理器上执行 SEV 指令。(该指令将一个事件发送给多处理器系统中所有 CPU)
(2)如果置位了SCR->SEVONPEND,则从 Inactive 进入Pending状态的任何异常都可唤醒。
(3)具有比当前活动异常更高优先级的异步异常,它抢占任何当前活动的异常。
(4)启用调试的调试事件。
(5)复位。
2.2 事件寄存器
事件寄存器是多处理器系统中每个处理器的单比特寄存器。当设置事件寄存器时,事件寄存器表明事件已经发生。以下条件适用于事件寄存器:
(1)复位清除事件寄存器。
(2)任何WFE唤醒事件,或者异常返回指令的执行,都会设置事件寄存器。
(3)WFE指令清除事件寄存器。
(4)软件不能直接读取或写入事件寄存器的值
2.3 SEV 指令
在一个多处理器系统中,将一个唤醒事件发送给所有CPU。用于向处理器发送事件信号的机制是IMPLEMENTATION DEFINED。
2.4 WFE 指令
等待事件指令的动作,取决于事件寄存器的状态:
(1)如果设置了事件寄存器,则该指令清除寄存器并立即返回。
(2)如果事件寄存器清除,处理器可以暂停执行并进入低功耗状态。它可以保持这种状态,直到处理器检测到WFE唤醒事件或复位。当处理器检测到WFE唤醒事件时,则WFE指令完成。
WFE唤醒事件可以在发出WFE指令之前发生。使用Wait For Event机制的软件必须能够容忍虚假的唤醒事件,包括多次唤醒。
WFE是一个提示指令。如果Event Register是清空的,它将在与快速唤醒一致的最低功率状态下暂停执行,而不需要软件恢复,直到发生复位、异常或其他事件。
三、WFI
对于 WFI,即是 Wait For Interrput,其支持等待中断。在 CPU 发出 WFI 指令时,CPU 可以暂停执行并进入低功耗状态。
3.1 WFI 唤醒事件
WFI 的唤醒事件如下:
(1)复位
(2)一种具有优先级的异步异常,如果PRIMASK设置为0,将抢占任何当前活动的异常。(处理器在确定异步异常是否为WFI唤醒事件时忽略PRIMASK的值。)
(3)如果启用了debug,则显示一个调试事件。
(4)一个实现定义的WFI唤醒事件。
这里例如:异常优先级规则意味着,如果处理器以NMI优先级执行WFI指令,则强制该指令完成的唯一保证方法是复位或调试状态进入。
当检测到唤醒事件,WFI指令完成,CPU 有两种做法:
(1)如果考虑到PRIMASK的值,存在一个具有足够优先级来抢占执行的挂起异常。
(2)在执行WEI指令后立即从指令恢复执行。
3.2 WFI 进入低功耗
WFI 指令通常:
(1)强制暂停执行和所有相关总线活动。
(2)停止执行来自处理器的指令。
执行此操作所需的控制逻辑通常跟踪处理器总线接口的活动。这意味着它可以向外部电源控制器发出信号,表明没有正在进行的总线活动。
需要注意的是:
(1)目前体系里面将WFI定义为处理器可以忽略的nop兼容提示。
(2)处理器可以虚假地退出低功耗状态,或者由于调试,或者由于一些实现定义的原因。等待中断的一些实现在增加了时钟可以停止的区域,从而增加了省电。
四、参考文档
ARM:《DDI0403E_d_armv7m_arm.pdf》