电源管理
本章规定 Armv8-M 的电源管理规则。
1. 电源管理¶
以下指令与伪代码函数向 PE 硬件提示:它可以暂停执行并进入低功耗状态:
WFE。WFI。WaitForEvent()。WaitForInterrupt()。SleepOnExit()。
适用于 Armv8.0-M 及以后架构版本的实现。
1.1 等待事件(WFE)指令¶
执行 WFE 指令时,若 Event 寄存器状态为清除,则 PE 可以暂停执行并进入低功耗状态。
适用于 Armv8.0-M 及以后架构版本的实现。
Event 寄存器是系统中每个 PE 各有一个的单比特寄存器。
适用于 Armv8.0-M 及以后架构版本的实现。
软件不能直接读取、也不能直接写入 Event 寄存器。
适用于 Armv8.0-M 及以后架构版本的实现。
PE 的 Event 寄存器由以下任一情况置位:
- 任何 WFE 唤醒事件。
- 异常进入。
- 异常返回。
适用于 Armv8.0-M 及以后架构版本的实现。
Event 寄存器置位表示:自上次清除该寄存器以来已发生了一个事件,且该事件可能需要 PE 执行某些动作。
适用于 Armv8.0-M 及以后架构版本的实现。
执行 WFE 指令时,若 Event 寄存器状态为置位,则该指令清除该寄存器并立即完成。此时不暂停执行。
适用于 Armv8.0-M 及以后架构版本的实现。
若 PE 在执行 WFE 指令时进入低功耗状态,则它保持该低功耗状态,直到收到 WFE 唤醒事件。当 PE 识别到 WFE 唤醒事件时,WFE 指令完成。以下为 WFE 唤醒事件:
- 同一多处理器系统中任何其他 PE 执行
SEV指令。 - 当与某安全状态相关联的 SCR.SEVONPEND 位为 1 时,从非活动状态转入挂起状态且以该安全状态为目标的中断为唤醒事件。
- 任何优先级高于当前执行优先级的异常,判断时需考虑所有活动异常,并计入由 AIRCR.PRIS == 1 以及 PRIMASK、FAULTMASK 或 BASEPRI 实施的任何软件控制优先级提升的影响。
- 若调试已使能,则为调试事件。
- 任何 IMPLEMENTATION DEFINED 事件。
- 热复位。
适用于 Armv8.0-M 及以后架构版本的实现。
复位清除 Event 寄存器。
适用于 Armv8.0-M 及以后架构版本的实现。
当 SCR.SLEEPDEEP 为 1 且 SCR.SEVONPEND 为 1 时,任何进入挂起状态的异常是否作为 WFE 唤醒事件唤醒 PE,属于 IMPLEMENTATION DEFINED。
适用于 Armv8.0-M 及以后架构版本的实现。
Armv8-M 架构不定义指令所进入低功耗状态的确切性质,仅要求它不会导致存储器一致性丢失。
适用于 Armv8.0-M 及以后架构版本的实现。
Arm 建议软件始终在循环中使用 WFE 指令。
适用于 Armv8.0-M 及以后架构版本的实现。
参见:
- 第 B3.13 节《优先级模型》(Priority model)。
WaitForEvent()。SendEvent()。SetEventRegister()。ClearEventRegister()。EventRegistered()。
1.2 等待中断(WFI)指令¶
执行 WFI 指令时,PE 可以暂停执行并进入低功耗状态。若如此,则它保持该状态,直到收到 WFI 唤醒事件。当 PE 识别到 WFI 唤醒事件时,WFI 指令完成。以下为 WFI 唤醒事件:
- 热复位。
- 任何异步异常,其优先级在忽略 PRIMASK 影响(即行为如同 PRIMASK 为 0)后会抢占任何当前活动异常。
- IMPLEMENTATION DEFINED 的 WFI 唤醒事件。
- 若调试已使能,则为调试事件。
适用于 Armv8.0-M 及以后架构版本的实现。
满足以下任一条件时,调试事件将成为唤醒事件:
- PE 当前安全状态允许 暂停调试(Halting Debug),且 PE 被要求进入调试状态。
- 断言了 DebugMonitor 异常,且该异常具有足够优先级抢占 PE 的当前优先级。
并不要求将 DEMCR.MON_PEND 置 1 才能产生唤醒事件。
适用于 Armv8.0-M 及以后架构版本的实现。扩展要求为 - DB。注意,DebugMonitor 异常要求 M。
若 PE 当前安全状态与特权模式允许非特权调试,则非特权调试事件将成为唤醒事件。若未使能非特权调试,则该事件将被挂起,并在允许非特权调试时被接受。
适用于 Armv8.1-M 及以后架构版本的实现。扩展要求为 - DB && UDE。
Arm 建议软件始终在循环中使用 WFI 指令。
适用于 Armv8.0-M 及以后架构版本的实现。
参见:
- 第 B3.13 节《优先级模型》(Priority model)。
- 第 B13 章《调试》(Debug)。
WaitForInterrupt()。
2. 退出时睡眠¶
SleepOnExit() 函数是否使 PE 在从唯一的活动异常返回 Thread 模式期间进入低功耗状态,属于 IMPLEMENTATION DEFINED。
适用于 Armv8.0-M 及以后架构版本的实现。
当以下条件全部为真时,允许 PE 在从唯一的活动异常返回时进入低功耗状态:
- EXC_RETURN.Mode == 1。
- SCR.SLEEPONEXIT == 1。
适用于 Armv8.0-M 及以后架构版本的实现。
若使能了退出时睡眠功能,则 PE 在异常返回过程中的哪一点进入低功耗状态,属于 IMPLEMENTATION DEFINED。
适用于 Armv8.0-M 及以后架构版本的实现。
退出时睡眠功能的唤醒事件与 WFI 指令的唤醒事件相同。
适用于 Armv8.0-M 及以后架构版本的实现。
参见:
- 第 B3.13 节《优先级模型》(Priority model)。
SleepOnExit()。- 第 B3.22 节《异常返回》(Exception return)。