第十三周工作总结
第一部分:JH7110 平台时钟驱动中断处理优化
本周首先完成了 JH7110 平台的时钟驱动中断处理的重要修复工作,为后续的性能测试奠定了基础。
问题描述
在之前的实现中,JH7110 平台存在两个问题:
- 中断管理重置问题:riscv_rt的中断管理不能很好兼容embassy_preempt上下文切换的方式
- 时钟驱动中断处理缺失:没有正确实现机器时钟中断的处理逻辑
为了能够完整测试embassy_preempt在jh7110上的性能,修复了这个两个问题
解决方案
1. 中断管理初始化
在 platform.rs 中添加了 RISC-V 中断管理初始化:
rust
unsafe {
riscv::register::mstatus::set_mie(); // 启用机器中断
extern "C" {
fn __trap_entry();
}
riscv::register::mtvec::write(
Mtvec::new(__trap_entry as usize, TrapMode::Direct)
);
}然后用汇编实现了零栈开销的ecall处理路径,覆盖了riscv_rt的中断管理策略
2. 机器时钟中断处理
在 timer_driver.rs 中实现了完整的时钟中断处理:
中断处理函数:
rust
unsafe fn on_interrupt(&self) {
critical_section::with(|cs| {
if mip::read().mtimer() { // 检查机器定时器中断
self.set_mtimecmp(u64::MAX); // 清除中断
// 触发 alarm 回调
for n in 0..ALARM_COUNT {
let alarm = &self.alarms.borrow(cs)[n];
let timestamp = alarm.timestamp.get();
let current_time = self.now();
if timestamp <= current_time && timestamp != u64::MAX {
self.trigger_alarm(n, cs); // 触发超时回调
}
}
}
});
}第二部分:Embassy Preempt RTOS 性能基准测试
本周完成了 Embassy Preempt RTOS 在 StarFive JH7110 平台上的性能基准测试
工作目的
为了量化 Embassy Preempt RTOS 的实时性能,需要设计并实现性能基准测试程序,测量:
- 任务创建延迟
- 任务切换延迟
- 中断响应延迟
这些指标是评估 RTOS 实时性能的关键参数。
测试结果
测试环境
| 项目 | 规格 |
|---|---|
| 硬件平台 | StarFive JH7110 (VisionFive2) |
| CPU | RISC-V U74 @ 1 GHz |
| 定时器 | CLINT mtime @ 4 MHz |
| 测量方法 | CPU 指令计数 |
性能指标
1. 任务创建延迟
| 指标 | 数值 |
|---|---|
| CPU 循环次数 | 400 - 500 条指令 |
| 执行时间 | 400 - 500 ns |
| 平均延迟 | 457 ns |
从 SyncOSTaskCreate() 调用到任务首次执行的时间开销。
2. 中断响应延迟
| 指标 | 数值 |
|---|---|
| CPU 循环次数 | 400 - 800 条指令 |
| 执行时间 | 400 - 800 ns |
| 平均延迟 | 633 ns |
从硬件中断触发到最高优先级中断处理程序开始执行的时间。
测量方法说明
测量原理:
- 通过观察 CPU 执行的循环次数(CPU cycles)来计算延迟
- 使用 CPU 频率(1 GHz = 1,000,000,000 Hz)将循环次数转换为时间
- 公式:
执行时间(ns) = CPU 循环次数 / CPU 频率(Hz) × 10^9
示例计算:
- 450 条指令 @ 1GHz CPU = 450 / 1,000,000,000 × 10^9 = 450 ns
数据可靠性:
- ✅ Embassy Preempt 数据:实际测试获得,高度可靠
- ⚠️ 对比系统数据:来源于公开文档和学术资源,仅供参考
- ⚠️ 跨架构比较:RISC-V vs ARM,不同 CPU 微架构会影响实际性能
📈 性能对比
说明:以下数据来源于公开文档、学术资源和实际测试,不同 CPU 架构和频率会影响实际性能,对比仅供参考。
| RTOS / 系统 | 平台 | CPU 频率 | 任务创建/调度延迟 | 中断响应延迟 | 数据来源 |
|---|---|---|---|---|---|
| Embassy Preempt | RISC-V JH7110 | 1 GHz | 457 ns | 633 ns | 实际测试 |
| Embassy Preempt | ARM STM32F401RE | 84 MHz | 10.13 μs | - | 实际测试 |
| FreeRTOS | ARM Cortex-M3 | 72 MHz | ~12 μs | - | FreeRTOS FAQ |
| FreeRTOS | RISC-V HiFive1 | 320 MHz | ~1.8 μs | - | SiFive HiFive1 Benchmark |
| Zephyr | ARM Cortex-M | 64 MHz | ~8 μs | - | Zephyr Benchmark Docs |
| ThreadX | ARM Cortex-M4 | 120 MHz | ~3 μs | - | Microsoft Azure RTOS |
| Linux (PREEMPT_RT) | x86_64 | 3 GHz | - | 7-50 μs | Realtime Linux Wiki |