RSIC-V_WFI和WFE
在 RISC-V 架构中,`WFE`(Wait For Event)和 `WFI`(Wait For Interrupt)是两种不同的低功耗休眠指令,主要用于暂停处理器执行以降低功耗,直到特定事件或中断触发唤醒。以下是它们的核心区别:
核心差异
-
标准化程度
- WFI(Wait For Interrupt)
- 功能:
处理器执行 `WFI` 后会进入休眠状态,**直到被任意使能的中断或异常唤醒**(包括定时器中断、外部中断等)。
- 设计目标:
主要用于降低功耗,适用于空闲等待中断的场景(如操作系统空闲循环)。
- 行为细节:
- 唤醒条件:任何未被屏蔽的中断(全局中断使能且中断源未被禁用)。
- 实现可能允许处理器在中断未实际触发时继续执行(取决于微架构实现)。
- 典型用途:
操作系统调度器在无任务运行时调用 `WFI` 进入低功耗模式。
- WFE(Wait For Event)
- 功能:
处理器执行 `WFE` 后会暂停,直到特定事件(Event)发生。事件可能包括:
- 显式的 `SEV`(Send Event)指令(由其他核或线程触发)。
- 中断(可选配置,取决于实现)。
- 设计目标:
支持多核/多线程场景下的高效同步,避免忙等待(busy-wait)。
- 行为细节:
- 唤醒条件更灵活,可能不依赖中断(例如通过核间通信触发)。
- 某些实现可能允许事件累积(即事件发生后未立即唤醒时,后续 `WFE` 直接通过)。
- 典型用途:
多核同步场景,如自旋锁优化(锁被释放时通过 `SEV` 唤醒等待的核)。 -
功能设计
- WFI :执行后处理器暂停,仅通过中断唤醒 (如定时器、外设中断)。
- WFE :支持事件唤醒 (如多核通信中的SEV指令),更适合多核协作场景(如自旋锁优化)。
-
实现方式
- 支持WFE的处理器(如青稞)需通过配置寄存器(如PFIC系统控制寄存器)将WFI切换为WFE行为。
-
应用场景
- WFI适用于单核低功耗待机。
- WFE常用于多核间同步,减少忙等待的功耗。
| 特性 | WFI | WFE |
| 唤醒条件 | 中断/异常 | | 事件(SEV指令或中断,可配置) |
| 多核优化 | 不直接支持核间同步 | 专为多核同步设计(依赖 `SEV`) |
| 功耗管理 | 纯粹低功耗休眠 | 兼顾低功耗与同步效率 |
| 灵活性 | 依赖中断机制 | 可配置是否忽略中断 |
5.注意事项
- WFI 是 RISC-V 标准指令(Base ISA 和特权架构定义)。
- WFE并非标准指令,但在某些扩展(如自定义多核扩展)或厂商实现中可能存在(例如某些高性能核或嵌入式设计)。
- 实现差异:
具体行为(如事件的定义、中断与事件的优先级)可能因微架构不同而有所变化,需参考具体手册(如 SiFive、ARM 兼容扩展等)。
举例:
/*WFE应用场景*/
SYS_DisableAllIrq(&irq_status);//关闭全局中断
LowPower_Sleep(RB_PWR_RAM32K | RB_PWR_RAM96K | RB_PWR_EXTEND);//芯片进入低功耗睡眠模式,停在__WFE()处,即使全局中断处于关闭状态,产生中断也可唤醒芯片,但此时是中断事件唤醒,中断标志会一直存在内核中,等待全局中断恢复即可进入中断服务函数
SYS_RecoverIrq(irq_status);//恢复全局中断后,立即进入中断服务函数
/*WFI应用场景*/
SYS_DisableAllIrq(&irq_status);
.......
SYS_RecoverIrq(irq_status);
LowPower_Sleep(RB_PWR_RAM32K | RB_PWR_RAM96K | RB_PWR_EXTEND);//低功耗睡眠中,如果使用__WFI(),必须在睡眠前恢复全局中断才可唤醒,否则芯片无法醒来

浙公网安备 33010602011771号