第十八周工作总结
概述
本周主要进行 embassy_preempt 的性能测试,重点测试了上下文切换延迟和远程函数调用(RPC)延迟。
测试环境
- 硬件平台:VisionFive2 JH7110
- CPU频率:1 GHz
- 架构:RISC-V 64位
- 特权级:Machine Mode (M态)
- 测试方法:GPIO翻转 + 逻辑分析仪测量
核心测试结果
1. 上下文切换测试
测试结果
| 测试项 | 延迟 |
|---|---|
__ContextSwitchHandler(不释放栈) | ~700 ns |
__ContextSwitchHandler(释放栈) | ~900 ns |
| await 系列 API(调用到让权) | ~800 ns |
| 完整上下文切换 | 1253 ~ 1464 ns |
测试方法
使用 GPIO 翻转标记关键时间点:
- GPIO 39:
__ContextSwitchHandler入口 - GPIO 40:
__ContextSwitchHandler出口
核心代码
__ContextSwitchHandler 实现:[os_cpu.rs:30-79]
rust
extern "C" fn __ContextSwitchHandler(trap_frame: *mut TrapFrame) -> *mut TrapFrame {
// 优先级检查
if prio_highrdy == prio_cur {
return trap_frame;
}
// 栈交换
let stk_ptr = global_executor.OSTCBHighRdy.get_mut().take_stk();
let mut old_stk = get_program_stack().swap(stk_ptr);
// ...
}Trap 入口(寄存器保存):[trap/mod.rs]
2. RPC 延迟测试
测试结果
| 测试项 | 延迟 |
|---|---|
| IPI 中断 → 函数开始处理 | 3.585 ~ 4.669 μs |
| 目标指标 | < 5 μs ✅ |
处理流程
MSIP 中断 → 汇编入口保存寄存器 → trap_handler
→ dispatch_interrupt(M_SOFT) → ipi_callback
→ IPI_WAIT_LIST.wake_all() → IntCtxSW()