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

RISC-V WFI 指令详解

指令手册I-type

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

指令语法

wfi
操作数说明
无显式操作数;32 位 SYSTEM 编码 0x10500073,rs1/rd=00000、funct3=000。
特权模式可用;U-mode 支持可选,TW 与实现 S-mode 时的有界时间规则仍适用。
实现可停顿或当作 NOP;正常等待路径必须因本地使能的挂起中断恢复,不受全局使能与委托影响。
恢复不一定进入陷阱;未陷入时从 PC+4 继续,软件必须重新检查条件。H 下 VTW 等规则另适用。
Privileged系统与特权

扩展条件:所有已实现的特权模式可用;U-mode 支持可选,并受 TW 和实现 S-mode 时的有界时间规则约束;H 下另有 VTW 规则。

指令行为说明

WFI 通知实现当前 hart 可暂停,直到可能需要处理中断;实现也可以把它当作 NOP。正常等待路径必须因本地使能的挂起中断而恢复,不受全局中断使能或 mideleg 影响;恢复不等于一定进入中断陷阱。如果停顿期间出现可投递的使能中断,陷阱在下一条指令处发生;若恢复事件不导致陷阱,则从 WFI 的 PC+4 继续,软件必须重新检查条件。TW=1 时,低于 M 的 WFI 若未在实现特定有界时间内完成,必须触发非法指令异常;实现也可选择总是立即陷入。实现 S-mode 时,U-mode 无论 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
must resume; interrupt trap only if deliverable

动画按 V=0 展示;无 S-mode 时假定实现支持 U-mode WFI,不模拟 H/VTW。结果栏展示所选条件的可能路径,不表示已提交状态;TW 有界时间超限必须异常。该动画不承诺睡眠时长、功耗下降、唤醒延迟或调度策略;这些不是 WFI 的可移植 ISA 语义。

快速理解与检索要点

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

SYSTEM 编码中 funct12=000100000101,rs1=x0、rd=x0、funct3=000。
实现可因任意原因恢复执行,也可把 WFI 当作 NOP;规范不承诺睡眠时长或功耗效果。
正常等待路径必须因本地使能的挂起中断恢复;TW=1 的低特权级及实现 S-mode 时的 U-mode,若未在实现特定有界时间内完成则必须触发非法指令异常。

常见使用场景

空闲循环节能

V=0、M-mode、无可投递中断,PC=0x2000:若实现选择 NOP 路径,wfi 从 0x2004 继续;软件仍需重新检查等待条件,不能据此推断睡眠或节能。

低功耗等待

V=0、M-mode、无可投递中断,PC=0x2000:若实现选择 NOP 路径,wfi 从 0x2004 继续;软件仍需重新检查等待条件,不能据此推断睡眠或节能。

使用前检查清单

语法检查
  • 无显式操作数;32 位 SYSTEM 编码 0x10500073,rs1/rd=00000、funct3=000。
  • 特权模式可用;U-mode 支持可选,TW 与实现 S-mode 时的有界时间规则仍适用。
语义检查
  • 实现可停顿或当作 NOP;正常等待路径必须因本地使能的挂起中断恢复,不受全局使能与委托影响。
  • 恢复不一定进入陷阱;未陷入时从 PC+4 继续,软件必须重新检查条件。H 下 VTW 等规则另适用。

容易混淆 / 常见误区

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

常见问题

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

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

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

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