arceos-irq 技术文档
路径:
test-suit/arceos/task/irq类型:测试入口 crate 分层:测试层 / ArceOS 任务上下文 IRQ 语义回归 版本:0.1.0文档依据:Cargo.toml、src/main.rs、src/irq.rs、qemu-riscv64.toml
arceos-irq 并不是在测试某个外设中断处理器,而是在测试“任务切换、睡眠、等待队列阻塞前后,IRQ 开关语义是否保持正确”。它把 yield、sleep 和 wait_queue 三条任务路径串起来,在关键点检查中断是否处于预期状态。
需要强调的是:这不是通用中断框架样例,也不是设备驱动模板;它专门验证任务上下文里的 IRQ 使能/关闭语义。
1. 架构设计分析
1.1 子测试划分
main() 依次调用:
test_yielding()test_sleep()test_wait_queue()
也就是说,它不是单点测试,而是把三条最常见的任务状态切换路径都过一遍。
1.2 src/irq.rs 的作用
辅助模块 src/irq.rs 没有注册外设 IRQ handler,而是提供了几个语义检查函数:
assert_irq_enabled()assert_irq_disabled()assert_irq_enabled_and_disabled()disable_irqs()enable_irqs()
这些函数直接读写 ax-hal::asm::{irqs_enabled, disable_irqs, enable_irqs},所以它们观察的是真实的 CPU IRQ 状态,而不是某个模拟标志位。
1.3 三条真实调用链
本 crate 实际上在验证下面三种任务路径:
重点不是中断有没有发生,而是“任务在这些切换后回来时,中断状态是否仍符合预期”。
2. 核心功能说明
2.1 test_yielding()
这个子测试会创建 16 个任务,每个任务反复:
- 断言当前 IRQ 处于开启状态。
- 调用
thread::yield_now()。 - 再次检查“可开可关再恢复”这一基本语义。
它验证的是 cooperative 切换前后,中断状态没有被错误污染。
2.2 test_sleep()
这个子测试验证:
- 主线程睡眠后能恢复
- 后台 tick 线程在系统运行期间持续推进
- 多个子任务多次睡眠后仍能保持正确 IRQ 状态
这部分更接近“timer 驱动的任务阻塞/唤醒路径 IRQ 语义回归”。
2.3 test_wait_queue()
这里直接使用 ax-task::WaitQueue,而不是 AxWaitQueueHandle。它验证:
wait_timeout_untilwait_untilnotify_onenotify_all
在这些阻塞和唤醒点前后,任务仍能安全地观察和切换 IRQ 状态。
2.4 边界澄清
这个 crate 不证明:
- 某个具体设备中断号配置正确
- trap handler 派发性能
- 外设驱动完整可用
它只证明任务相关路径没有把 IRQ 语义搞乱。
3. 依赖关系图谱
3.1 直接依赖
ax-std(multitask, irq):启用多任务与中断相关路径。
3.2 关键间接依赖
ax-task:任务切换、睡眠和等待队列的真实实现。ax-hal::asm:读取和切换当前 CPU 的 IRQ 状态。
3.3 主要消费者
cargo arceos test qemu自动回归。ax-task、IRQ 相关上下文切换逻辑改动后的定向验证。