快速连接
👉👉👉【精选】ARMv8/ARMv9架构入门到精通-目录 👈👈👈
基本概念
PE进入low-power的方式有两种:
- WFE : Wait for Event : 如果Event Register=0则立即存入low-power standby state,否则Event Register清0.
- WFI : Wait for Interrupt : 立即进入low-power standby state
Event Register是每个 PE 的单个位寄存器。Event Register是概念寄存器,不能显式访问。Reset时Event Register是unknow的。软件不能读写Event Register.
只有WFE和WFET(Wait for Event with Timeout)时,Event Register才会被清除。当PE执行WFE或WFET时:
- 如果 Event Register寄存器是清除的,那么PE立即进入low-power模式;
- 如果Event Register是set的,那么(1)PE不会执行suspend操作;(2)Event Register将被清除;(3)WFE或WFET指令立即返回;
如果PE进入了low-power模式,直到以下发生才能退出low-power模式
- PE探测到了WFE wake-up event.
- 一种实现定义的唤醒事件,在架构上允许在任何时间发生。
- reset
该架构允许以下所有内容:
• 允许PE 出于任何原因离开低功耗状态。
• 允许 PE 将 WFE 视为 NOP,但不建议将其用于最低功耗操作
FEAT_WFxT中实现的WFET(Wait for Event with Timeout)
使用等待事件机制的软件必须容忍虚假唤醒事件,包括多个唤醒事件。
WFE和WFET指令可以在任何异常级别使用. 但也可以被trapped到高一级的异常级别(需要软件配置)
例如SCTLR_EL1.nTWE=0、HCR_EL2.TWE=1时,将被trapped到EL1
WFE wake-up 事件
(当以下事件发生时, Event Register将被置1)
- 任何一个PE执行了SEV指令
- 当前PE执行了SEVL指令
- 物理中断、虚拟中断
- An external Debug Request debug event
- 一个异常返回时
- The clearing of the global monitor for the PE
- An event from a Generic Timer event stream
- An event sent by some IMPLEMENTATION DEFINED mechanism
- 对于 WFET 指令,a local timeout event caused by the virtual count threshold value, expressed in CNTVCT_EL0
WFI wake-up events
(当以下事件发生时, Event Register将被置1)
- 物理中断、虚拟中断
- An external Debug Request debug event
- An event sent by an IMPLEMENTATION DEFINED mechanism
- 对于 WFET 指令,a local timeout event caused by the virtual count threshold value, expressed in CNTVCT_EL0
使用示例
(1)hypervisor的程序跑起来后,就是调用wfi的死循环
(2)Linux Kernel中的cpu idle
总结
- wfe不会立即进入low power state,会先检查Event Register,wfi会立即进入low power state
- wfi的low power state的退出条件是中断,wfe的low power state的退出条件是中断和一些系统事件
- wfi一般用于cpu idle, wfe一般用于实现spinlock
参考:
(1)WFE和WFI的区别
(2)D1.6 Mechanisms for entering a low-power state
关注"Arm精选"公众号,备注进ARM交流讨论区。