RTOS vs Linux 异构选型: 三核 SoC 上的双系统设计

5 阅读6分钟

原文链接: CSDN

参考: RK3506 Datasheet, newosp v0.2.0

适用场景: 激光雷达、工业视觉、机器人控制器、边缘传感器融合


1. 设计目标

RK3506J 提供 3 个 Cortex-A7 (1.2 GHz) + 1 个 Cortex-M0 (200 MHz) 的异构多核硬件。本文给出面向工业传感器产品 (激光雷达、工业相机) 的两种部署方案概要设计,并给出选型建议。

1.1 量化目标

编号目标量化指标验证方法
G-1电机控制实时性中断响应 < 10 usM0 GPIO 示波器
G-2数据处理延迟端到端 P99 < 5 ms硬件时间戳
G-3核间通信延迟Mailbox 单程 < 50 usIPC 延迟测试
G-4系统启动时间< 2 s (方案一) / < 500 ms (方案二)上电到首帧
G-5连续运行稳定性72h 零崩溃、零内存泄漏长稳压测
G-6热路径零堆分配malloc/free 调用 0 次运行时 hook

1.2 硬件约束

项目配置
A 核组3x Cortex-A7 @ 1.2 GHz, 32 KB L1 I/D, Thumb-2, NEON VFPv4
M 核1x Cortex-M0 @ 200 MHz, 无 Cache, 无硬件除法, 无 DSP
内存256 MB - 512 MB DDR3/DDR3L
核间通信Hardware Mailbox (4 通道), 共享内存 (SRAM / DDR)
外设SPI x4, I2C x6, UART x6, USB 2.0, RGMII, SDIO
编译器arm-none-eabi-gcc (M0), arm-linux-gnueabihf-gcc (A7)

2. 总体架构

2.1 异构多核职责划分

RK3506J 的异构设计天然适合 "硬实时 + 高算力" 场景:

flowchart TB
    subgraph M0["M0 核: 硬实时控制 (200 MHz)"]
        MOTOR["电机控制\nPWM + 编码器"]
        SAFETY["安全监控\n过温/过流保护"]
        TRIGGER["采集触发\n同步信号"]
    end

    subgraph A7["A7 核组: 数据处理 (3x 1.2 GHz)"]
        A7_0["A7-0: 系统核\n中断分发 / 网络 / 日志"]
        A7_1["A7-1: 采集核\n传感器数据接收"]
        A7_2["A7-2: 算法核\n点云处理 / 滤波"]
    end

    subgraph IPC["核间通信"]
        MBOX["Hardware Mailbox\n4 通道"]
        SHMEM["共享内存\n控制命令 + 状态"]
    end

    M0 <-->|"Mailbox + SRAM"| IPC
    IPC <-->|"DDR 共享区"| A7

2.2 核心分工

核心职责实时性要求典型任务
M0硬实时控制< 10 us电机 PWM、编码器读取、安全保护、采集触发
A7-0系统服务非实时Linux 内核、网络协议栈、日志、串口诊断
A7-1数据采集软实时SPI/LVDS 接收、DMA 管理、数据校验
A7-2算法处理软实时点云滤波、坐标变换、NEON 加速

3. 方案一: Linux + RTOS 混合部署 (推荐)

3.1 系统架构

flowchart LR
    subgraph M0_RTOS["M0: RT-Thread / FreeRTOS"]
        M_MOTOR["MotorTask\nPrio 最高"]
        M_SAFE["SafetyTask"]
        M_IPC["IPCTask\nMailbox 收发"]
    end

    subgraph A7_LINUX["A7 核组: Linux 5.10+"]
        subgraph CORE0["A7-0: 系统核"]
            NET["网络/诊断"]
            LOG["日志/遥测"]
            CTRL["控制节点\nnewosp HSM"]
        end
        subgraph CORE1["A7-1: 采集核 (isolcpus)"]
            ACQ["采集任务\nSCHED_FIFO"]
        end
        subgraph CORE2["A7-2: 算法核 (isolcpus)"]
            ALGO["算法任务\nSCHED_FIFO + NEON"]
        end
    end

    M_IPC <-->|"Mailbox"| CTRL
    ACQ -->|"ShmChannel\nSPSC 零拷贝"| ALGO
    ALGO -->|"AsyncBus\n控制消息"| NET
    CTRL -->|"AsyncBus"| ACQ

