Skip to content

项目计划更新 — K3 (SpacemiT Key Stone) 实体板适配

日期:2026-05-28(2026-05-30 修订) 变更:取消 VisionFive2 (JH7110) 移植计划,转投 SpacemiT K3 平台 修订:补充 RTOS 外设驱动规划、机器人应用 Demo 场景、8 月决赛演示方案

一、变更原因

从 VisionFive2 (JH7110) 迁移到 SpacemiT K3,两个原因:

  1. JH7110 核心内部资料不透明 — U74 (SiFive) 为 IP 核,内部微架构文档封闭,底层调试和驱动优化受限
  2. K3 AI 性能远优于 VF2 — 8× A100 提供 60 TOPS 算力,本地跑 30B 大模型;而 VF2 无任何 AI 加速

此外 K3 内置双核 RT24 小核,RT24 专跑 rt-async(单核 M-mode),X100 大核跑 StarryOS,大小核物理隔离,实时性能不受 AI 负载影响。

特性VF2 方案 (废弃)K3 方案 (采用)
实时核从 X100 大核中抠一个 hartRT24 独立小核 (物理隔离)
大核负担实时 hart 抢占 StarryOS 时间X100 全部 8 核跑 StarryOS/AI
实时确定性受乱序执行 + 缓存抖动影响6 级顺序核,确定性延迟
AI 算力60 TOPS (8× A100, 本地跑 30B 模型)
核间 IPI软件自实现 (CLINT MSIP)ACLINT MSIP (同机制,换地址)
中断控制器PLIC + CLINTACLINT + APLIC (RISC-V AIA)
UART共享 1×独立:主域 17× + RT 域 6×
GPIO有限5 组 (128 线) + RT 域独立 GPIO
内存8GB LPDDR4最高 32GB LPDDR5 (51 GB/s)
实时定时器CLINT mtime专用 Timer 单元 (多组) + Watchdog

核心优势:小核负责电机控制、传感器采集等微秒级实时任务;大核跑 AI 推理、视觉处理、StarryOS 用户态应用——两者通过本项目的 AMP 通信方案(ov-channels + ov-rpc)协作,延迟极低且互不干扰。


二、K3 硬件架构与地址映射摘要

2.1 系统整体架构

┌─────────────────────────────────────────────────────────────────────────┐
│                           应用层                                         │
│    机器人控制 · AI 推理 · 视觉识别 · 传感器采集 · 用户交互                 │
├──────────────────────────────┬──────────────────────────────────────────┤
│                              │                                          │
│   X100 × 8 (StarryOS)        │        RT24 × 1 (rt-async)              │
│   ┌────────────────────┐     │     ┌────────────────────┐               │
│   │  StarryOS 用户态 App   │     │     │  实时任务 (async)   │              │
│   │  AI 推理 · 规划决策  │     │     │  电机 · 传感器 · PWM│              │
│   └────────┬───────────┘     │     └────────┬───────────┘               │
│            │ mmap + ioctl    │              │                           │
│   ┌────────┴───────────┐     │              │                           │
│   │  /dev/rt_shm 驱动   │     │     ┌────────┴───────────┐             │
│   │  (StarryOS 内核)    │     │     │  Chip / TimerChip   │             │
│   └────────┬───────────┘     │     │  (rt-async platform) │             │
│            │                 │     └────────┬───────────┘             │
├────────────┼─────────────────┼──────────────┼──────────────────────────┤
│            │    本项目 AMP 通信方案          │                          │
│            │                 │              │                          │
│  ┌─────────┴─────────────────┴──────────────┴───────────────┐          │
│  │              ov-channels  (共享内存无锁通道)               │          │
│  │              ov-rpc       (postcard 序列化 RPC)            │          │
│  │              SHM 区域     (SRAM 512KB 或 DDR)             │          │
│  └─────────────────────────┬────────────────────────────────┘          │
│                            │ IPI 通知                                   │
│  ┌─────────────────────────┴────────────────────────────────┐          │
│  │  K3:  ACLINT MSIP 写寄存器 (与 QEMU CLINT MSIP 同机制)    │          │
│  └─────────────────────────┬────────────────────────────────┘          │
├────────────────────────────┼───────────────────────────────────────────┤
│              K3 SoC 硬件    │                                           │
│  ┌─────────────────────────┴────────────────────────────────┐          │
│  │  Main CPU Domain          │  RT CPU Domain                │          │
│  │  X100 × 8  (乱序, 2.4GHz) │  RT24 × 2  (顺序, RV64GC)    │          │
│  │  A100 × 8  (60 TOPS AI)   │  独立 UART × 6 / GPIO / PWM  │          │
│  │  8MB L2 共享缓存          │  独立中断源 (int_src[])       │          │
│  │  ACLINT + APLIC (AIA)     │  可访问 X100 域设备窗口       │          │
│  └───────────────────────────┴──────────────────────────────┘          │
│           共享内存: SRAM (512KB) · DDR (≤32GB LPDDR5)                  │
│  DDR (≤32GB LPDDR5) · UART (主域17×+RT域6×) · CAN ×10                  │
│  SPI ×6 · I2C ×9 · GPIO (128线) · PCIe ×8 · USB 3.0 ×5               │
│  GMAC ×4 · PWM ×30 · Mailbox ×16 · Spinlock ×32                       │
└─────────────────────────────────────────────────────────────────────────┘

