1. 异构通信与STM32MP平台概览

STM32MP系列微处理器(如STM32MP157、STM32MP135)在单颗芯片内同时集成了Arm Cortex-A核与Arm Cortex-M核,形成典型的异构多核架构。Cortex-A核运行Linux等富操作系统,负责网络、文件系统、图形界面、复杂协议栈等任务;Cortex-M核运行裸机程序或RTOS,负责实时控制、电机驱动、传感器采集、安全监控等对确定性要求高的任务。两者各司其职,又必须协同工作,这就引出了“异构通信”这一核心问题。

为什么需要异构通信

在传统方案中,若用一颗MCU做实时控制、再用一颗MPU跑Linux,两者之间需要额外的UART、SPI或以太网物理连线,增加成本与故障点。STM32MP把两者放进同一封装,但Cortex-A与Cortex-M拥有各自独立的内存空间与外设视图,默认情况下彼此不可见。要让A核上的Linux应用读取M核采集的数据,或让M核响应A核下发的控制命令,就必须建立一条跨核通信通道。OpenAMP与RPMsg正是ST官方在STM32MP上推荐的标准化通信方案。

OpenAMP与RPMsg的定位

OpenAMP(Open Asymmetric Multi-Processing)是一套开源框架,目标是让不同架构、不同操作系统的处理器之间能够以统一方式通信。它主要包含三部分:RPMsg(Remote Processor Messaging)提供基于共享内存的消息传递协议;VirtIO提供虚拟队列机制,管理共享内存中的缓冲区; remoteproc 负责远程处理器的生命周期管理,包括固件加载、启动、停止。RPMsg在软件层次上类似“核间socket”,A核与M核各自创建端点(endpoint),通过通道名称匹配后即可收发消息。

在STM32MP平台上,典型数据路径是:M核固件把数据写入共享内存中的VirtIO环形缓冲区,触发IPCC(Inter-Processor Communication)中断通知A核;A核Linux侧的RPMsg驱动收到中断后从共享内存读取数据,再通过字符设备或sysfs接口交给用户态应用。反向通信同理。IPCC是STM32MP特有的硬件外设,负责产生和接收核间中断,是OpenAMP能跑起来的物理基础。

STM32MP 异构多核通信架构 Cortex-A7 (Linux) 用户态应用 (数据采集/控制逻辑) RPMsg 字符设备 /dev/rpmsg_ctrl0 VirtIO 驱动 vring 管理 remoteproc 固件加载/生命周期 Cortex-M4 (RTOS/裸机) 应用任务 (实时控制/采集) OpenAMP 库 rpmsg_send/recv VirtIO 队列 vring 描述符 IPCC 驱动 中断收发 共享内存 (DDR / SRAM) VirtIO vring 环形缓冲区 · RPMsg 消息缓冲区 地址范围示例:0x10040000 – 0x1007FFFF (256KB) IPCC 硬件外设 核间中断通道 (Channel 1/2) 读写 vring 读写 vring 中断触发 A核侧软件栈 M核侧软件栈 共享内存 IPCC 中断

典型应用场景

在工业与消费类产品中,STM32MP的异构通信常见于以下场景:

  • 实时数据采集与云端上传:M核以1kHz周期采集ADC数据并做滤波,通过RPMsg批量发送给A核;A核运行MQTT客户端将数据上传至云平台。M核保证采样周期抖动小于10μs,A核负责协议封装与网络重传。
  • 人机界面与电机控制分离:A核运行Qt界面显示转速、温度曲线;M核运行FOC算法控制三相逆变器。用户点击界面按钮后,A核通过RPMsg下发目标转速,M核收到后更新控制环给定值。
  • 安全监控与系统管理:M核独立监控看门狗、电源电压与温度,一旦发现异常,通过RPMsg向A核发送告警消息,A核记录日志并执行安全关机流程。

通信流程示例

以“A核向M核下发LED控制命令”为例,一次完整的RPMsg通信包含以下关键环节:

  1. M核固件启动时调用 OPENAMP_init(),创建名为 rpmsg-led 的端点,并注册接收回调函数。
  2. A核Linux启动后,remoteproc加载M核固件并启动M核;RPMsg总线根据通道名称匹配,在 /dev/ 下生成 rpmsg-led 字符设备节点。
  3. A核用户态程序打开该设备节点,写入命令结构体,例如 {cmd: 0x01, brightness: 80}。
  4. RPMsg驱动将消息放入共享内存的vring缓冲区,然后写IPCC寄存器触发通道中断。
  5. M核收到IPCC中断,从vring中取出消息,解析后执行PWM占空比设置,并通过同一通道回送确认消息。
  6. A核读取确认消息,判断命令是否成功执行。
调试提示:若A核侧看不到 /dev/rpmsg-led 节点,优先检查M核固件是否已正确加载(cat /sys/class/remoteproc/remoteproc0/state 应显示 running),以及设备树中IPCC与共享内存保留区域是否配置正确。

关键参数与约束

项目 典型值/说明
共享内存基地址 0x10040000(示例,需与设备树一致)
共享内存大小 256KB(可配置,需满足vring与缓冲区需求)
vring 数量 2(TX/RX各一)
单条消息最大长度 512字节(RPMsg默认,可调整)
IPCC 通道 Channel 1 用于A→M,Channel 2 用于M→A
中断延迟 典型 <5μs(取决于系统负载)