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

    文章

    8527

    浏览量

    150869
  • 通信
    +关注

    关注

    18

    文章

    5979

    浏览量

    135876
  • 双核
    +关注

    关注

    0

    文章

    37

    浏览量

    15180
收藏 人收藏

    评论

    相关推荐

    全志T113异构处理器的使用基于Tina Linux5.0——异构通信验证

    6、通信验证 6.1、C906小创建通讯节点 在C906小串口终端建立两个通讯节点用于监听数据,输入eptdev_bind test
    发表于 11-20 09:47

    在FPGA里面化了8个jesd204B的ip同步接收8块AFE芯片的信号,怎么连接设备时钟和sysref到AFE和FPGA?

    各位有人用过AFE58JD48吗,我在FPGA里面化了8个jesd204B的ip同步接收8块AFE芯片的信号,怎么连接设备时钟和sysref到AFE和FPGA?我看LMK04821这个时钟芯片
    发表于 11-18 07:51

    HPM6750 Bootloader设计

    我正在做一个hpm6750evk2的bootloader。设计很简单,boot工程代码只做跳转到1M后的APP工程代码处,APP工程就是做的一个点灯的程序而已,boot、APP工程都是跑
    发表于 10-23 18:59

    cpu和单核cpu的区别

    CPU与单核CPU在多个方面存在显著差异,这些差异主要体现在处理能力、性能、运行效率、功耗以及适用场景等方面。 一、概念与结构 CPU :指在一个处理器上集成两个运算核心,通过
    的头像 发表于 09-24 16:17 2056次阅读

    dsp和单核dsp的区别

    DSP(Digital Signal Processor,数字信号处理器)与单核DSP在多个方面存在显著差异,这些差异主要体现在处理能力、任务分配、资源利用以及适用场景等方面。 一、处理能力
    的头像 发表于 09-24 16:14 604次阅读

    TI基于ConcertoMCU的PRIME电力线通信数据集中器方案应用说明

    电子发烧友网站提供《TI基于ConcertoMCU的PRIME电力线通信数据集中器方案应用说明.pdf》资料免费下载
    发表于 09-10 11:10 0次下载
    TI基于Concerto<b class='flag-5'>双</b><b class='flag-5'>核</b>MCU的PRIME电力线<b class='flag-5'>通信</b>数据集中器方案应用说明

    STM32H743与STM32H745在外部电路上是否完全一,是否可以不更换外部电路的情况下实现直接替换呢?

    请教下STM32H743与STM32H745在外部电路上是否完全一,是否可以不更换外部电路的情况下实现直接替换呢? 如果电路需要有变化,能否发个文档进行说明呢?
    发表于 04-07 08:17

    STM32H745ZGTx芯片使用内部FLASH,挂载FATFS为什么打不开文件?

    STM32H745ZGTx芯片使用内部FLASH,挂载FATFS为何打不开文件?
    发表于 04-07 07:11

    STM32H747如何用JLINK调试?

    1.我之前是在STM32H747的官方开发板discover上进行调试,板子上自带了STlink调试器,按照官方文档配置可以进行调试 2.目前自己设计的板子上是调试接口是SWD接口,手上只有
    发表于 03-28 08:58

    stm32H747的IAP升级要怎么做?

    H747我看有2个Hex文件,生成的Bin文件也有2个。Bootloader要怎么处理呢?也是2个Bootloader程序吗?那我要IAP升级程序的话要怎么处理了?
    发表于 03-28 08:50

    VC++串口通信详解

    电子发烧友网站提供《VC++串口通信详解.doc》资料免费下载
    发表于 03-24 09:36 0次下载

    解决HPM6750EVK2jlink下载

    拿到HPM6750EVK2,使用jlink下载时,我原来用买jlink配的20转10转接板进行连接,下载程序里一直报不能连接到开发板。经过查找用手册后,找到了问题。 我的jlink的引脚图与之不对
    发表于 02-16 10:30

    PSoC架构中都可以访问全部外设吗?

    你好!如标题:PSoC 架构中两个内核对芯片的全部外设都有直接访问能力嘛?如果都可以直接访问,那IPC模块的主要应用场景是哪些呢?
    发表于 02-02 11:44

    【2023电子工程师大会】基于RK3568的OH开发及ppt

    【2023电子工程师大会】基于RK3568的OH开发及ppt
    发表于 01-03 16:31 27次下载

    光路激光焊接机技术详解优势及相关的种类有哪些

    编辑:镭拓激光光路激光焊接机目前可以适合大多数激光焊接,因焊接深度深,焊接强度好的特点,操作简单,大大节约用户人力成本。用户需求实现全自动焊接或半自动焊接,以下是光路激光焊接机技术详解优势及相关
    的头像 发表于 12-18 10:45 519次阅读
    <b class='flag-5'>双</b>光路激光焊接机技术<b class='flag-5'>详解</b>优势及相关的种类有哪些