0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

AWorksLP 样例详解(MR6750)——双核通信

ZLG致远电子 2023-09-27 08:26 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

AWorksLP 对外设进行了高度抽象化,为同一类外设提供了相同的接口,应用程序可以轻松跨平台。本文以MR6750平台为例,介绍AWorksLP 双核通信的基本用法。

881d3c96-5ccc-11ee-9788-92fbcf53809c.jpg  简介

通信信箱MBX 有2 套寄存器访问接口,接口A 和接口B。A 和B 接口都具有一套TX FIFO 寄存器、RX FIFO

寄存器、控制寄存器和状态寄存器。用户从A 接口的发送端TX 发送的数据,可以在B 接口的接收端RX 接收到。同理,A 接口的接收端RX 可以接收到B 接口发送端TX 发送的数据。

双核烧录的用法请参考《AWorksLP样例详解(MR6750)——双核烧录》

双核调试的用法请参考《AWorksLP样例详解(MR6750)——双核调试》


881d3c96-5ccc-11ee-9788-92fbcf53809c.jpg  双核通信

1. MBX信箱

{SDK}\demos\multi-core\openamp路径下为openamp的例程。双核通信需要使用信箱在gui上勾选对应的信箱接口,hart0和hart1需勾选同一个信箱的两个不同接口。例如hart0勾选了mbx0a、则hart1需勾选mbx0b。

883b8e76-5ccc-11ee-9788-92fbcf53809c.png

图1 mbx设备

2.OpenAMP

OpenMP是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受,用于共享内存并行系统的多处理器程序设计的一套指导性编译处理方案。

3.例程

#if CONFIG_AW_OPENAMP_MASTERaw_local int rx_callback (struct rpmsg_endpoint *ept, void *data, size_t len, uint32_t src, void *priv){ aw_kprintf("[Master receive]: %s\n", data); return 0;}#elseaw_local int rx_callback (struct rpmsg_endpoint *ept, void *data, size_t len, uint32_t src, void *priv){ char sendbuf[512];
aw_kprintf("[Slave receive]: %s\n", data); aw_snprintf(sendbuf, sizeof(sendbuf), "%s ACK", data); if (rpmsg_send(&__resmgr_ept, sendbuf, strlen(sendbuf) + 1) < 0) {        aw_kprintf("[Slave send]: error!\n");    }    return 0;}#endif

aw_local int __mail_box_notify(void *priv, uint32_t id){ uint32_t tmp;
#if CONFIG_AW_OPENAMP_MASTER /* master to remote */ if (id == VRING1_ID) { /* send msg */ tmp = EPT_SEND_MSG_FLAG; } else { /* remote to master */ /* send ack */ tmp = EPT_SEND_ACK_FLAG; }#else if (id == VRING1_ID) { /* send ack */ tmp = EPT_SEND_ACK_FLAG; } else { /* send msg */ tmp = EPT_SEND_MSG_FLAG; }#endif
aw_write(__g_mbx_fd, &tmp, 4); return 0;}

