前言
很多异构核心使用的是标准的OpenAMP,OpenAMP(Open Asymmetric Multi-Processing)是一个开源的软件框架,用于在异构多核处理器系统中实现多核处理。异构多核系统通常包含具有不同性能和功能的不同类型处理器核心,例如,一个系统可能同时包含高性能的ARM Cortex-A核心和低功耗的ARM Cortex-M核心。
NXP的RPMsg-Lite
RPMsg-Lite是Remote Processor Messaging (RPMsg)协议的轻量级实现。RPMsg协议定义了一个标准化的二进制接口,用于异构多核系统中的多个核心之间的通信。
与Open Asymmetric Multi Processing (OpenAMP)框架的RPMsg实现相比,RPMsg-Lite提供了代码尺寸减小、API简化和改进的模块化。在基于较小的Cortex-M0+系统的场合,建议使用RPMsg-Lite。
小型MCU系统通常不实现动态内存分配。RPMsg-Lite中静态API的创建使得资源使用进一步减少。动态分配不仅增加了大约5 KB的代码大小,而且通信速度更慢,确定性更差,这是动态内存引入的特性。下表显示了OpenAMP RPMsg实现与新的RPMsg-Lite实现之间的一些粗略比较数据:

RPMsg-Lite的源码框架
RPMsg-Lite的实现可以分为三个子组件,其中两个是可选的。核心组件位于rpmsg_lite.c
。两个可选组件用于实现阻塞接收API(在rpmsg_queue.c
中)和动态"命名"端点创建和删除公告服务(在rpmsg_ns.c
中)。
情况如下图所示:

下图显示了RPMsg在类似ISO/OSI分层模型中的作用:

在这个模型中,RPMsg协议位于传输层,它负责在不同处理器核心之间提供可靠的数据传输服务。端点(endpoints)是RPMsg协议中的基本通信单元,每个端点可以被视为一个独立的通信通道,它们通过共享内存(例如vring或virtqueue)进行数据交换。
和其他的Linux SoC使用的rpmsg差不多,nxp使用的是共享内存和中断通知的方式,实现两个核心的互相通信。市面上也有一些RAM更小的设备,使用的是mailbox和中断的方式来实现异步核心通信。
核间通信的过程中,rpmsg-lite大致是这么处理的:
- 配置共享内存区域(两个核心都可以访问),用于存放vitrqueue的数据,以及共享数据的buffer
- 硬件中断
- 发送中断:准备好数据后通知另一个核心取数据
- 接收中断:另一个核心接收到终端后,从共享内存读数据
- 接收完成中断:接收完数据后,通知发送方数据已经被收完了
- 发送完成中断:发送方接收后知道自己数据被处理完了
总结
rpmsg-lite是轻量级的异构通信组件,nxp的代码结构也是挺不错的,层级划分做的挺好。