Skip to content

注意:本文档描述的是前身项目 Embassy Preempt 的上下文切换设计。RT-Async 已采用共享系统栈方案,executor 切换不再需要独立的上下文保存/恢复。当前设计请参考 Pend ISR 调度循环

Embassy Preempt 上下文切换架构设计

核心设计原则

所有平台的寄存器保存都在进入__ContextSwitchHandler函数中通过save_task_context()统一完成

架构流程图

详细时序图

关键设计正确性验证

1. 统一的入口点

rust
// 两个平台最终都进入相同的函数
#[unsafe(no_mangle)]
extern "C" fn __ContextSwitchHandler() {
    // 1. 统一调用平台相关的上下文保存
    unsafe {
        embassy_preempt_platform::PlatformImpl::save_task_context();
    }

    // 2. 执行平台无关的调度逻辑
    let global_executor = GlobalSyncExecutor().as_ref().unwrap();
    // ... 调度算法
}

2. RISC-V异常入口的最小化设计

assembly
# 正确:只做栈切换,不保存寄存器
MachineEnvCall:
    csrrw sp, mscratch, sp    # 仅切换栈指针
    j __ContextSwitchHandler # 跳转到统一处理函数

3. ARM和RISC-V的一致性保证

  • ARM: PendSV + 部分硬件保存 + save_task_context()补全
  • RISC-V: ecall + 栈切换 + save_task_context()完整保存
  • 结果: 两个平台都以相同状态进入调度器