首页/指令库/等待中断
WFI

RISC-V WFI 指令详解

指令手册I-type

等待中断提示:实现可暂停 hart,直到可能需要处理中断;也可合法地不暂停并像 NOP 一样继续。

指令语法

wfi
操作数说明
目标寄存器 rd:存放运算结果的通用寄存器。
源寄存器 rs1:第一个操作数所在的寄存器。
立即数 imm:12 位有符号立即数,符号扩展后与 rs1 进行运算。
Privileged系统与特权

指令行为说明

WFI 通知实现当前 hart 可暂停,直到可能需要处理中断。它是提示而不是低功耗保证:实现可以不暂停并把 WFI 当作 NOP 返回。若本地使能的中断已经挂起或之后挂起,WFI 可恢复,相关中断陷阱在后续指令边界发生。特权规范还定义了 mstatus.TW 对较低特权级 WFI 的限制:实现可在特定有界时间后触发非法指令异常,也可选择总是立即陷入。

WFI 指令解析与等待提示动画

展示 SYSTEM 固定编码、TW 限制,以及 WFI 可暂停也可像 NOP 返回的 ISA 可见语义。

无显式操作数
wfiwfi
31..20
19..15
14..12
11..7
6..0
000100000101
funct12
00000
rs1=x0
000
funct3
00000
rd=x0
1110011
SYSTEM
等待提示状态
instruction
0x10500073
opcode
1110011 -> SYSTEM
funct3
000 -> privileged non-CSR form
fixed
funct12=000100000101, rs1=x0, rd=x0
permission
M-mode example may reach WFI semantic
wait hint
implementation may stall the hart
resume
local enabled interrupt pending -> resume
next
resume; trap may be taken on a following instruction

该动画不承诺睡眠时长、功耗下降、唤醒延迟或调度策略;这些不是 WFI 的可移植 ISA 语义。

快速理解与检索要点

WFI 的重点是“等待提示”而不是“必然睡眠”。它没有显式操作数,编码固定;执行后可能暂停 hart,也可能马上像 NOP 一样继续。可移植软件必须在 WFI 返回后重新检查等待条件。

SYSTEM 编码中 funct12=000100000101,rs1=x0、rd=x0、funct3=000。
实现可因任意原因恢复执行,也可把 WFI 当作 NOP;规范不承诺睡眠时长或功耗效果。
本地使能中断挂起可让 WFI 恢复;mstatus.TW 可限制较低特权级 WFI,并允许非法指令异常路径。

常见使用场景

空闲循环节能

结合 «wfi # Wait for interrupt» 等实际代码理解该场景。

低功耗等待

结合 «wfi # Wait for interrupt» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认当前指令格式为 I-type。
  • 确认操作数排列顺序与示例一致。
语义检查
  • 确认目标寄存器用途和调用约定兼容。
  • 确认该指令不是伪指令展开后的底层形式。

容易混淆 / 常见误区

WFI 是提示;实现可以不阻塞并按 NOP 返回。
不要把 WFI 当成固定延迟、功耗保证或调度原语。
即使全局中断使能位关闭,WFI 也可因本地使能的挂起中断而恢复。
若 mstatus.TW=1,较低特权级 WFI 可能在实现特定有界时间后触发非法指令异常,也可能被实现为总是立即陷入。
若恢复事件未导致陷阱,执行从 WFI 后的指令继续,软件通常需要重新检查条件并循环。

常见问题

WFI 一定会让处理器进入低功耗睡眠吗?

不会。官方语义把 WFI 定义为等待中断提示;实现可以暂停,也可以合法地把它当作 NOP 继续执行。

WFI 返回后软件应该怎么做?

软件应重新检查等待条件或挂起状态,因为 WFI 可因任意原因恢复,恢复本身不保证目标事件已经完成处理。