第十九周工作总结
概述
本周完成了 L2 Cache Lim 运行环境的完整配置
核心工作:L2 Cache Lim 运行环境
技术背景
L2 Cache Lim 是 JH7110 SoC 中 L2 Cache 的一块特殊区域,可直接映射为内存使用,相比常规 DDR 具有更确定的访问延迟(对于RTOS来说很重要)和更高的带宽,非常适合运行对延迟敏感的实时任务。
完整实现链路
┌─────────────────────────────────────────────────────────────────┐
│ 启动流程 │
├─────────────────────────────────────────────────────────────────┤
│ 1. SPL 自搬运 │ 2. Hart0 入口 │ 3. 应用启动 │
│ ( spl ) │ (opensbi/rustsbi) │ (embassy_app) │
│ 0x8000000 → 0x8080000 │ → Cache Lim 跳转 │ → Cache Lim │
└─────────────────────────────────────────────────────────────────┘① SPL 自搬运 (u-boot)
SPL 原本运行在 0x800_0000,为了给 embassy_preempt 预留空间,实现了自搬运机制:
新增文件: arch/riscv/cpu/spl_relocate.S (110 行)
- 汇编实现的 SPL 自搬运代码
- 将自身从
0x800_0000搬运到0x808_0000 - 修改
u-boot-spl.lds链接脚本适配新地址
Cache2 配置:
- 添加
sifive,max-enabled-ways设备树选项 - 限制仅使用 12 个 Cache2 ways,为 Cache Lim 预留空间
- 更新
cache-sifive-ccache.c驱动
② SBI 层 Hart0 入口
opensbi 修改 lib/sbi/sbi_init.c:
- Hart0 启动后直接跳转到 L2 Cache Lim 区域运行
③ 链接脚本与内存布局
embassy_preempt JH7110 平台适配:
新增 platforms/jh7110/link.x (205 行):
/* 将程序代码段放置在 L2 Cache Lim 区域 */
. = 0x0800_0000;
.text : { *(.text.init) *(.text .text.*) }修改 memory.x 内存布局定义,重构 panic_handler.rs (132 行) 增强异常处理能力。
④ 构建系统配置与 ELF Split
Makefile 更新:
- 移除
rust-objcopy步骤,直接使用 ELF 文件
ELF Split 配置 (u-boot binman.dtsi):
使用 U-Boot binman 的 split-elf 操作自动拆分 ELF 文件:
dts
@embassy-SEQ {
fit,operation = "split-elf"; // 启用 ELF 拆分
description = "Embassy Preempt OS";
type = "standalone";
os = "rtos";
arch = "riscv";
compression = "none";
fit,load; // 自动从 ELF 读取加载地址
fit,data; // 自动从 ELF 读取代码段
embassy_preempt {
};
};开发环境更新 (flake.nix):
- 添加
python3Packages.pyelftools依赖(binman 解析 ELF 需要)
外设驱动与测试体系
GPIO 驱动
embassy_preempt_app 新增完整的 GPIO 驱动 (246 行):
- GPIO 引脚配置与控制
- 支持输入/输出模式切换
- LED 测试程序 (341 行) 验证驱动功能
AMO 指令支持
添加 RISC-V 原子操作指令支持,为多核同步提供硬件基础。
测试程序体系
| 测试程序 | 功能 | 代码量 |
|---|---|---|
cpu_freq_test.rs | CPU 频率测试 | 73 行 |
ctx_switch_test.rs | 上下文切换性能测试 | 133 行 |
led_test.rs | LED/GPIO 功能测试 | 341 行 |
perf_test.rs | 综合性能测试 | 51 行 |
timer_test.rs | 定时器精度测试 | 82 行 |
内存布局规划
Cache Lim
0x800_0000 ┌─────────────────┐
│ embassy_preempt │ ← 核心代码运行区
│ 应用程序 │
│ SPL (自搬运前) │
├─────────────────┤ ← SPL 自搬运
0x808_0000 │ SPL (运行位置) │
└─────────────────┘