目录
一、关键术语解释
二、Mailbox与rpmsg对比
三、rpmsg传输流程
异构核间数据通过共享内存实现数据传递,通过中断来触发发送、接收。
一、关键术语解释
IPC
Inter-Processor Communication
MailBox
IP which provides queued interrupt mechanism for communication channel
VRing
Ring Buffer in shared memory
Rpmsg
Remote Processor Messaging,queue on local memory
二、Mailbox与rpmsg对比
Mailbox
- 支持数据长度:4Bytes * 15reg = 60Bytes (不同SoC可能不同)
- 传输方式:直接使用mbox寄存器
- 应用场景:简单控制命令,比如相机启流停流
rpmsg
- 支持数据长度:512Bytes(496Bytes数据有效载荷,前16Bytes称为rpmsg标头,由传输层内部使用,其中包含源地址、目标地址和数据大小。)
- 传输方式:使用mbox作为中断传递,在mbox中传递vqid(Virtual Queue ID,标识虚拟消息队列的id),实际的IPC数据存在rpmsg-buf区的VRing中。
- 应用场景:较长控制命令
注意,上述数据长度芯片厂商都是可以修改,甚至rpmsg的实现方式。
另有共享内存方案,也是基于Mailbox,会比rpmsg传输内容更多,没有被广泛采用,在此不做深入探讨。有兴趣看下面博客:
https://betheme.net/qianduan/5063.html?action=onClickhttps://betheme.net/qianduan/5063.html?action=onClick
三、rpmsg传输流程
rpmsg的步骤顺序描述如下:
1、应用程序向给定目的地(CPU、端点)发送消息
2、消息首先从应用程序复制到两个CPU之间使用的VRING。 此后,IPC 驱动程序在硬件邮箱中发布 VRING ID。
3、这会触发目标 CPU 上的中断。 在目标 CPU 的 ISR 中,它提取 VRING ID,然后根据 VRING ID 检查该 VRING 中的任何消息
4、如果收到消息,它从VRING中提取消息并将其放入目标RPMSG端点队列中。 然后触发在此 RPMSG 端点上阻止的应用程序
5、然后应用程序处理接收到的消息,并使用相同的RPMSG 和VRING 机制在相反方向回复发送方CPU。
Core1
application调用rpmsg_send接口,把数据copy到本地queue
virtio-ring把data从localqueu搬运到共享内存中的vring中
同时写mailbox寄存器进行kick操作
Core2
触发IPC中断
中断处理函数中把数据从vring中搬运到localqueue
中断处理函数callback,receivecount ++
上层APP调用rpmsg_recv,把数据copy到应用中去