RISC-V 中的 Wait For Interrupt 指令 (wfi) 详解

RISC-V 中的 Wait For Interrupt 指令 (wfi)

Note:

以下内容主要来自 RISC-V 特权手册相关部分

------→ 后一些个人注解,使得原文的含义更容易理解

希望对你有所帮助

wfi 详细内容

Wait for Interrupt(WFI)指令通知硬件可以暂停当前的 hart,直到有中断需要服务 。[执行 WFI 指令也可以用于通知硬件平台,适当的中断应该优先路由到这个 hart]。WFI 在所有特权模式下都可用,并且可选地对 U-mode 可用

------→ WFI 可以认为就是低功耗设计,让 hart 在等待的时候可以进入低功耗状态

mstatus 中的 TW=1 时,执行此指令可能会引发非法指令异常,具体描述见特权手册 3.1.6.6 节中关于 TW 位的描述。

------→ 这意味着高特权级有办法捕捉低特权级的 WFI 指令,比如 VM 的 wfi 可以被 Hypervisor 捕捉

如果一个已使能的中断存在,或者在 hart 被暂停时变为存在,下一条指令将会触发中断陷阱,即执行将从中断处理程序继续,且 mepc = pc + 4

下一条指令会触发中断陷阱,以便从中断处理程序返回时,能够执行 WFI 指令之后的代码。

------→ 也就是说执行 wfi 之后,接收到到中断信号唤醒后先处理中断,返回到 wfi 的下一条指令继续执行

实现允许在任何情况下恢复执行,即使一个已使能的中断尚未变为挂起。因此,一个合法的实现是将 WFI 指令简单地实现为一个 NOP(无操作)

如果实现没有在执行该指令时暂停 hart,那么中断将在包含 wfi 的空闲循环中的某条指令上被触发,且从处理程序简单返回后,空闲循环将继续执行。

------→ 也就是说 wfi 是可以实现为 nop,一个空操作,即什么也不做,对软件是不可见的

------→ 软件往往会写 loop { wfi, ... } ,不管 wfi 指令的实现是否真的会让 hart 暂停

WFI 指令在中断被禁用时也可以执行 。WFI 的操作必须不受 mstatus 中全局中断位(MIE 和 SIE)和委托寄存器 mideleg 的影响 (即,如果一个 locally enabled 的中断变为挂起,hart 必须恢复执行,即使该中断已被委托给低权限模式),但应该遵循特定中断使能(例如,MTIE)的设置(即,如果中断挂起但未特定使能,实施应避免恢复 hart)。

WFI 还要求无论在任何权限级别,locally enabled 的挂起中断都能使 hart 恢复执行,忽略每个权限级别的全局中断使能。

------→ 如何理解 locally enabled 的中断?我个人理解是执行 wfi 时的特权级,对应寄存器 mie/sie/vsie,只要这里的寄存器使能,比如,mie.MTIE 使能,其他中断未使能,当前 wfi 在 M-mode 执行,那么只有 machine interrupt 能够让这个 hart resume。

如果导致 hart 恢复执行的事件没有触发中断,执行将从 pc + 4 处恢复,且软件必须决定采取何种操作,包括在没有可处理事件的情况下循环回去重新执行 WFI。

------→ 这也就意味着,软件需要检查中断信息是否是自己需要的,不是则需要循环回去,继续执行 wfi,比如 hart 恢复的事件是一个软件中断,如果一个其他中断唤醒了 hart,可以处理一下该中断,当没有可处理事件,继续执行 wfi,直到收到想要的软件中断,可以跳出包含 wfi 的循环

通过允许在禁用中断时唤醒,可以调用一个备用的中断处理程序入口点,该入口点不需要保存当前上下文,因为当前上下文可以在执行 WFI 之前保存或丢弃。

------→ 这句话我不是很确定,应该是看具体的硬件设计?和上面的一般情况不同。

由于实现可以将 WFI 实现为 NOP,软件必须在 WFI 后的代码中显式检查任何相关的挂起但被禁用的中断,并且如果没有检测到合适的中断,应当循环回 WFI。可以通过查询 mipsip 寄存器来确定在机器模式或监督模式下是否存在任何中断。

------→ 这句话应该是和上面那句搭配的,对于允许禁用中断唤醒的情况,这种情况下硬件不会触发,需要软件显示检查

WFI 的操作不受委托寄存器设置的影响。

WFI 的定义使得实现可以在遇到 WFI 时立即或经过一段时间进入更高权限模式,例如启动一个机器模式过渡到低功耗状态。

相同的 "wait-for-event" 模板也可能会用于未来的扩展,例如等待内存位置变化或消息到达。

RISC-V wfi 指令总结

  • WFI 在所有特权模式下都可用
  • 一个合法的实现是将 WFI 指令简单地实现为一个 NOP(无操作)
  • WFI 不受 mstatus 中全局中断位(MIE 和 SIE)和委托寄存器 mideleg 的影响由特定中断使能,比如 mie.MTIE

其中最后一条应该是操作系统程序员比较关心的

相关推荐
国科安芯13 天前
前沿探索:RISC-V 架构 MCU 在航天级辐射环境下的可靠性测试
网络·单片机·嵌入式硬件·fpga开发·硬件架构·risc-v
longxiangam14 天前
墨水屏程序
单片机·嵌入式硬件·rust·risc-v
咕咚.萌西15 天前
RISC-V体系架构
嵌入式硬件·架构·risc-v
咕咚.萌西15 天前
RISC-V开发环境搭建
linux·硬件架构·risc-v
OpenAnolis小助手20 天前
睿思芯科正式加入龙蜥社区,携手共建 RISC-V 服务器生态新标杆
操作系统·龙蜥社区·risc-v·龙蜥生态
芯有所享1 个月前
【ARM vs RISC-V:芯片架构双雄争霸,谁将主宰AI时代?】
arm开发·人工智能·risc-v
ChipCamp1 个月前
ChipCamp探索系列 -- 1. Soft-Core RISC-V on FPGA
fpga开发·verilog·risc-v
ChipCamp2 个月前
Chisel芯片开发入门系列 -- 18. CPU芯片开发和解释8(流水线架构的代码级理解)
开发语言·青少年编程·fpga开发·scala·dsp开发·risc-v·chisel
思尔芯S2C2 个月前
Cost-Effective and Scalable: A Smarter Choice for RISC-V Development
fpga开发·risc-v·soc设计·prototyping