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

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

相关推荐
思尔芯S2C3 天前
FPGA原型验证实战:如何应对外设连接问题
fpga开发·risc-v·soc设计·prototyping·原型验证
加强洁西卡3 天前
【RISC-V】从C到可执行文件分析链接重定位的过程
c语言·开发语言·risc-v
硬汉嵌入式3 天前
基于Rust构建的单片机Ariel RTOS,支持Cortex-M、RISC-V 和 Xtensa
单片机·rust·risc-v
MounRiver_Studio3 天前
RISC-V IDE MRS2进阶分享(三):MRS语言服务器
ide·mcu·risc-v·嵌入式开发
加强洁西卡3 天前
【RISC-V】解决链接器加入全局变量优化后操作系统无法启动的问题
risc-v
MounRiver_Studio3 天前
RISC-V IDE MRS2进阶分享(四):CH32H417双核芯片项目开发
ide·mcu·risc-v·嵌入式开发
加强洁西卡3 天前
【RISC-V】区分加载地址、链接地址、运行地址
risc-v
飞凌嵌入式4 天前
1块集成了4核Cortex-A7高性能CPU、1颗RISC-V MCU、多种高速总线、还兼容树莓派的T153低成本开发板
linux·arm开发·嵌入式硬件·risc-v
加强洁西卡5 天前
【RISC-V】riscv64-linux-gnu工具链都有哪些工具
linux·gnu·risc-v
jerwey5 天前
RISC-V VP 中 TLM 精度
risc-v