数据流:用户态 App → mmap 共享内存 → ov-channels 写入消息 → ACLINT MSIP IPI 通知 RT24 → rt-async 异步任务处理 → 响应原路返回。

2.2 关键地址映射

RT 域 (RCPU Domain) — rt-async 运行在 RT24 单核上 (M-mode)

模块地址大小备注
SRAM (512KB)0xC080_0000512KB与主域 0xC080_0000 共享
X100 域设备窗口0x8000_0000~1GBRT 域可访问主域设备
sys_ctrl0xC088_00004KB系统控制寄存器
R_UART0~50xC088_1000 ~ 0xC088_1500256B/eaRT 域专用 UART
R_GPIO0xC088_94001KBRT 域 GPIO
AON_TIMER10xC088_90001KBAlways-On 定时器
AON_TIMER2~40xC088_C800 ~ 0xC088_CA00256B/ea额外定时器
PWM0~90xC088_D100 ~ 0xC088_DA00256B/eaPWM 输出
R_SSP0~2 (SPI)0xC088_5000 ~ 0xC088_5200256B/eaSPI 控制器
R_I2C0~10xC088_6000 ~ 0xC088_6100256B/eaI2C 控制器
R_MAILBOX0xC076_000064KBRT 域 Mailbox (SoC 提供,后续可选用)
DDR DRAM0x01_0000_000064GB通过地址映射访问主存

2.3 中断架构

K3 使用 RISC-V AIA (Advanced Interrupt Architecture):

  • ACLINT:每个 hart 的软件中断 (MSIP) + 定时器中断 (MTIMER) — 与 QEMU CLINT 同机制
  • APLIC:外部中断控制器,MSI-only 输出,最多 1023 个中断源

RT 域中断源(关键字段):

中断号信号用途
int_src[8~10]timer_{1,2,3}_irqGP Timer 中断
int_src[17~21]shub_uart_int[0~4]RT UART 中断
int_src[49]aud_gpio_int_apRT GPIO 中断
int_src[46~48]timer2_{1,2,3}_irqTimer2 中断
int_src[76~81]timer3/4 中断额外定时器
int_src[65~66]mailbox_irq0[0~1]Mailbox0 中断 (可选用)
int_src[67]ap_spinlock_irqSpinlock 解锁中断 (可选用)

