查看: 1354|回复: 0

[资料] 嵌入式工程师进阶,基于AM64x开发板的IPC多核开发案例分享

[复制链接]
  • TA的每日心情
    无聊
    2021-9-1 13:41
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2023-3-1 16:05:39 | 显示全部楼层 |阅读模式
    分享到:
    前 言本文档主要说明AM64x基于IPC的多核开发方法。默认使用AM6442进行测试演示,AM6412测试步骤与之类似。
    适用开发环境如下:
    Windows开发环境:Windows 7 64bit、Windows 10 64bit
    虚拟机:VMware15.5.5
    Linux开发环境:Ubuntu 18.04.4 64bit
    Linux Processor SDK:ti-processor-sdk-linux-rt-am64xx-evm-08.01.00.39
    U-Boot:U-Boot-2021.01
    CCS版本:CCS11.2.0
    MCU+ SDK:mcu_plus_sdk_am64x_08_03_00_18
    SysConfig:sysconfig-1.12.1_2446
    GCC AARCH64 Compiler:gcc-arm-9.2-2019.12-mingw-w64-i686-aarch64-none-elf
    本文测试板卡为创龙科技SOM-TL64x核心板,它是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F设计的多核工业级核心板,通过工业级B2B连接器引出5x TSN Ethernet、9x UART、2x CAN-FD、GPMC、PCIe/USB 3.1等接口。核心板经过专业的PCB Layout和高低温测试验证,稳定可靠,可满足各种工业应用环境。


    用户使用核心板进行二次开发时,仅需专注上层运用,降低了开发难度和时间成本,可快速进行产品方案评估与技术预研。
    AM64x是SOC多核处理器,一般情况下,Cortex-A53核心运行Linux系统,Cortex-R5F/Cortex-M4F核心运行Baremetal(裸机)或RTOS(FreeRTOS等)。
    ARM基于Linux的remoteproc/rpmsg驱动程序,可以实现Linux内核与运行RTOS的从处理器上的IPC驱动程序通信,具体框图如下图所示。

    图 1




    IPC多核开发案例位于“4-软件资料\Demo\RTOS-demos\”目录下,案例project目录存放工程源码,bin目录存放可执行程序文件。
    表 1
    案例
    目录
    说明
    ipc_rpmsg_echo_linux
    bin
    可执行程序
    project
    工程源码
    ipc_rpmsg_echo_linux案例案例说明案例功能:基于RP Message的API实现Cortex-A53与Cortex-R5F核间通信,以及Cortex-A53与Cortex-M4F核间通信。
    程序框图如下图所示。



    图 2 程序框图


    RTOS工程创建了两个RPMsg端点,其中一个端点与Linux内核交换消息,另外一个端点用于与Linux用户空间、裸机或RTOS交换消息。



    图 3

    案例测试环境搭建请将案例bin目录下的am64-main-r5f0_0-fw、am64-main-r5f0_1-fw、am64-main-r5f1_0-fw、am64-main-r5f1_1-fw、am64-mcu-m4f0_0-fw可执行程序拷贝至评估板文件系统任意目录下。



    图 4


    进入评估板文件系统,执行如下命令,删除原来的软链接。
    Target# rm /lib/firmware/am64-main-r5f0_0-fw
    Target# rm /lib/firmware/am64-main-r5f0_1-fw
    Target# rm /lib/firmware/am64-main-r5f1_0-fw
    Target# rm /lib/firmware/am64-main-r5f1_1-fw
    Target# rm /lib/firmware/am64-mcu-m4f0_0-fw



    图 5

    执行如下命令,创建新的软链接。
    Target# ln -sf /home/root/am64-main-r5f0_0-fw /lib/firmware/am64-main-r5f0_0-fw
    Target# ln -sf /home/root/am64-main-r5f0_1-fw /lib/firmware/am64-main-r5f0_1-fw
    Target# ln -sf /home/root/am64-main-r5f1_0-fw /lib/firmware/am64-main-r5f1_0-fw
    Target# ln -sf /home/root/am64-main-r5f1_1-fw /lib/firmware/am64-main-r5f1_1-fw
    Target# ln -sf /home/root/am64-mcu-m4f0_0-fw /lib/firmware/am64-mcu-m4f0_0-fw



    图 6

    请将评估板重启,在系统启动过程中,Cortex-R5F、Cortex-M4F核心将会引导启动。在评估板文件系统执行如下命令,查询Cortex-R5F、Cortex-M4F核心与remoteproc关系。
    Target# head /sys/class/remoteproc/remoteproc*/name



    图 7

    Cortex-R5F、Cortex-M4F核心与remoteproc关系如下表所示。AM6412包含1个Cortex-R5F核心:r5fss0_0;AM6442包含4个Cortex-R5F核心分别为:r5fss0_0、r5fss0_1、r5fss1_0、r5fss1_1。


    表 2
    CPU核心
    remoteproc
    m4fss0_0
    remoteproc0
    r5fss0_0
    remoteproc1
    r5fss0_1
    remoteproc2
    r5fss1_0
    remoteproc3
    r5fss1_0
    remoteproc4
    备注:核心与remoteproc对应关系,请以实际情况为准。
    执行如下命令,可查看Cortex-M4F、Cortex-R5F核心程序运行日志。
    Target# cat /sys/kernel/debug/remoteproc/remoteproc0/trace0
    Target# cat /sys/kernel/debug/remoteproc/remoteproc1/trace0
    Target# cat /sys/kernel/debug/remoteproc/remoteproc2/trace0
    Target# cat /sys/kernel/debug/remoteproc/remoteproc3/trace0
    Target# cat /sys/kernel/debug/remoteproc/remoteproc4/trace0



    图 8


    功能测试本小节主要介绍如何基于RPMsg测试Cortex-A53与Cortex-M4F核间通信,以及Cortex-A53与Cortex-R5F核间通信。
    • 基于Linux应用程序测试
    本次测试使用TI官方提供的rpmsg_char_simple工具,我司提供的文件系统已移植该工具。
    进入评估板文件系统执行如下命令,查看程序相关参数。
    Target# rpmsg_char_simple -h



    图 9

    参数解析:
    rproc_id:核心ID,默认是0;
    num_msgs:发送的RPMsg数据包数量,默认是100;
    rpmsg_dev_name:RPMsg驱动设备节点,默认为不使用;
    remote_endpt:对端核心接收RPMsg的端点,默认为14。
    Cortex-M4F核心、Cortex-R5F核心对应的ID,如下表所示。
    表 3
    核心
    ID
    r5fss0_0
    2
    r5fss0_1
    3
    r5fss1_0
    4
    r5fss1_1
    5
    m4fss0_0
    9
    执行如下命令,Cortex-A53核心发送RPMsg数据包,Cortex-R5F核心(r5fss0_0)接收。
    Target# rpmsg_char_simple -r 2 -n 10

    图 10

    执行如下命令,Cortex-A53核心发送RPMsg数据包,Cortex-R5F核心(r5fss0_1)接收。
    Target# rpmsg_char_simple -r 3 -n 10



    图 11


    执行如下命令,Cortex-A53核心发送RPMsg数据包,Cortex-R5F核心(r5fss1_0)接收。
    Target# rpmsg_char_simple -r 4 -n 10



    图 12
    执行如下命令,Cortex-A53核心发送RPMsg数据包,Cortex-R5F核心(r5fss1_1)接收。
    Target# rpmsg_char_simple -r 5 -n 10



    图 13


    执行如下命令,Cortex-A53核心发送RPMsg数据包,Cortex-M4F核心(m4fss0_0)接收。
    Target# rpmsg_char_simple -r 9 -n 10



    图 14


    • 基于Linux驱动程序测试
    本次测试使用TI官方提供的rpmsg_client_sample驱动程序,我司提供的文件系统已移植该工具。
    执行如下命令,查看各个核心对应的virtio ID。
    Target# cd /sys/bus/virtio/drivers/virtio_rpmsg_bus
    Target# ls virtio* -l



    图 15


    表 4
    设备节点
    核心
    Virtio ID
    5000000.m4fss
    m4fss0_0
    0
    78000000.r5f
    r5fss0_0
    1
    78200000.r5f
    r5fss0_1
    2
    78400000.r5f
    r5fss1_0
    3
    78600000.r5f
    r5fss1_1
    4
    进入评估板文件系统执行如下命令,加载驱动,并设置RPMsg数据包数量为10。
    Target# modprobe rpmsg_client_sample count=10 //count表示发送的RPMsg数据包数量。



    图 16

    执行如下命令查看驱动运行信息,打印"incoming msg x (src:0xd)"表示数据收发成功,即核间通信成功。
    Target# dmesg | grep rpmsg_client_sample



    图 17

    案例编译打开CCS11.2.0软件,依次点击菜单栏"Project -> Import CCS Projects...",导入案例工程。



    图 18

    在弹出的如下界面,选中"ipc_rpmsg_echo_linux_am64x-evm_system_freertos",并勾选"Automatically import referenced projects found in same search-directory",然后点击Finish,导入Cortex-R5F核心与Cortex-M4F核心的全部工程。



    图 19

    在工程界面,右键选中ipc_rpmsg_echo_linux_am64x-evm_system_freertos,选择"Rebuild Project",重新编译全部工程。



    图 20


    编译完成后,将会在各个核心对应工程的Debug目录下生成可执行程序。



    图 21

    关键代码
    • 创建任务并调度任务运行。

    图 22

    • 等待Linux就绪。

    图 23
    • 创建两个接收RPMsg的任务:用于接收Linux内核、Linux用户空间、Cortex-R5F核心(r5fss0_0)的RPMsg。

    图 24
    • RPMsg接收任务。

    图 25


    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-12-19 01:36 , Processed in 0.107323 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.