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的异构通信常见于以下场景:
- 实时数据采集与云端上传: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通信包含以下关键环节:
- M核固件启动时调用
OPENAMP_init(),创建名为rpmsg-led的端点,并注册接收回调函数。 - A核Linux启动后,remoteproc加载M核固件并启动M核;RPMsg总线根据通道名称匹配,在
/dev/下生成rpmsg-led字符设备节点。 - A核用户态程序打开该设备节点,写入命令结构体,例如
{cmd: 0x01, brightness: 80}。 - RPMsg驱动将消息放入共享内存的vring缓冲区,然后写IPCC寄存器触发通道中断。
- M核收到IPCC中断,从vring中取出消息,解析后执行PWM占空比设置,并通过同一通道回送确认消息。
- 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(取决于系统负载) |