Skip to content

第十九周工作总结

概述

本周完成了 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.rsCPU 频率测试73 行
ctx_switch_test.rs上下文切换性能测试133 行
led_test.rsLED/GPIO 功能测试341 行
perf_test.rs综合性能测试51 行
timer_test.rs定时器精度测试82 行

内存布局规划

Cache Lim
0x800_0000 ┌─────────────────┐
           │ embassy_preempt │  ← 核心代码运行区
           │   应用程序       │
           │   SPL (自搬运前)  │
           ├─────────────────┤  ← SPL 自搬运
0x808_0000 │   SPL (运行位置)  │
           └─────────────────┘