平台抽象层
RT-Async 通过 platform-traits 定义 Chip trait,将平台相关操作抽象为统一接口。
Chip Trait
rust
pub trait Chip {
fn shutdown() -> !;
fn put_str(s: &str);
unsafe fn pend();
unsafe fn clear_pend();
}| 方法 | 说明 |
|---|---|
shutdown() | 关机(成功退出) |
put_str(s) | 串口输出 |
pend() | 触发调度器软件中断 |
clear_pend() | 清除软件中断挂起标志 |
平台模块结构
platform/
├── lib.rs # 公共接口:init()、pend()、clear_pend()、PEND_MARKER
├── logger.rs # 基于 Chip::put_str 的 log 实现
└── chips/
├── std-chip/ # 标准库环境(测试用)
└── qemu-virt/ # RISC-V QEMU virt 平台platform 模块公共接口
rust
// 初始化(logger + 平台)
pub fn init();
// 使能 MSI + 开全局中断(仅 qemu-virt feature)
pub unsafe fn start();
// 调度器 pend 标记
pub static PEND_MARKER: AtomicBool;
// 触发调度器软件中断(设置 PEND_MARKER 后调用 Chip::pend)
pub unsafe fn pend();
// 清除 pend 标志,返回 PEND_MARKER 先前值(区分调度/外部 MSI)
pub unsafe fn clear_pend() -> bool;TimerChip Trait
TimerChip 在 platform-traits::timer 模块中定义,提供平台无关的定时器抽象。FREQ_HZ 作为 const generic 参数编码 tick 频率,可直接与 fugit 的 Duration<u64, 1, FREQ_HZ> / Instant<u64, 1, FREQ_HZ> 类型对齐。
rust
pub trait TimerChip<const FREQ_HZ: u32> {
fn now_ticks() -> u64;
fn set_deadline(tick: u64);
unsafe fn enable_irq();
}| 方法 | 说明 |
|---|---|
now_ticks() | 读取当前 tick 计数(单调递增) |
set_deadline(tick) | 设定绝对 deadline,now_ticks() >= tick 时触发中断;传 u64::MAX 表示无 deadline |
enable_irq() | 使能定时器中断源,初始化时调用一次 |
设计说明
- 绝对 deadline 语义:executor 的 timer queue 内部存储绝对 deadline,调用
set_deadline时零转换。 - ARM 兼容:ARM 实现内部维护软件 64-bit tick 计数器,将绝对 deadline 转为相对 reload 值并处理 24-bit SysTick 限制。
- fugit 集成:
Duration<u64, 1, FREQ_HZ>的 tick 单位与now_ticks()/set_deadline()完全一致。
现有实现
StdChip(std feature)
用于在标准库环境下测试。pend() / clear_pend() 为空操作,shutdown() 调用 std::process::exit(0)。
QemuVirt(qemu-virt feature)
针对 QEMU virt 机器的 RISC-V 实现,直接操作 CLINT 寄存器触发/清除 MSI。同时实现了 TimerChip<10_000_000>(10 MHz),基于 CLINT mtime / mtimecmp 寄存器,通过 riscv crate 操作 mie.MTIE。
移植指南
为新的 SoC/板卡添加支持:
- 创建新的 chip crate(如
chips/my-board/) - 实现
Chiptrait - 实现
TimerChip<FREQ_HZ>trait(FREQ_HZ为硬件定时器频率) - 在
platform/lib.rs中添加 feature gate 指向新实现 - 提供
arch模块(中断使能/禁用、TrapFrame 定义、idle 等)