2.4 RT24 核心特性(rt-async 运行在此核)

  • 基于 CVA6 (OpenHW Group 开源核心)
  • 6 级顺序单发射流水线 — 确定性执行,适合实时
  • 支持 RV64IMAFDC (RV64GC) 完整指令集
  • 三级特权:M / S / U — rt-async 运行于 M-mode,独占整个 RT24 核
  • 支持 SV39 虚拟内存 (ITLB + DTLB + PTW)
  • 超低待机与运行功耗 — 不与大核争抢功耗预算
  • 独立外设集 (RCPU Domain):自有 UART × 6、GPIO、Timer、I2C、SPI 等,不与大核争用
  • 可通过地址窗口访问 X100 域设备 (0x8000_0000) — 用于 Mailbox 等 SoC 共享资源
  • 与 X100 域共享 SRAM (0xC080_0000, 512KB) 和 DDR — 这是双核通过共享内存通信的基础
  • K3 有 2 个 RT24 核,计划只用 1 个跑 rt-async,另 1 个留做系统管理或备用

三、修订后的项目阶段计划

阶段一:RTOS 内核完善(5月12日 - 6月15日)

  • [x] JoinHandle<T>
  • [ ] Mutex 优先级继承
  • [ ] 基础同步原语完善

阶段二:双内核通信(6月1日 - 6月30日)

  • [x] ov-channels 共享内存通信 (Notification + Message Queue)
  • [x] ov-rpc 调用框架(多通道、多调用模式:call / call_quiet / send / urgent)
  • [x] amp.toml 统一配置(地址自动生成)
  • [x] StarryOS rt_shm 设备驱动
  • [ ] 性能基准测试报告

阶段三:K3 实体板移植与驱动(6月15日 - 7月31日)

取代原 VisionFive2 (JH7110) 移植计划

3.1 平台基础设施

  • [ ] K3 启动流程研究
    • [ ] RT24 核独立启动方式 (M-mode entry, 不依赖 X100 域)
    • [ ] RT24 与 X100 域的启动时序协调 (谁先启动?握手协议?)
    • [ ] 链接脚本适配 (RCPU 域地址映射,区别于 QEMU virt)
    • [ ] SRAM (512KB) 与 DDR 内存布局规划 — rt-async 代码放 SRAM 还是 DDR?
  • [ ] RT24 裸机运行环境搭建
    • [ ] riscv64 target 配置 (RT24 为 RV64GC, 含 F/D 扩展 — 区别于 QEMU 的 imac)
    • [ ] 最小 M-mode 启动代码 (set up stack, mtvec, 跳入 rust main)
    • [ ] UART 控制台输出 (R_UART0 @ 0xC088_1000, 16550 兼容)

3.2 核心驱动适配

  • [ ] 定时器驱动
    • [ ] AON Timer (替代 CLINT mtime,作为 rt-async 系统 tick)
    • [ ] GP Timer 1~3 (高精度 deadline / 周期任务)
    • [ ] 定时器频率获取与校准
  • [ ] 中断控制器适配
    • [ ] 从 PLIC 切换到 APLIC (MSI-only 模式)
    • [ ] ACLINT MSIP — 与 QEMU CLINT MSIP 同机制,换基址即可
    • [ ] RT 域中断向量表 (int_src[] 映射)

3.3 外设驱动(机器人控制所需)

