1. 课程导入

在嵌入式与智能设备领域,单一操作系统已经很难同时满足“复杂业务处理”和“硬实时响应”这两类需求。Linux 擅长网络协议栈、文件系统、图形界面、AI 推理与丰富驱动生态,但它的调度抖动通常在毫秒级,难以稳定满足微秒级控制;RTOS(如 FreeRTOS、RT-Thread、Zephyr、VxWorks)具备确定性调度和极低中断延迟,却缺乏完整的应用生态与内存管理能力。于是,在同一颗 SoC 上同时运行 Linux 与 RTOS,并让两者协同工作,成为工业控制、汽车电子、机器人、医疗设备中的主流架构。

本节的核心问题只有一个:当 Linux 与 RTOS 共存于同一硬件平台时,它们如何分工、如何通信、如何共享资源、如何被统一调试与部署?后续 29 章都围绕这条主线展开。

一、为什么需要多系统协同:从需求冲突说起

以一个典型的六轴协作机器人为例:上层需要视觉识别、轨迹规划、远程 OTA、Web 监控,这些任务计算量大、依赖库多,适合放在 Linux 侧;而下层关节伺服需要 1 kHz 甚至 10 kHz 的电流环、位置环控制,抖动必须控制在几微秒内,必须由 RTOS 承担。如果强行用 Linux 加实时补丁(PREEMPT_RT)实现,虽然可行,但会牺牲 Linux 生态兼容性,且最坏延迟仍受内核路径影响。

多系统协同的价值在于“各取所长”:

  • 实时性隔离:RTOS 独占一个 CPU 核或一颗 MCU,Linux 的负载波动不会直接破坏控制周期。
  • 生态复用:Linux 侧可直接使用 Python、OpenCV、ROS2、Docker、MQTT 等成熟组件。
  • 安全分区:功能安全等级高的控制逻辑运行在 RTOS,非安全业务运行在 Linux,便于做 ISO 26262 / IEC 61508 认证。
  • 成本与功耗:一颗多核 SoC 替代“应用处理器 + 独立 MCU”的双芯片方案,减少 BOM 与板级互联。

二、核心概念地图

在进入具体技术之前,需要先建立统一术语。下表列出本课程反复出现的核心概念及其定位。

概念含义典型技术
异构多核同一芯片内不同架构或不同用途的核Cortex-A + Cortex-M/R、A核 + R核
AMP非对称多处理,各核运行独立系统Linux + FreeRTOS 各占一核
RPMSG基于共享内存的消息传递框架Linux remoteproc + virtio
remoteprocLinux 侧远程处理器生命周期管理加载/启动/停止 RTOS 固件
共享内存双方可直接读写的高速数据区SRAM、DDR 保留区
Mailbox硬件中断信箱,用于核间通知IPI、MU、HSEM
设备树描述硬件资源与保留内存reserved-memory、rproc 节点

三、整体知识框架与数据流

下图给出本课程的知识主线:硬件层提供多核与共享资源,Linux 侧负责管理与业务,RTOS 侧负责实时控制,中间通过核间通信(IPC)连接,最终由统一工具链完成构建、烧录与调试。

Linux 与 RTOS 多系统协同开发知识框架 硬件平台层 多核 SoC / 双芯片 · 共享 SRAM · Mailbox · 中断控制器 · 时钟与电源域 Linux 侧(应用处理器) remoteproc / rpmsg 驱动 设备树 reserved-memory 业务应用 · 网络 · 文件系统 调试:gdb · trace · dmesg RTOS 侧(实时核 / MCU) FreeRTOS / RT-Thread / Zephyr 确定性调度 · 中断延迟 < 5 μs 电机控制 · 传感器采集 · 安全逻辑 调试:J-Link · SWO · 串口日志 核间通信 IPC 共享内存 + Mailbox 中断 统一构建与部署工具链 交叉编译 · 固件打包 · 设备树编译 · 烧录 · 联合调试 · OTA 升级 系统分工 实时保障

四、典型场景与协同模式

多系统协同并非只有一种形态,常见模式包括:

  1. AMP 独立核模式:Linux 跑在 A 核,RTOS 跑在 M/R 核,通过共享内存与 Mailbox 通信。这是本课程重点。
  2. 同核虚拟化模式:用 Jailhouse、Xen 等 Hypervisor 把一颗核分区,Linux 与 RTOS 分时运行,隔离性更强但配置复杂。
  3. 双芯片模式:Linux 主控 + 外部 MCU,通过 SPI/UART/CAN 连接,成本高但技术成熟。

以智能座舱为例:Linux 负责仪表渲染、语音助手、导航;RTOS 负责 CAN 报文收发、车门锁控制、电源管理。当用户点击“解锁”时,Linux 应用通过 rpmsg 发送命令,RTOS 在 2 ms 内驱动执行器并回传状态,整个过程对用户无感。

五、常见误区与学习建议

误区一:把 RTOS 当成“小 Linux”。RTOS 没有 MMU 保护、没有进程隔离,任务间共享全局变量,一旦某个任务栈溢出,整个实时侧崩溃。必须用静态分配、栈检测、看门狗兜底。
误区二:认为共享内存可以随意读写。双方必须约定内存布局、字节序、缓存一致性策略。Cortex-A 与 Cortex-M 之间往往存在 cache 不一致问题,需要非缓存区或显式 cache 维护。
学习建议:先跑通一个最小 AMP 示例——Linux 加载 RTOS 固件、双方通过 rpmsg 互发“hello”,再逐步加入共享内存数据通道、中断通知、联合调试。不要一开始就追求复杂框架。

六、一个最小可运行片段

在 Linux 侧,通常通过 sysfs 控制 remoteproc 生命周期,并查看 rpmsg 通道:

# 查看远程处理器状态
cat /sys/class/remoteproc/remoteproc0/state
# 加载并启动 RTOS 固件
echo firmware.elf > /sys/class/remoteproc/remoteproc0/firmware
echo start > /sys/class/remoteproc/remoteproc0/state
# 查看 rpmsg 通道
ls /dev/rpmsg*
# 内核日志确认
dmesg | grep -i rproc

RTOS 侧则初始化共享内存、注册 rpmsg 端点,并在 Mailbox 中断中处理消息。两侧的地址、通道名、消息格式必须严格一致,这也是后续章节反复强调的“契约”思想。

掌握本课程后,你应当能够独立设计一个 Linux + RTOS 的 AMP 系统:划分实时与非实时任务、配置设备树保留内存、实现核间通信、完成固件加载与联合调试,并定位常见的启动失败、通信超时、缓存不一致等问题。接下来的章节将沿着“硬件—通信—系统—工具—实战”的顺序逐层展开。