一:基本原理
消息传递单元(MU)模块使芯片内的两个内核能够通过 MU 接口传递消息(如数据、状态和控制)来进行通信和协调。该 MU 还可以使一个核使用中断向另一个核发出信号。
1 Core A 写入数据;
2 MU 将 Tx 空位清 0,Rx 满位置 1;
3 产生接收中断请求,,通知 Core B 接收状态寄存器中的接收器满,可以读取数据;
4 Core B 响应中断,读取数据;
5 Core B 读完数据后,MU 将 Rx 满位清 0,Tx 空位置 1;
6 状态寄存器向 Core A 生成发送中断请求,告知 Core B 读完数据,发送寄存器空
二:程序架构
① Core A 发起数据传输
Core A 发送 DMA 请求以启动数据传输。
② DMA 数据传输
(1)DMA 确认;
(2)DMA 开始将数据从 Core A 指定的位置传输到指定的共享内存;
(3)DMA 产生中断告知 Core A 已完成数据传输。
③ Core A 通知 Core B 数据在共享内存中
使用 MU 单元 Core A 端传输寄存器,Core A 向 Core B 发送分组信息消息,以通知 Core B 存储在共享内存中有新的数据,该消息包含数据信息的命令、位置和长度。
④ Core B 收到中断
Core B 接收到一个中断,并且待定的处理任务变为活动状态,并处理来自内存的数据包。
⑤ Core B 读取数据,写入处理结果
(1)Core B 从共享内存中读取数据。
(2)Core B 将数据包处理的结果写入一个单独的缓冲区。
⑥ Core B 通知 Core A 传输已完成
在对数据的处理完成后,Core B 通知 Core A 数据已经读完,可以再次发送。
三:实验示例
3.1 编译A核示例程序
A核的的示例程序为ti-rpmsg-char,获取位置为:(OK6254-C_linux5.10.87+Qt5.14.2_ 用户资料_R2_20230110(更新日期:20230327))\Linux\源码),将其中的压缩文件OK6254-linux-sdk.tar.bz2.00,通过SCP传到ubutun虚拟机中,按如下方法解压:
md5sum OK6254-linux-sdk.tar.bz2.00
cat OK6254-linux-sdk.tar.bz2.00 | tar xj
完成后会有如下的目录,进入appsrc/ti-rpmsg-char中即是A核的示例程序,交叉编译此程序,将编译后的可执行文件传到开发板。
3.2 编译M核的示例程序
M核的程序为(E:\OK6254-C__MCU__08_04_00_16_ 用户资料_R1_20230210\源码\forlinx_mcu_plus_sdk_am62x_08_04_00_16\examples\drivers\ipc\ipc_rpmsg_echo_linux\am62x-sk),资料获取位置如下图:
将M核的程序用TI的IDE重新编译并将,am62-mcu-m4f0_0-fw传到开发板的/lib/firmware目录下、
3.3 程序结果验证
将开发板重新上电,执行如下程序:./rpmsg_char_simple -r 9 -n 10, 其实现的效果是A核向M核先发送数据,M核接收后回传,再将数据返回供A核接收,传输10次。
需要注意的是-r 后面的参数需要为9,其他数字会失败,这是因为9对应的目的远端为M4核MCU,在rproc_id.h中定义了。