目标:为 RT24 核心提供控制机器人硬件的驱动能力, 使 rt-async 上的异步任务能直接操作电机、传感器等外设。

  • [ ] GPIO 驱动 (R_GPIO @ 0xC088_9400)
    • [ ] 基本 IO 读写
    • [ ] 中断模式 (int_src[49] aud_gpio_int_ap)
  • [ ] PWM 驱动 (PWM0~9)
    • [ ] 频率 / 占空比配置
    • [ ] 用于电机速度控制、舵机角度控制
  • [ ] I2C 驱动 (R_I2C0~1 @ 0xC088_6000 ~ 0xC088_6100)
    • [ ] 主模式读写 (Master TX/RX)
    • [ ] 用于读取 IMU (加速度计/陀螺仪)、距离传感器等
  • [ ] SPI 驱动 (R_SSP0~2 @ 0xC088_5000 ~ 0xC088_5200)
    • [ ] 全双工主模式
    • [ ] 用于高速传感器通信 (编码器、ADC 等)
  • [ ] UART 驱动 (R_UART0~5)
    • [ ] 中断收发 (int_src[17~21])
    • [ ] 用于调试串口 / 与外部模块通信 (蓝牙、GPS 等)

3.4 AMP 通信方案迁移

本项目已实现的 AMP 通信架构(QEMU virt 上验证通过):

X100 (StarryOS)                           RT24 (rt-async)
┌──────────────────┐                      ┌──────────────────┐
│  用户态 App       │                      │                  │
│  mmap(/dev/rt_shm)│◄────共享内存────────►│  ov-channels     │
│  ov-rpc / ioctl   │   (ov-channels)      │  ov-rpc          │
├──────────────────┤                      ├──────────────────┤
│  rt_shm 驱动      │◄──── IPI 通知 ──────►│  Chip::pend()    │
│  (mmap + ioctl)   │   CLINT MSIP (QEMU)  │  send_ipi_to_    │
└──────────────────┘                      │  StarryOS()         │
                                          └──────────────────┘

迁移到 K3,整个通信方案不变,仅底层寄存器地址不同:

层次QEMU virt (当前)K3 (迁移)
数据通路ov-channels (共享内存)ov-channels — 不变
RPC 框架ov-rpc (postcard 序列化)ov-rpc — 不变
用户态接口/dev/rt_shm (mmap + ioctl)/dev/rt_shm不变
IPI 通知CLINT MSIP 写寄存器ACLINT MSIP 写寄存器 (同机制)
定时器CLINT mtimeAON Timer + GP Timer
中断控制器PLICAPLIC (AIA)
共享内存位置QEMU phys mem 固定区域SRAM (512KB) 或 DDR

阶段四:实验展示(7月15日 - 8月10日)

向评委量化展示 RTOS 实时核的价值。

外设驱动(PWM/I2C/SPI)作为能力展示

4.1 RTOS 侧:实时仿真控制任务

  • [ ] 定义仿真 RPC 服务
ignore
define_service! {
    pub ControlService {
        SET_TARGET:  0 => send  set_target(pos: i32);
        STOP:        1 => urgent stop();
        GET_STATE:   2 => call  get_state() -> (i32, i32);
    }
}
  • [ ] 周期控制任务 (1kHz 软件仿真)
    • [ ] rt-async 定时器驱动 1ms 周期循环
    • [ ] 每轮:读取目标 → PID 计算 → 记录输出与时间戳
    • [ ] 通过 UART 输出时间戳序列,供 StarryOS 侧分析抖动
  • [ ] urgent 急停响应测试
    • [ ] StarryOS 侧发送 urgent → 测量 RT24 从收到 IPI 到停机的延迟
    • [ ] 对比 StarryOS 侧直接处理的延迟

4.2 StarryOS 侧:控制端 + 数据可视化

  • [ ] 用户态控制 App
    • [ ] 通过 ov-rpc call 下发目标 / 读取状态
    • [ ] 通过 ov-rpc send 持续推送设定值
    • [ ] 通过 ov-rpc urgent 触发急停
  • [ ] 实时性数据采集与可视化
    • [ ] 采集 RTOS 侧的周期时间戳,绘制控制周期抖动图
    • [ ] 采集 IPC 往返延迟(StarryOS 发请求 → RTOS 响应 → StarryOS 收到)
    • [ ] 生成对比图表(详见 4.4)

4.3 跨核设备操控演示(驱动 + RPC 联动)

