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串口打印

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

    关注

    30

    文章

    6928

    浏览量

    147273
  • 通信
    +关注

    关注

    17

    文章

    5365

    浏览量

    133569
  • 双核
    +关注

    关注

    0

    文章

    36

    浏览量

    14915
收藏 人收藏

    评论

    相关推荐

    如何使HPM6750工作在模式上呢

    6750MINI,我想让HPM6750工作在模式。为何我在RT-Thread Settings中打开对称多处理器会报错:报错内容:error: conflicting
    发表于 10-14 11:00

    hpm6750与RT-Thread怎么一起运行呢?

    6750运行rt-tnread怎么一起运行是不是还么适配SMP .没适配SMP是不是rt-thread下不能运行。
    发表于 01-31 15:41

    6750核能同时使用HDMA吗?如果我都想使用DMA的话怎么办?

    6750核能同时使用HDMA吗?如果我都想使用DMA的话怎么办?
    发表于 05-26 07:52

    请问如何使用embedded studio调试 6750evk 的例程?

    6750evk 的例程? 在HPM_SDK中, 我只看到了脚本的
    发表于 05-26 06:47

    非对称MCU基础知识及通信

    MCU开始(以LPC4350为),展开介绍了非对称MCU的基础知识与重要特点。接下来,重点介绍了通信的概念与几种实现方式,尤其是基于消息池的控制/状态
    的头像 发表于 03-13 15:47 4664次阅读
    非对称<b>双</b><b>核</b>MCU基础知识及<b>核</b>间<b>通信</b>

    【产品应用】AWorksLP详解MR6450)-- GPIO

    AWorksLP对外设进行了高度抽象化,为同一类外设提供了相同的接口,应用程序可以轻松跨平台。本文以MR6450平台为,介绍AWorksLP GPIO外设基本用法。    简介 GPIO
    的头像 发表于 12-16 11:40 323次阅读

    【产品应用】AWorksLP 详解MR6450)——UART

    AWorksLP 对外设进行了高度抽象化,为同一类外设提供了相同的接口,应用程序可以轻松跨平台。本文以MR6450 平台为,介绍AWorksLP UART 外设基本用法。    简介 UART
    的头像 发表于 12-23 22:05 450次阅读

    【产品应用】AWorksLP 详解MR6450)——PWM(单通道)

    AWorksLP 对外设进行了高度抽象化,为同一类外设提供了相同的接口,应用程序可以轻松跨平台。本文以 MR6450 (点击了解详情) 平台为,介绍AWorksLP PWM 外设基本用法
    的头像 发表于 01-04 23:15 431次阅读

    【产品应用】AWorksLP 详解MR6450)—— HWTimer

    AWorksLP 对外设进行了高度抽象化,为同一类外设提供了相同的接口,应用程序可以轻松跨平台。本文以 MR6450 (点击了解详情) 平台为,介绍AWorksLP HWTimer 外设基本用法
    的头像 发表于 02-01 21:55 373次阅读

    【产品应用】AWorksLP例程介绍(MR6450)—— SD卡

    AWorksLP对存储类设备进行了高度抽象化,为存储类设备提供了通用的文件操作接口,应用程序可以轻松跨平台。本文以MR6450平台为,介绍AWorksLP基于FatFs的SD卡的基本用法。简介SD
    的头像 发表于 05-10 09:42 122次阅读
    【产品应用】<b>AWorksLP</b>例程介绍(<b>MR</b>6450)—— SD卡

    AWorksLP 详解MR6750)——调试

    AWorksLP对外设进行了高度抽象化,为同一类外设提供了相同的接口,应用程序可以轻松跨平台。本文以MR6750平台为,介绍AWorksLP调试的基本用法。简介MR6750是集成了两个
    的头像 发表于 09-23 08:26 86次阅读
    <b>AWorksLP</b> <b>样</b><b>例</b><b>详解</b>(<b>MR6750</b>)——<b>双</b><b>核</b>调试