IPC多核异构核间通信机制

Remoteproc/RPMsg驱动程序和IPC驱动程序的通信

核间通信

在多核异构系统中,核间通信很重要,此处以TI-AM62X系列开发板为例进行说明。AM62X系列有A53主核与M4F和R5F远程核心。在M4F核中可以依赖Remoteproc/RPMsg驱动程序和IPC驱动程序远程启动或关闭核心(这需要相关的IPC_Notify设置),A53核通过Remoteproc驱动启动M4F,M4F通过IPC驱动与A53核建立通信,双方使用RPMsg驱动收发信息。
在这里插入图片描述

Remoteproc驱动工作流程

在这里插入图片描述
1.指定PRU固件名称并启动
2.验证PRU固件二进制文件是否存在,并读取,解析.resource_table(固件所需要的系统资源).resource_table应该链接到该段内存的开头部分
3.请求资源,包括在DDR内存中创建vring空间以进行通信,以及在PRU子系统INTC模块中设置中断映射
4.pru_rproc模块将二进制文件加载到PRU的指令RAM中,并且还将资源表复制到PRU数据RAM空间中
5.pru_rproc模块指示PRU内核开始执行

RPMsg工作流程

在这里插入图片描述

ARM to PRU(A53 > M4F)

在这里插入图片描述

PRU to ARM(M4F > A53)

在这里插入图片描述

AM62X-IPC结构框图

在这里插入图片描述

  • IPC RP Message:
    • 不同的CPU利用逻辑端点(端口)进行通信,通信形式是收发数据包缓冲区
    • 数据包缓冲区是一个共享内存,CPU均可访问
    • 当数据包放入共享内存时,需要通知另一个CPU有数据待处理(IPC_Notify),该机制为硬件中断(Mail Box Driver)
    • 数据包分组大小
    • 有一端为Linux时,数据大小固定为512字节,其中头占16个字节,可用字节 512-16 = 496 byte
    • 两端皆为RTOS/NORTOS时,数据包大小可自定义(4 ~ 512)
    • 当一端为Linux时,只能使用IPC RP Message
    • 当需要传输大于数据包大小的更大数据时,建议在消息包中传递一个指向数据缓冲区的“指针”或“偏移量”,而不是复制消息本身中的数据
  • IPC Notify:
    • CPU使用低级HW中断机制简单地中断或通知其它CPU
    • 延迟低
    • IPC RP Message 可使用 IPC Notify 接口 进行消息通知(中断控制)
  • Mail Box Driver:
    • 拉起Mail Box Controller,通过消息队列和中断驱动信号处理多处理器间的通讯
    • 注册控制器,控制器接收数据发送至远程核心
    • 接收来自远程核心的中断,并调用Cilent提供的回调函数通知Cilent
    • 拉起Mail Box Cilent,Cilent通过Controller提供的通道发信息给Controller
    • 申请通道,并调用驱动发送数据
    • 接受来自Controller的中断信息
      在这里插入图片描述

通用设计方案:

服务器和客户端之间的通信,也就是A53核和M4F核之间的通信。

  • M4F作为服务器,通常接收来自客户端(A53)的消息,并做出反应(计算或者读取状态等)
    • 创建RP消息端点,可创建多个端点(测试中体现为13,14)
    • 端点类似端口,CPU ID类似于IP地址。知道该端口和ID,就能向M4F发送消息
    • 等待接收消息
    • 接收消息包,消息包中包含命令,用来指示要执行的操作以及特定的参数
    • 如果参数过大,数据缓冲区中的参数应该指向另一个更大的共享存储空间,该存储空间保存实际数据或附加参数
    • 服务器应该了解发送方CPU ID和发送方应答端点
    • 处理完消息后,需要向发送方回复处理结果的ACK,ACK应包含命令状态和返回参数
  • A53作为客户端,向服务器发送消息
    • 创建RP消息端点以接收ACK。此端点可以是任何值(在测试中体现为1025,1026等),并且不需要与服务器端点匹配
    • 使用服务器CPU ID、服务器端点ID和应答端点ID调用发送API
    • 发送API包括要发送的数据包,该数据包中填充有要执行的命令和命令的参数
    • 发送数据包后,它等待回复
    • 在得到回复后,它处理回复状态和结果

