1、WFI指令
- 在嵌入式设备中(特别是使用电池作为电源的小型嵌入式),低功耗是一个十分重要的性能指标,可以延长设备的待机时间。当设备没有任务需要处理时通过执行WFI指令进入低功耗模式,当有中断触发(也就是有任务要处理)重新开始执行代码
- WFI指令是RISC-V低功耗管理的关键工具,通过暂停处理器并等待中断唤醒,有效降低功耗,适用于空闲任务和低功耗应用场景
2、WFI指令的行为
- 执行WFI后,处理器停止执行后续指令,进入空闲状态,等待中断来唤醒处理器
- 中断的唤醒条件和唤醒后PC跳转位置和具体的平台实现有关,下面第三点和第四点仅供参考
3、低功耗状态唤醒条件
- 不可屏蔽中断(NMI:non-mask Interrupt)、debug中断无条件唤醒
- mie寄存器中屏蔽的中断无法唤醒
- 全局中断启用位(mstatus.MIE)不管是关闭还是开启,中断发生都可以唤醒
4、唤醒后恢复PC
- NMI中断唤醒时PC跳转到复位的入口处开始执行
- debug中断唤醒从芯片内置的调试代码入口处开始执行
- 当core被挂起的中断唤醒并且mstatus.MIE开启时,PC从mtvec.BASE开始执行(也就是异常的入口)
- 当core被挂起的中断唤醒并且mstatus.MIE关闭时,PC从WFI指令的下一条指令开始执行
5、WFI、NOP、软件空闲的区别
- WFI指令:处理器进入低功耗状态,大部分硬件都不工作(处理器不执行指令),用于节能场景
- NOP指令:就是一条普通的指令,但是没有实际作用,相当于处理器在空转(可以用于延时),但是功耗并没有降低
- 软件空闲:软件实现也有空闲的概念(比如idle进程),当没有任务需要处理时,软件会运行一些代码不让处理器跑飞,实际也是执行指令,功耗并没有降低