第二十三周工作总结
概述
本周在上周核心调度器的基础上,完成了 平台抽象层、过程宏、集成测试体系 和 技术文档 四个方面的构建。rt-async 从原型阶段进入可测试、可文档化的阶段。
核心工作
1. Chip trait 平台抽象
提交:aa7b5cb — 2026-05-05
新建 modules/platform-traits/ crate,定义 Chip trait:
pub trait Chip {
fn shutdown() -> !;
fn put_str(s: &str);
unsafe fn pend();
unsafe fn clear_pend();
}实现两个后端:
- StdChip(
std-chip)— 标准库环境,pend 为空操作,shutdown 调用exit(0) - QemuVirt(
qemu-virt)— RISC-V QEMU virt,直接操作 CLINT 寄存器
平台抽象层的设计与移植指南详见技术文档「平台抽象层」。
2. Executor 与 Platform 解耦
提交:17ae7e7 0a37780 96b91ea — 2026-05-07
核心架构调整:
- pend 回调注入:
Spawner不再依赖具体 platform crate,改为接受unsafe fn()回调。init(pend)时注入平台实现,实现 executor 与 platform 的完全解耦 - critical-section 后端下移:从 platform crate 移至 riscv64-rt 运行时,隐藏内部符号,确保
#![no_std]环境正确链接 - std-chip 独立:std 测试后端从 qemu-virt 依赖中拆分为独立 chip crate
3. #[task] 宏与示例应用
提交:563f614 dfcad47 f559ada — 2026-05-07 ~ 05-08
- 添加
#[task]过程宏,将async fn转换为返回SpawnToken的可 spawn 函数 - 新增
apps/demo/示例应用(async_fn、async_fn_macro、manual_future、preempt_test),收紧 executor 公开 API Spawner实现Synctrait,抢占测试验证了多优先级嵌套抢占的正确性
过程宏的完整设计详见技术文档「过程宏」。
4. #[main] / #[interrupt] 宏与 PEND_MARKER
提交:d6ceffe — 2026-05-09
executor-macro crate 新增两个关键宏:
- #[main] — 自动生成
__rust_main入口和MachineSoftISR。ISR 内部通过PEND_MARKER(AtomicBool)区分调度器触发的 MSI 与外部 MSI,调度器 MSI 进入优先级抢占循环,外部 MSI 转发到__Inner_MachineSoft - #[interrupt] — 标记中断处理函数,
MachineSoft自动重写为__Inner_MachineSoft避免符号冲突
Pend ISR 的完整调度循环与嵌套抢占机制详见技术文档「Pend ISR 调度循环」。
5. 集成测试体系
提交:84c5d12 0c1823d 8a6d12f — 2026-05-09
新建 apps/test/ crate,添加 QEMU 运行的集成测试:
| 测试 | 验证内容 |
|---|---|
smoke | 单任务 spawn → 执行 → 退出 |
single_task | 单任务完整生命周期 |
fifo_same_prio | 同优先级任务 FIFO 顺序执行 |
yield_interleave | .await 让权交替执行 |
preempt_spawn | spawn 触发抢占 |
nested_preempt | 多级嵌套抢占(C 抢占 B 抢占 A) |
priority_order | 优先级从高到低执行顺序 |
preempt_spawn_chain | spawn 链式抢占 |
新增 Makefile 支持批量运行所有测试,make test 一键验证。
6. TimerChip trait 与定时器测试
提交:7ad4b5d — 2026-05-10
在 platform-traits::timer 模块中新增 TimerChip<FREQ_HZ> trait:
pub trait TimerChip<const FREQ_HZ: u32> {
fn now_ticks() -> u64;
fn set_deadline(tick: u64);
unsafe fn enable_irq();
}采用绝对 deadline 语义,executor 的 timer queue 内部零转换调用 set_deadline。const generic FREQ_HZ 可直接与 fugit 的 Duration / Instant 类型对齐。
QemuVirt 实现了 TimerChip<10_000_000>(10 MHz),基于 CLINT mtime / mtimecmp 寄存器。新增 timer 集成测试验证定时器精度。
TimerChip 的设计说明与 ARM 兼容方案详见技术文档「平台抽象层 — TimerChip」。
7. VitePress 博客站点
提交:21135d4 — 2026-05-10
新建 VitePress 博客站点(blogs/),整理了 rt-async 的完整技术文档:
- 文档:架构概览、调度器设计、共享系统栈、Pend ISR 调度循环、平台抽象层、过程宏
- 历史文档:从 embassy_preempt 阶段迁移的上下文切换架构、多系统间通讯等归档文档
- 自动侧边栏:使用
vitepress-sidebar插件按日期倒序自动生成
模块结构(当前)
rt-async/
├── modules/
│ ├── executor/ # 核心调度器
│ ├── executor-macro/ # 过程宏(#[task]、#[main]、#[interrupt])
│ ├── platform/ # 平台实现(riscv64-rt、std-chip、qemu-virt)
│ └── platform-traits/ # Chip / TimerChip trait 定义
├── apps/
│ ├── demo/ # 示例程序
│ └── test/ # 集成测试(9 个 QEMU 测试用例)
└── blogs/ # VitePress 技术文档站点