Skip to content

平台抽象层

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

TimerChipplatform-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/板卡添加支持:

  1. 创建新的 chip crate(如 chips/my-board/
  2. 实现 Chip trait
  3. 实现 TimerChip<FREQ_HZ> trait(FREQ_HZ 为硬件定时器频率)
  4. platform/lib.rs 中添加 feature gate 指向新实现
  5. 提供 arch 模块(中断使能/禁用、TrapFrame 定义、idle 等)