3.2 newosp 模块映射

功能newosp 模块部署位置说明
控制消息路由AsyncBus + NodeA7-0MPSC 无锁, 优先级准入
数据面零拷贝ShmChannel (SPSC)A7-1 -> A7-2Wait-free, cache line 对齐
设备状态管理HSMA7-0Init/Ready/Active/Fault/Shutdown
实时调度RealtimeExecutorA7-1, A7-2SCHED_FIFO + mlockall + 绑核
并行处理WorkerPoolA7-2多线程点云处理
定时任务TimerSchedulerA7-0心跳、看门狗、遥测
串口诊断SerialTransportA7-0CRC-CCITT + ACK
线程监控ThreadWatchdogA7-0关键线程存活检测

3.3 核间通信设计

M0 与 A7 之间通过 Hardware Mailbox + 共享 SRAM 通信:

通道方向用途消息格式
Mailbox CH0M0 -> A7电机状态上报16B 定长 (转速 + 编码器 + 温度)
Mailbox CH1A7 -> M0电机控制命令16B 定长 (目标转速 + 模式)
Mailbox CH2M0 -> A7安全告警8B (告警码 + 时间戳)
Mailbox CH3A7 -> M0采集触发同步4B (触发计数)

协议约定:

  • Mailbox 中断触发, 非轮询
  • 共享 SRAM 区域存放详细数据, Mailbox 仅传递通知和索引
  • M0 侧使用原子操作 + memory barrier, A7 侧使用 acquire/release 语义

3.4 内存分区

区域起始地址大小归属用途
M0 Code + Data0x0000_0000128 KBM0 独占RTOS + 应用
共享 SRAM0x0002_000064 KBM0 + A7Mailbox 数据区
Linux Kernel0x6000_0000128 MBA7 独占内核 + 根文件系统
newosp 框架--~2 MBA7 用户态AsyncBus + ShmChannel
数据缓冲--~10 MBA7 用户态点云帧缓冲
DMA 缓冲CMA 区域4 MBA7 DMASPI/DMA 接收缓冲

3.5 优缺点分析

维度评估
开发效率高 -- Linux 生态成熟, 驱动/网络/调试工具丰富
实时性中 -- A7 侧依赖 isolcpus + SCHED_FIFO, 非硬实时
算力利用高 -- 3 个 A7 核全部可用于数据处理
启动时间慢 -- Linux 启动 ~2 s
内存占用高 -- Linux 基础 ~32 MB
维护成本低 -- Linux 应用层开发, 调试手段丰富

4. 方案二: 全 RTOS 部署 (极致实时)

4.1 系统架构

flowchart LR
    subgraph M0_RTOS["M0: RT-Thread"]
        M2_MOTOR["MotorTask"]
        M2_IPC["IPCTask"]
    end

    subgraph A7_RTOS["A7 核组: RT-Thread SMP"]
        subgraph CORE0_R["A7-0: 控制核"]
            R_CTRL["ControlTask\nPrio 60"]
            R_NET["LwIP NetTask\nPrio 50"]
            R_LOG["LogTask\nPrio 30"]
        end
        subgraph CORE1_R["A7-1: 采集核 (绑核)"]
            R_ACQ["IngestTask\nPrio 90"]
        end
        subgraph CORE2_R["A7-2: 算法核 (绑核)"]
            R_PROC["ProcessTask\nPrio 85"]
            R_PUB["PublishTask\nPrio 80"]
        end
    end

    M2_IPC <-->|"Mailbox"| R_CTRL
    R_ACQ -->|"SPSC Ring\n无锁"| R_PROC
    R_PROC -->|"SPSC Ring"| R_PUB
    R_PUB -->|"结果队列"| R_NET

