Embassy Preempt RTOS - 2026年2月技术报告
一、概述
2026年2月,完成了JH7110(VisionFive 2)平台的中断管理、日志系统完善以及性能基准测试。
二、主要工作内容
2.1 内存管理优化(第十一周)
问题诊断
- 发现原有内存地址(0x80400000)与OpenSBI/U-Boot存在内存冲突
- 导致hart1(运行OpenSBI)报错崩溃
- 定位到VisionFive 2启动流程的内存布局冲突问题
解决方案
- 分析JH7110启动阶段的内存分配
- 调整内存布局到合法地址空间
- 在各系统间设立专用内存区域,防止相互踩踏
2.2 UART日志驱动实现(第十二周)
实现目标
- 为
embassy-preempt-log添加除defmt-rtt外的第二个输出后端 - 实现运行时日志的串口输出
- 为后续系统测试提供日志支持
技术实现
实现了基于uart16550的串口驱动,为JH7110平台配置了双串口方案:
- UART0 (0x10010000): 用于embassy_preempt的日志输出
- UART1 (0x10011000): 保留给U-Boot及后续Linux系统使用
这种配置使得embassy_preempt的运行日志可以独立输出,不会与U-Boot/Linux的console输出混在一起,便于调试和问题追踪。
通过添加log-uart feature flag,可以灵活选择日志输出后端(defmt-rtt或UART)。
2.3 中断与时钟优化(第十三周)
问题
- riscv_rt的中断管理与embassy_preempt上下文切换不兼容
- 缺少机器时钟中断处理逻辑
解决方案
中断管理初始化
- 在platform初始化时启用RISC-V机器中断
- 设置中断向量表入口地址
零栈开销ecall处理
- 使用汇编实现,覆盖riscv_rt中断管理策略
- 避免上下文切换时的栈冲突问题
时钟中断处理
- 实现完整的机器时钟中断处理函数
- 支持多路alarm定时器触发
- 在中断中检查并触发超时的alarm回调
2.4 性能基准测试(第十三周)
测试目的 量化RTOS实时性能关键指标:
- 任务创建延迟
- 任务切换延迟
- 中断响应延迟
测试环境
| 项目 | 规格 |
|---|---|
| 硬件平台 | StarFive JH7110 (VisionFive2) |
| CPU | RISC-V U74 @ 1 GHz |
| 定时器 | CLINT mtime @ 4 MHz |
| 测量方法 | CPU 指令计数 |
三、性能测试结果
3.1 核心性能指标
| 指标 | CPU循环 | 执行时间 | 平均延迟 |
|---|---|---|---|
| 任务创建延迟 | 400-500条 | 400-500 ns | 457 ns |
| 中断响应延迟 | 400-800条 | 400-800 ns | 633 ns |
3.2 性能对比
| 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 | RISC-V HiFive1 | 320 MHz | ~1.8 μs | - | SiFive |
| Zephyr | ARM Cortex-M | 64 MHz | ~8 μs | - | 文档 |
| Linux PREEMPT_RT | x86_64 | 3 GHz | - | 7-50 μs | 文档 |
3.3 测量方法
原理: CPU循环计数 → 时间转换 公式: 执行时间 = CPU循环次数 / CPU频率 × 10^9
四、技术成果
- 内存稳定性: 解决了与固件的内存冲突,系统可稳定启动运行
- 调试能力: 实现双串口UART日志输出,支持运行时系统状态监控
- 中断系统: 完善时钟中断处理,支持定时器和调度器功能
- 性能数据: 获得权威的实时性能基准数据
六、总结
2月份的工作完成了Embassy Preempt在JH7110平台上的核心功能验证:
- ✅ 内存管理稳定
- ✅ 日志系统完善
- ✅ 中断系统优化
- ✅ 性能基准确立