/* 处理其它设备发送过来的MBX */aw_local void __openamp_task(void *p_arg){
struct rpmsg_virtio_device *p_dev = (struct rpmsg_virtio_device *)p_arg;
aw_kprintf("Entry OpenAMP task!\n");
while(1) { uint32_t tmp;
aw_read(__g_mbx_fd, &tmp, 4);
/* * 默认Master VRING0是接收, VRING1是发送, 从机反之 */#if CONFIG_AW_OPENAMP_MASTER if (tmp == EPT_SEND_MSG_FLAG) {
/* 接收到来自从机的消息 */ rproc_virtio_notified(p_dev->vdev, VRING0_ID); } else {
/* 接收到来自从机的ACK */ rproc_virtio_notified(p_dev->vdev, VRING1_ID); }#else
if (tmp == EPT_SEND_MSG_FLAG) { rproc_virtio_notified(p_dev->vdev, VRING1_ID); } else { rproc_virtio_notified(p_dev->vdev, VRING0_ID); }#endif }}
void rpmsg_demo(){ int ret = 0;#if CONFIG_AW_OPENAMP_MASTER int i = 0; int RPMsgRole = 0;#else int RPMsgRole = 1;#endif
__g_mbx_fd = aw_open(CONFIG_MBX_CHOOSE, AW_O_RDWR, 0);
ret = aw_openamp_init(&rpmsg_dev, RPMsgRole, NULL, __mail_box_notify);
#if CONFIG_AW_OPENAMP_MASTER /* 启动固件 */ ret = aw_openamp_remoteproc_init(&__aworks_rproc_ops); if (ret) { aw_kprintf("Start processor fail!\n"); }#endif
if (ret) { aw_kprintf("OpenAMP init error!\n"); while(1); }
aw_openamp_create_ept(&rpmsg_dev, &__resmgr_ept, "rpmsg-client-sample", 0xFFFFFFFF, rx_callback, NULL);
aw_openamp_ep_poll_task_start(&rpmsg_dev); aw_openamp_wait_ept_ready(&__resmgr_ept);
while(1) {
#if CONFIG_AW_OPENAMP_MASTER char sendbuf[512]; aw_snprintf(sendbuf, sizeof(sendbuf), "AWorks %d", i); aw_kprintf("[Master send]: %s\n", sendbuf); if (aw_openamp_send(&__resmgr_ept, sendbuf, strlen(sendbuf) + 1) < 0) {            aw_kprintf("[Master send]: error!\n");        }        i++;#else        aw_kprintf("Salve is alive!\n");#endif        aw_mdelay(100);    }}

由于篇幅原因本文仅截取部分关键代码。

  • 在rpmsg_demo中使用aw_open打开信箱、使用aw_openamp_init并注册__mail_box_notify函数;
  • 在__mail_box_notify函数中发送相应的标记、使用aw_openamp_remoteproc_init函数注册__aworks_rproc_ops,参数中是各运行阶段的函数接口;
  • 使用aw_openamp_create_ept函数注册rx_callback接收回调函数,当作为主核时打印从核发送的数据,当作为从核时将收到的数据发送回去;
  • 使用aw_openamp_ep_poll_task_start函数创建一个任务,任务的函数入口为__openamp_task,在__openamp_task函数中根据读到的标记做相应的处理。

使用aw_openamp_wait_ept_ready函数等待从机准备好。

在while循环中主核使用aw_openamp_send函数循环的发送数据、从核在rx_callback回调函数中将主核发送的数据发送回去、串口打印如下图。885177ae-5ccc-11ee-9788-92fbcf53809c.png

图2串口打印

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    9662

    浏览量

    157987
  • 通信
    +关注

    关注

    18

    文章

    6508

    浏览量

    140467
  • 双核
    +关注

    关注

    0

    文章

    40

    浏览量

    15646
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    集成式临界模式PFC和准谐振电流模式PWM控制器FAN6920MR:设计与应用详解

    集成式临界模式PFC和准谐振电流模式PWM控制器FAN6920MR:设计与应用详解 在现代电源设计领域,高度集成化的控制器成为了提升电源性能、降低成本的关键。今天,我们就来深入探讨安森美
    的头像 发表于 06-01 16:25 91次阅读

    探索NSM4002MR6:用于LED驱动的NPN晶体管

    探索NSM4002MR6:用于LED驱动的NPN晶体管 在电子工程师的设计工作中,选择合适的晶体管对于LED驱动电路的性能至关重要。今天,我们将深入探讨安森美(onsemi)的NSM4002MR
    的头像 发表于 05-20 11:35 336次阅读

    ADRF6750:950 MHz - 1575 MHz 集成式正交调制器的技术解析

    ADRF6750:950 MHz - 1575 MHz 集成式正交调制器的技术解析 在当今的通信领域,对于高性能、集成化的射频器件需求日益增长。ADRF6750 作为一款高度集成的正交调制器、频率
    的头像 发表于 05-08 17:30 405次阅读

    展同启·“芯”品首发|度亘芯重磅新品亮相上海光博会 美国OFC!

    海内外同步发声硬核实力耀全场3月17、18日,美国OFC光通信展与慕尼黑上海光博会重磅启幕,度亘展齐发,同步亮相美国光通信展览会(OFC)与慕尼黑上海光博会两大顶级盛会。通过“海
    的头像 发表于 03-18 20:16 809次阅读
    <b class='flag-5'>双</b>展同启·“芯”品首发|度亘<b class='flag-5'>核</b>芯重磅新品亮相上海光博会 美国OFC!

    编码器:解锁未来科技的“密码”

    在人工智能与数据处理技术狂飙突进的时代,数据的高效处理与精准解析已成为企业竞争力的核心。当传统单编码器逐渐触及性能天花板, 编码器架构 正以“驱动”的颠覆性优势,重新定义数据处理的效率与精度
    的头像 发表于 03-05 08:39 584次阅读
    <b class='flag-5'>双</b>编码器:解锁未来科技的“<b class='flag-5'>双</b><b class='flag-5'>核</b>密码”

    固件烧录速度实测:JTAG比UART快6.8倍

    在批量生产场景中,固件烧录效率直接影响产线节拍与交付能力。如何选择最优烧录方式?本文以ZLG致远电子MR6450系列核心板为,通过实测数据为您解析。MR6450核心板MR6450是Z
    的头像 发表于 01-27 11:34 562次阅读
    固件烧录速度实测:JTAG比UART快6.8倍

    MR-VMU-RT1176快速上手:开启移动机器人车辆管理单元设计之旅

    MR-VMU-RT1176 简介 MR-VMU-RT1176 采用了 i.MX RT1176 MCU,其中一个 Arm® Cortex® - M7 内核运行频率高达 1 GHz
    的头像 发表于 12-24 11:30 816次阅读

    e203 软如何和FPGA通信

    求教e203 软如何和FPGA通信
    发表于 11-07 06:15

    基于开源鸿蒙的图片编辑开发(2)

    本期内容介绍基于开源鸿蒙在RK3568上开发图片编辑的全流程,分为上篇和下篇,本篇为下篇,主要介绍标记、保存图片功能。
    的头像 发表于 10-31 09:19 3471次阅读
    基于开源鸿蒙的图片编辑开发<b class='flag-5'>样</b><b class='flag-5'>例</b>(2)

    基于开源鸿蒙的图片编辑开发(1)

    本期内容介绍基于开源鸿蒙在RK3568上开发图片编辑的全流程,分为上篇和下篇,本篇为上篇,主要介绍添加相册图片、编译图片功能。
    的头像 发表于 10-31 09:16 3352次阅读
    基于开源鸿蒙的图片编辑开发<b class='flag-5'>样</b><b class='flag-5'>例</b>(1)

    蜂鸟E203移植到FPGA开发板前的IP化工作

    蜂鸟E203软工作的主频为16MHz高频时钟和3.2768KHz低频时钟,并且不同开发板提供的晶振频率不同,因此需要化mmcm IP和reset IP将外部晶振时钟转换为
    发表于 10-27 07:35

    如何在rt-thread studio上开发STM32H747这类的单片机?

    如题,我希望在rt-thread studio上开发STM32H747IIT6这款单片机,在keil里两个的代码是完全隔离的,分别在两个工程中编写。 但是在rt-thread studio上生成的标准版工程只有一个工程,想
    发表于 09-19 08:08

    深入芯驰D9360通信案例,RPMSG关键技术深度剖析

    Core-D9360平台为详解如何利用RPMSG与VirtIO机制实现A与R间的可靠通信,并提供关键代码实现与调试方法。图1Core
    的头像 发表于 09-10 08:31 1482次阅读
    深入芯驰D9360<b class='flag-5'>核</b>间<b class='flag-5'>通信</b>案例,RPMSG关键技术深度剖析

    单核CPU网关和CPU网关有什么区别

    单核CPU网关与CPU网关的核心区别在于处理能力、多任务效率、性能表现及适用场景,CPU网关在多任务处理、复杂计算和响应速度上具有显著优势,而单核CPU网关则更适合轻量级、低负
    的头像 发表于 07-05 14:37 1465次阅读

    请问的芯片如何调试?

    的芯片如何调试?比如有很多M4+M0的芯片,是分开调试合适可以一起调试?
    发表于 06-19 07:32