通过 StarryOS 侧 ov-rpc 远程操控 RT24 上的 UART / I2C 设备, 端到端验证"Linux 下命令 → AMP RPC → RTOS 驱动 → 硬件响应"全链路。

  • [ ] RPC 服务定义
ignore
define_service! {
    pub DeviceService {
        UART_WRITE: 0 => send  uart_write(data: [u8; 64]);
        UART_READ:  1 => call  uart_read() -> [u8; 64];
        I2C_WRITE:  2 => send  i2c_write(addr: u8, data: [u8; 16]);
        I2C_READ:   3 => call  i2c_read(addr: u8, len: u8) -> [u8; 16];
        STOP:       4 => urgent stop();
    }
}
  • [ ] UART 演示:StarryOS 用户态通过 ov-rpc 向 RT24 UART 发送字符串 → RT24 通过 R_UART 输出到串口终端 → 看到打印内容
  • [ ] I2C 演示:StarryOS 用户态通过 ov-rpc 读写 RT24 上的 AT24C02 EEPROM → 写入数据 → 读回验证 → 返回结果
  • [ ] 证明点:Linux 侧无需自带 I2C/UART 驱动,通过 RPC 即可透明操控 RT 域外设

4.4 实验设计(核心展示)

核心问题:为什么需要 RTOS 实时核?

通过对比实验回答,全部可在 K3 板上复现:

实验一:控制周期确定性

方法描述预期结果
StarryOS 直接控制用户态 timerfd 1ms 周期循环抖动大 (100us~ms 级),受调度/GC 影响
RTOS 控制rt-async 定时器 1ms 周期循环抖动 < 10us,确定性执行
  • [ ] 两侧各跑 10000 个周期,导出时间戳
  • [ ] 绘制 jitter 直方图 / 时序图,直观对比

实验二:负载下实时性退化

步骤操作观察
1StarryOS 空闲,RTOS 运行控制循环基线:RTOS 周期抖动极小
2StarryOS 启动 CPU 压力测试 (stress-ng)RTOS 周期抖动不变
3StarryOS 启动 AI 推理负载RTOS 周期抖动仍不变
4对比:StarryOS 自己跑控制循环 + 同等负载周期抖动急剧恶化
  • [ ] 证明物理隔离的核心价值:大核负载不影响小核实时性

实验三:IPC 延迟

场景描述
call 延迟StarryOS 发请求 → IPI → RTOS 处理 → IPI → StarryOS 收响应
urgent 延迟StarryOS 发急停 → IPI → RTOS 执行 → 测量端到端时间
吞吐量连续 N 次 call,测平均延迟和 P99
  • [ ] 不同负载下的延迟分布(空闲 / CPU 压力 / AI 推理)
  • [ ] 证明 IPC 机制在负载下稳定

阶段五:决赛交付与答辩(8月10日 - 8月12日)

  • [ ] K3 板上稳定运行:X100 大核 (StarryOS) + RT24 小核 (rt-async 实时)
    • 备选:若 K3 硬件未到,QEMU virt 演示 + K3 驱动代码展示
  • [ ] 通过本项目的 AMP 通信方案(ov-channels + ov-rpc + 共享内存 + ACLINT IPI)实现跨核通信
  • [ ] 实验演示
    • [ ] 实验一:控制周期确定性对比
    • [ ] 实验二:负载下实时性不退化
    • [ ] 实验三:IPC 延迟与吞吐量
    • [ ] 自动化实验脚本一键复现
  • [ ] 驱动能力展示
    • [ ] 跨核设备操控:StarryOS 通过 ov-rpc 远程读写 Rt-Async 的 UART / I2C (AT24C02)
    • [ ] PWM 波形 / UART 输出
    • [ ] 证明 RTOS 驱动层完整可用
  • [ ] 实时性指标:RT24 抢占延迟、IPC 往返延迟、控制周期抖动、负载下退化程度

四、参考资源