TI 的 AM62XX 系列的核间通信是基于 rpmsg实现M核与A核之前的通信,其原理基于共享内存传输数据,基于寄存器和中断传递状态,M 核负责模拟量采集,计算,保护逻辑,开入采集,开出动作等实时性较高的任务,A 核负责串口、网络、4G、蓝牙、WIFI、加密、触摸显示等任务。双核间交互实时模拟量、状态量、控制命令、时钟同步、录波文件等大量信息。

一:基本原理

消息传递单元(MU)模块使芯片内的两个内核能够通过 MU 接口传递消息(如数据、状态和控制)来进行通信和协调。该 MU 还可以使一个核使用中断向另一个核发出信号。
    1683357010(1).png
            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 读完数据,发送寄存器空
二:程序架构
             1683357222(1).png
            ① 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核的示例程序,交叉编译此程序,将编译后的可执行文件传到开发板。


            
          1683358070(1).png
    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),资料获取位置如下图:
         1683358401(1).png

        将M核的程序用TI的IDE重新编译并将,am62-mcu-m4f0_0-fw传到开发板的/lib/firmware目录下、
         1683358603(1).png
    3.3 程序结果验证
   将开发板重新上电,执行如下程序:./rpmsg_char_simple -r 9 -n 10, 其实现的效果是A核向M核先发送数据,M核接收后回传,再将数据返回供A核接收,传输10次。
    1683359140(1).png
             1683359269(1).png
   需要注意的是-r 后面的参数需要为9,其他数字会失败,这是因为9对应的目的远端为M4核MCU,在rproc_id.h中定义了。
    1683359446(1).png