4.2 任务部署矩阵

核心任务优先级触发方式亲和绑定
A7-0ControlTask602 KBMailbox 中断
A7-0NetTask (LwIP)504 KB周期 100 Hz
A7-0LogTask302 KB周期 10 Hz
A7-1IngestTask902 KBDMA 完成信号量
A7-2ProcessTask854 KBSPSC Ring 非空
A7-2PublishTask802 KBSPSC Ring 非空

4.3 数据通道

A7 核间采用 SPSC 无锁 Ring Buffer 传递数据 (所有权转移模型):

属性机制
无 ABA 问题单生产者单消费者, 无 CAS
无数据撕裂uint32_t 对齐, ARM 原子 LDR/STR
内存序正确DMB 保证数据/索引写入顺序
无 false sharinghead/tail 间 32B padding

4.4 优缺点分析

维度评估
开发效率低 -- 需自行移植 LwIP/USB 协议栈, 无现成驱动
实时性高 -- 全系统确定性调度, 中断响应 < 15 us
算力利用高 -- 3 个 A7 核 + NEON, 无 Linux 内核开销
启动时间快 -- < 500 ms
内存占用低 -- RTOS 基础 < 512 KB
维护成本高 -- 所有协议栈需自行维护和调试

5. 方案决策矩阵

维度权重方案一 (Linux+RTOS)方案二 (全 RTOS)
开发效率30%94
实时性25%69
算力利用15%89
启动时间10%59
内存效率10%59
维护成本10%84
加权总分100%7.156.75

5.1 推荐路径

flowchart LR
    P1["Phase 1\n方案一原型\nLinux + M0 RTOS"] --> P2["Phase 2\n性能验证\n延迟/抖动/吞吐"]
    P2 -->|"达标"| SHIP["交付\n方案一"]
    P2 -->|"不达标"| P3["Phase 3\n热点迁移\n关键路径迁至 RT-Thread"]
    P3 --> P4["Phase 4\n全 RTOS 部署\n方案二"]

建议:

  1. 首选方案一 (Linux + M0 RTOS) -- 开发效率高, 生态成熟, 适合快速原型和首版交付
  2. 方案二作为演进目标 -- 当方案一无法满足延迟/抖动要求时, 逐步将热点迁移到 RT-Thread SMP
  3. 渐进式迁移 -- 先在 Linux 上用 newosp RealtimeExecutor (isolcpus + SCHED_FIFO) 尝试优化, 若仍不足再考虑全 RTOS

6. 资源预算

6.1 方案一资源预算

资源M0A7 核组总计
RAM~32 KB~48 MB (Linux+newosp+缓冲)~48 MB
Flash~64 KB~32 MB (内核+根文件系统)~32 MB
CPU 占用< 30%A7-0 < 40%, A7-1/2 < 70%--

6.2 方案二资源预算

资源M0A7 核组总计
RAM~32 KB~4 MB (RTOS+LwIP+缓冲)~4 MB
Flash~64 KB~2 MB (RTOS 镜像)~2 MB
CPU 占用< 30%A7-0 < 30%, A7-1/2 < 70%--

7. 总结

核心设计决策:

  1. M0 专责硬实时: 电机控制、安全保护等微秒级响应任务固定在 M0, 与应用层完全隔离
  2. Hardware Mailbox 核间通信: 中断驱动、低延迟, 共享 SRAM 传递详细数据
  3. 方案一优先: 利用 Linux 生态快速交付, newosp 的 RealtimeExecutor + ShmChannel 在用户态提供软实时保障
  4. 渐进式演进: 通过量化验证 (延迟/抖动/吞吐) 驱动方案选择, 避免过度设计

原文链接: CSDN