> 技术文档 > Arm cortex-A核与M核通信 | remoteproc框架的基本使用

Arm cortex-A核与M核通信 | remoteproc框架的基本使用


1.了解M核和A核

  • 为了更容易理解核间通信,我们首先需要对M核和A核有一个简单的认识。多核异构处理器是一种集成多种类型处理核心的芯片架构,旨在通过任务分工实现高性能和低功耗的平衡。通过M核和A核的结合,可以将高性能处理功能实时控制和效率相结合。
  • 常见的组合就包括高性能核(A核,如ARM Cortex-A),和低功耗核(M核,如ARM Cortex-M核)
    • A 核属于 MPU(Micro Processor Unit,微处理器单元),MPU专注于计算能力,需要外接内存、外设等组件,直接放代码是运行不了的,需要运行完整的操作系统(比如Linux、Android)。
    • M 核属于MCU(Micro Controller Unit,微控制器单元),MCU强调低功耗、实时性和成本敏感场景。就比如我们常见的单片机stm32、51单片机都是MCU。通常运行RTOS(实时操作系统)或者裸机程序。

为什么出现A核和M核的结合,可以给出下面的解释:

在嵌入式系统设计中,不同架构处理器间的数据交互机制直接影响系统整体性能。传统解决方案存在显著的技术瓶颈:采用UART、I2C等串行总线时,其固有的带宽限制难以满足现代应用对实时数据吞吐量的需求;而传统并口方案虽可提升传输速率,却需要消耗大量GPIO资源,导致PCB布局复杂度增加和BOM成本上升。

为突破这一技术困境,新一代多核异构处理器通过架构创新实现了性能与成本的平衡。这类芯片采用ARM big.LITTLE理念的演进架构,将Cortex-A系列应用处理器与Cortex-M系列实时控制器集成于单晶圆,通过高速片上总线(如AXI)实现异构核间通信。典型代表包括:
- NXP i.MX8系列:采用Arm CoreLink NIC-400互连架构,实现A72+M7核间延迟<200ns
- 瑞萨RZ/G2L:创新性采用双通道OCRAM共享内存,支持A55核与M33核的零拷贝数据传输
- TI AM62x:集成专用MSMC缓存控制器,确保A53核与R5F核的缓存一致性

这种异构架构的关键优势在于:
- 物理层优化:消除片外总线传输,将通信延迟降低2个数量级
- 资源复用:共享外设控制器,减少40%以上的引脚占用
- 能效提升:通过任务卸载机制,降低整体功耗30%以上
- 实时保障:M核独立处理中断敏感型任务,确保系统实时响应性
当前这类处理器已广泛应用于工业物联网网关、智能座舱域控制器等场景,有效解决了传统架构在边缘计算设备中面临的性能与成本矛盾

2. 核间通信的三种方式

本文主要篇幅具体是说驱动层通过 RPMsg 和 remoteproc 框架 实现核间通信,其他暂简约概述。

2.1 硬件层——共享内存通信

共享内存通信是多核系统中使用的一种方法,其中多个处理器内核(如 Cortex-A 和 Cortex-M 内核)共享一个公共内存区域。
基本思想是拥有一部分内存,所有参与的内核都可以访问,使它们能够读取和写入共享变量。

2.2 驱动层——RPMSG 多点通信

RPMsg(Remote Processor Messaging),即远程处理器消息传递,是一个框架,支持在多核系统中实现主处理器(例如 Cortex-A)和多个从处理器(例如 Cortex-M)之间的通信。
虽然 RPMSG 使用共享内存作为其流程的一部分,但它通过一个更加用户友好的界面来回发送数据。还可以使用 remoteproc 框架 来控制其他内核 (开机/关机、加载固件,并使用 RPMSG 与远程内核通信

1)什么是 remoteproc 框架?

远程处理器 (RPROC) 框架允许不同的平台/架构控制(开机、加载固件、关机)远程处理器,同时抽象出硬件差异。此外,它还提供监控和调试远程协处理器的服务。

remoteproc 框架支持 2 种独占格式:

  • ELF 格式:Linux remoteproc 框架支持 ELF 格式
  • TEE 格式:OP-TEE remoteproc 框架支持 TEE 格式

有三种方法可以加载和启动远程处理器固件:

  • 通过 sysFS 接口启动固件。(本文重点介绍)
  • 在 remoteproc 驱动程序探测时自动启动固件(STMicroelectronics 不推荐)。
  • 在引导期间(在 Linux 引导之前)提前引导固件。

参考:Linux remoteproc 框架概述

2)怎么使用 remoteproc 框架?

  • 首先,我们可以通过下面这个指令查看该目录下的文件,这些文件是 Linux remoteproc 框架提供的用户空间接口,用于管理和监控远程处理器(如 Cortex-M 核或 DSP)。会在后面提到几个重要接口的使用,比如state可以查看改写从核的状态
ls /sys/class/remoteproc/remoteproc0/consumers device firmware name power state subsystem suppliers uevent
  • Linux 的 remoteproc 框架默认从 /lib/firmware 目录加载远程处理器的固件文件(如 Cortex-M 核的 .elf 文件)。
    所以如果我们已经在自己的编译平台构建生成了可执行文件 *.elf,可以通过scp命令把它放入lib/firmware目录下。
    scp [源文件地址] [用户名]@[目标ip]:/lib/firmware
scp E:\\...\\GCC\\Release\\Hello_World.elf [user_name]@[ip]:/lib/firmware
  • 查看当前远程处理器(M核)的状态state(我们前面提到的remoteproc提供的用户接口):offline/running 状态
    • offline 表示从核(M 核)当前未运行任何固件,其资源(内存、外设等)处于可配置状态。在开始使用远程处理器之前,请确保其状态为offline,否则会出错
# 查看当前 M 核状态cat /sys/class/remoteproc/remoteproc0/state offline
  • 更新固件:现在就可以加载要上传的固件*.elf,将其名称写入/remoteproc/remoteprocX/firmware
echo <firmware>.elf > /sys/class/remoteproc/remoteproc0/firmware 
  • 重启从核(M核)以应用新配置:使用新固件启动远程处理器,写入start到文件state即可
echo start > /sys/class/remoteproc/remoteproc0/state  
  • 要停止远程处理器,类似的只需写入stop到文件state即可。
echo stop > /sys/class/remoteproc/remoteproc0/state  

参考:How to Use RemoteProc

2.3 应用层——双核通信实现方式

在应用层,对A核可使用open、write和read函数对 /dev下设备文件进行调用;对M核,可使用rpmsg_lite_remote_init、rpmsg_lite_send和rpmsg_queue_recv函数进行调用,不做重点阐述。
参考:兼具A核和M核的多核异构处理器,A核与M核如何通讯