查看: 4421|回复: 0

[经验] TI C6000 TMS320C6678 ZYNQ OpenAMP 双核ARM 通信案例开发手册之echo_...

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

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2021-7-5 16:02:14 | 显示全部楼层 |阅读模式
    分享到:
    ​目录
    前 言
    1 echo_test案例
    1 案例功能
    2 操作说明
    3 关键代码
    3.1 linux_demo代码说明
    3.2 freertos_demo代码说明
    3.3 baremetal_demo代码说明

    前 言
    本文主要介绍ZYNQ基于OpenAMP框架的双核ARM通信案例的使用说明,CPU0(Master)运行Linux系统,CPU1(Remote)运行裸机或FreeRTOS程序。CPU0使用remoteproc加载CPU1程序,并对CPU1进行配置。

    ​图 1
    表 1


    目录说明
    linux_demobinCPU0应用程序可执行文件
    srcCPU0应用程序源码
    freertos_demobinCPU1 FreeRTOS可执行文件
    projectCPU1 FreeRTOS工程
    baremetal_demobinCPU1裸机可执行文件
    projectCPU1裸机工程
    echo_test案例
    案例功能
    案例功能:CPU0使用RPMsg向CPU1发送数据,CPU1接收到数据后再使用RPMsg向CPU0回传数据。CPU0对回传的数据进行验证,并输出验证结果。
    操作说明
    将CPU1裸机或FreeRTOS可执行文件复制到评估板文件系统“/lib/firmware/”目录下,并执行如下命令加载CPU1程序。
    Target# echo echo_test.elf > /sys/class/remoteproc/remoteproc0/firmware
    Target# echo start > /sys/class/remoteproc/remoteproc0/state

    ​图 2
    执行如下命令加载RPMsg驱动,并在“/dev/”目录下生成RPMsg设备节点。RPMsg驱动源码为内核“drivers/rpmsg/”目录下的rpmsg_user_dev_driver.c文件。
    Target# modprobe rpmsg_user_dev_driver

    ​图 3
    将CPU0应用程序可执行文件复制到评估板文件系统,并执行如下命令通过RPMsg与CPU1进行通信。
    Target# ./echo_test

    图4
    输入1,并按回车键进行测试。

    ​图 5

    ​图 6
    输入2,并按回车键退出测试。

    ​图 7
    执行如下命令,停止CPU1程序。
    Target# echo stop > /sys/class/remoteproc/remoteproc0/state

    ​图 8
    关键代码
    linux_demo代码说明
    打开RPMsg驱动设备节点。


    ​图 9
    向CPU1发送数据,并对从CPU1回传的数据进行验证。

    ​图 10
    freertos_demo代码说明
    创建processing任务。

    ​图 11
    (2)在processing()中进行函数调用。

    ​图 12
    调用init_system()初始化libmetal库与GIC控制器等。

    图13
    绑定中断号与中断服务函数,中断号需与设备树配置的中断号一致。

    ​图 14

    ​图 15
    调用platform_create_proc()创建平台相关信息。


    ​图 16
    调用get_resource_table()获取资源表信息,资源表包含内存和virtio设备资源。virtio设备包含vring地址、vring大小和vring对齐方式等信息。

    ​图 17
    (13)以上函数调用成功后,再调用app()。

    ​图 18
    调用remoteproc_resource_init()对之前获得的平台信息、资源表信息进行处理。创建Remote Device,并为其设置增加、删除、读取RPMsg通道函数。

    图 19
    调用hil_poll()以阻塞的方式调用poll函数,并等待数据接收。

    ​图 20

    ​图 21
    在数据读取函数rpmsg_read_cb()中,将接收到的数据放入缓冲区后产生数据接收事件,并在app()中进行事件处理。


    ​图 22
    在virtio设备复位函数virtio_rst_cb()中产生复位virtio事件,并在app()中进行事件处理。

    ​图 23
    在RPMsg通道创建函数rpmsg_channel_created()中,创建一个全局RPMsg端点,并设置端点读取函数。RPMsg通信通过端点完成,与USB类似。

    ​图 24
    在RPMsg通道删除函数rpmsg_channel_deleted()中,删除RPMsg端点同时产生通道删除事件,并在app()中进行事件处理。

    ​图 25
    baremetal_demo代码说明
    由于裸机与FreeRTOS程序相似,因此baremetal_demo代码说明可参考freertos_demo代码说明小节,下面对部分代码进行补充说明。
    在main()中调用init_system()初始化libmetal库与GIC控制器等。调用platform_create_proc()创建平台相关信息。调用get_resource_table()获取资源表信息。以上函数调用成功后,再调用app()。

    ​图 26
    调用remoteproc_resource_init()对之前获得的平台信息、资源表信息进行处理。创建Remote Device,并为其设置增加、删除、读取RPMsg通道函数。

    ​图 27
    在数据读取函数rpmsg_read_cb()中,对从CPU0接收到的数据进行判断,并进行不同处理(关机或回传数据),实现通信和生命周期管理。

    ​图 28


    回复

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-12-19 02:58 , Processed in 0.120559 second(s), 18 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.