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

RISC-V WFI 指令详解

指令手册I-type

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

指令语法

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

指令行为说明

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

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 semantics
wait
implementation may stall the hart
resume
local enabled interrupt pending -> resume
next
resume; trap may be taken on a following instruction

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

快速理解与检索要点

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

SYSTEM 编码中 funct12=000100000101,rs1=x0、rd=x0、funct3=000。
实现可因任意原因恢复执行,也可把 WFI 当作 NOP;规范不承诺睡眠时长或功耗效果。
本地使能中断挂起可让 WFI 恢复;mstatus.TW 可限制较低特权级 WFI;实现 S-mode 时,U-mode 的单独有界时间规则同样可导致非法指令异常。

常见使用场景

空闲循环节能

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

低功耗等待

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

使用前检查清单

语法检查
  • 确认立即数字段在有效范围内。
  • 确认源寄存器 rs1 指向正确的操作数。
语义检查
  • 确认立即数符号扩展是否符合预期。
  • 确认结果寄存器 rd 的用途是否明确。

容易混淆 / 常见误区

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

常见问题

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

不会。WFI 不是 HINT 指令,但官方语义仍允许实现暂停,也允许合法地把它当作 NOP 继续执行。

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

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