Demo测试

项目路径:ti/mcu_plus_sdk_am62x_09_00_00_19/examples/drivers/ipc/ipc_rpmsg_echo_linux/
编译流程:导入项目至CCS > 配置example.syscfg文件,添加IPC通信模块 > 配置Linker.cmd文件,添加资源表和ipc_vring_mem内存空间 > Build项目 > 移植到开发板 > 启动程序
测试流程:使用自带的测试程序rpmsg_char_simple进行测试,从linux控制台启动M4F和自定义测试rpmsg_char_simple可参见https://software-dl.ti.com/processor-sdk-linux/esd/AM62X/08_06_00_42/exports/docs/linux/Foundational_Components_IPC62x.html
详细测试流程和BUG处理见文章【AM62开发板配置踩坑】

Linker.cmd文件部分字段含义对照表如下:
在这里插入图片描述
在这里插入图片描述

DMA内存分割

在example.syscfg配置中有关于系统内存划分的部分,用于IPC和远程处理器的代码/数据部分需求,默认内存划分如下:
在这里插入图片描述
在这里插入图片描述
根据相关文档描述,前1M空间为Virtio and Vring的缓冲区。后面的14M/12M空间为远程核心的代码和数据存储区。
对应Linker.cmd文件发现,前3M空间被设置为IPC_VRING_MEM数据存储区域。
内存映射的修改可参考文献【2,3】

性能测试

rpmsg_char_simple

在这里插入图片描述

rpmsg_char_zerocopy

在这里插入图片描述
上述对比的是单次发送数据,其中send表示linux侧的send函数调用时间,实际上并不是消息发送的M4F得时间,recv表示(M4F接收消息+M4F发送消息+linux接收消息)的时间
rpmsg_char_zerocopy本质上是为了传输大量数据(超过512字节,以K或M为单位的数据),并不想要频繁的访问。zerocopy策略本质上是DMA共享内存方式
想要更好地对比上述两个示例的速度,应该关注发送数据的大小,而不是次数,即发送相同大小的数据,所耗费的时间。
TI官方回复贴:https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1330423/am625-rpmsg_char_zerocopy-performance

// rpmsg_char_simple示例
//Define 1MB of data to send between Linux & remote core
// it is probably easiest to just run the RPMsg_echo example
// 1048576 bytes / 496 bytes = 2,115 times
// i.e., 4230 total messages get sent, 2,115 messages in each direction
// this avoids potential issues like overflow if we were sending 2,115 messages
// back-to-back from Linux to the remote core, or vice versa
start_time
send & receive messages
end_time
total_time = end_time - start_time


//rpmsg_char_zerocopy
// define a 1MB region of shared memory
start_time
write 1MB of data to the shared memory region
send RPMsg
wait for RPMsg reply
// while we are waiting:
// remote core receives RPMsg, reads in the 1MB of data, writes 1MB of data
// then remote core sends an RPMsg
read 1MB of data from the shared memory region
stop_time

测试结果

在这里插入图片描述

【参考文献】:

1.https://dev.ti.com/tirex/explore/node?a=XaWts8R__8.6.0.42%20v1&a=sKXaSas__09.00.00.19&node=A__AD2nw6Uu4txAz2eqZdShBg__com.ti.MCU_PLUS_SDK_AM62X__sKXaSas__09.00.00.19&r=sKXaSas__08.06.00.18&r=uiYMDcq__9.00.00.00%20v1 
2.https://software-dl.ti.com/processor-sdk-linux/esd/AM62X/08_06_00_42/exports/docs/linux/Foundational_Components_IPC62x.html
3.https://dev.ti.com/tirex/explore/node?node=A__AZgEw2fWxmvPzpRgXlGAMQ__AM62-ACADEMY__uiYMDcq__LATEST
4.https://dev.ti.com/tirex/content/am62x_academy_9_00_00_00_v1.new_id/_build_am62x_academy_9_00_00_00_v1/source/multicore/multicore-dev/remote-core-app-dev.html
5.https://software-dl.ti.com/processor-sdk-linux/esd/AM62X/08_06_00_42/exports/docs/linux/Foundational_Components/PRU-ICSS/Linux_Drivers/RPMsg.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值