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

    文章

    9446

    浏览量

    156143
  • 通信
    +关注

    关注

    18

    文章

    6318

    浏览量

    139568
  • 双核
    +关注

    关注

    0

    文章

    40

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    e203 软如何和FPGA通信

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

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

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

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

    本期内容介绍基于开源鸿蒙在RK3568上开发图片编辑的全流程,分为上篇和下篇,本篇为上篇,主要介绍添加相册图片、编译图片功能。
    的头像 发表于 10-31 09:16 2762次阅读
    基于开源鸿蒙的图片编辑开发<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 838次阅读
    深入芯驰D9360<b class='flag-5'>核</b>间<b class='flag-5'>通信</b>案例,RPMSG关键技术深度剖析

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

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

    请问的芯片如何调试?

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

    全志科技机器人专用芯片MR527与MR813特性概述

    全志科技机器人专用芯片MR527是八高性能机器人专用芯片; MR527系列芯片集成了8Arm® Cortex®-A55 CPU、NPU、-GPU、MCU等多个高性能计算单元,具有强
    的头像 发表于 04-24 14:58 3008次阅读
    全志科技机器人专用芯片<b class='flag-5'>MR</b>527与<b class='flag-5'>MR</b>813特性概述

    RZT2H CR52BOOT流程和例程代码分析

    RZT2H是多核处理器,启动时,需要一个“主”先启动,然后主根据规则,加载和启动其他内核。本文以T2H内部的CR52,说明T2H
    的头像 发表于 04-03 17:14 2714次阅读
    RZT2H CR52<b class='flag-5'>双</b><b class='flag-5'>核</b>BOOT流程和例程代码分析

    锁步技术在汽车芯片软错误防护中的应用详解

    摘要 本文深入探讨了锁步技术在保障汽车芯片安全性中的应用。文章首先分析了国产车规芯片在高安全可靠领域面临的软错误难点及攻克方向,然后详细介绍了锁步技术的基本原理及其在汽车芯片防
    的头像 发表于 03-21 22:58 868次阅读

    STM32H7间如何通信

    STM32H7通信的方法,主要是CM7和CM4之间如何进行数据传递
    发表于 03-12 07:34

    STM32H745的FreeRTOS是单核工作还是工作?

    在STM32CubeMX 中配置的时候,FREERTOS分为_M4和_M7,应该是分布对应Cortex_M4和Cortex_M7的。 那实机运行RTOS的时候,运行的是单核还是? 这个是根据
    发表于 03-07 13:36

    RK3036:高效能处理器详解

    RK3036是一款专为嵌入式设备及多媒体应用设计的高效能处理器,以其卓越的性能和丰富的功能特性,赢得了市场的广泛认可。以下是对RK3036主要特性的介绍: 一、核心架构与性能 RK3036搭载了
    的头像 发表于 02-10 17:35 1683次阅读

    关于cc2541程序代码

    CC2541哪里有cc2541的模数转换模块和蓝牙模块的程序代码呀?初学不懂
    发表于 01-20 07:14