Skip to content

第二十三周工作总结

概述

本周在上周核心调度器的基础上,完成了 平台抽象层过程宏集成测试体系技术文档 四个方面的构建。rt-async 从原型阶段进入可测试、可文档化的阶段。

核心工作

1. Chip trait 平台抽象

提交aa7b5cb — 2026-05-05

新建 modules/platform-traits/ crate,定义 Chip trait:

rust
pub trait Chip {
    fn shutdown() -> !;
    fn put_str(s: &str);
    unsafe fn pend();
    unsafe fn clear_pend();
}

实现两个后端:

  • StdChipstd-chip)— 标准库环境,pend 为空操作,shutdown 调用 exit(0)
  • QemuVirtqemu-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_fnasync_fn_macromanual_futurepreempt_test),收紧 executor 公开 API
  • Spawner 实现 Sync trait,抢占测试验证了多优先级嵌套抢占的正确性

过程宏的完整设计详见技术文档「过程宏」。

4. #[main] / #[interrupt] 宏与 PEND_MARKER

提交d6ceffe — 2026-05-09

executor-macro crate 新增两个关键宏:

  • #[main] — 自动生成 __rust_main 入口和 MachineSoft ISR。ISR 内部通过 PEND_MARKERAtomicBool)区分调度器触发的 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_spawnspawn 触发抢占
nested_preempt多级嵌套抢占(C 抢占 B 抢占 A)
priority_order优先级从高到低执行顺序
preempt_spawn_chainspawn 链式抢占

新增 Makefile 支持批量运行所有测试,make test 一键验证。

6. TimerChip trait 与定时器测试

提交7ad4b5d — 2026-05-10

platform-traits::timer 模块中新增 TimerChip<FREQ_HZ> trait:

rust
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 技术文档站点