当前位置:首页>新闻 > >正文

RTOS实现双核MCU消息通信

  • 2023-06-08 04:51:25来源:strongerHuang

手机电脑多核的CPU你可能经常看见,但多核的单片机相对来说就不那么常见了。随着需求的增加、技术的进步,单片机已不再局限于单核了,因此,近几年陆续出现了双核的单片机了。 你可能会好奇,双核单片机之间怎么通信?其实,通信的方式和方法有很多种。本文就给大家描述一下:使用FreeRTOS消息缓冲区,实现简单的非对称多处理(AMP)核心到核心通信,结合STM32H7(M4和M7) 双核处理器为例。


(相关资料图)

概述

实现STM32H7双核之间通信是FreeRTOS官方提供的一个方案,是基于FreeRTOS消息缓冲区,该消息缓冲区是无锁循环缓冲区,可以将大小不同的数据包从单个发送方传递到单个接收方。 说明,该消息缓冲区仅提供数据的传输,不提供通信相关协议处理。

基本原理

实现双核之间通信基本原理:发送和接收任务位于非对称多处理器(AMP)配置中的多核微控制器(MCU)的不同内核上,这意味着每个内核都运行自己的FreeRTOS程序。 同时,一个内核在另一个内核中具有生成中断的能力,以及两个内核都有访问的内存区域(共享内存)。消息缓冲区以每个内核上运行在应用程序已知的地址置在共享内存中,如下图: 理想情况下,还将有一个内存保护单元(MPU),以确保只能通过内核的消息缓冲区API来访问消息缓冲区,并最好将共享内存标记为不可被其他程序占用。

单消息代码描述

这里官方提供了实现该方案的基础代码(仅供参考)。 将数据发送到流缓冲区的代码:

xMessageBufferSend(){    /* If a time out is specified and there isn"t enough    space in the message buffer to send the data, then    enter the blocked state to wait for more space. */    if( time out != 0 )    {        while( there is insufficient space in the buffer &&               not timed out waiting )        {            Enter the blocked state to wait for space in the buffer        }    }    if( there is enough space in the buffer )    {        write data to buffer        sbSEND_COMPLETED()    }}
从流缓冲区读取数据的代码:
xMessageBufferReceive(){    /* If a time out is specified and the buffer doesn"t    contain any data that canbe read, then enter the    blocked state to wait for the buffer to contain data. */    if( time out != 0 )    {        while( there is no data in the buffer &&               not timed out waiting )        {            Enter the blocked state to wait for data        }    }    if( there is data in the buffer )    {        read data from buffer        sbRECEIVE_COMPLETED()    }}
如果任务在xMessageBufferReceive()中进入阻塞状态以等待缓冲区包含数据,则将数据发送到缓冲区必须取消阻塞该任务,以便它可以完成其操作。 当xMessageBufferSend()调用sbSEND_COMPLETED()时,任务将不受阻碍。 ISR通过将消息缓冲区的句柄作为参数传递给xMessageBufferSendCompletedFromISR()函数来解除对任务的阻塞。 如图箭头所示,其中发送和接收任务位于不同的MCU内核上:1.接收任务尝试从空的消息缓冲区中读取数据,并进入阻止状态以等待数据到达。2.发送任务将数据写入消息缓冲区。3.sbSEND_COMPLETED()在正在执行接收任务的内核中触发一个中断。4.中断服务例程调用xMessageBufferSendCompletedFromISR()来解除阻止接收任务,该任务现在可以从缓冲区读取,因为缓冲区不再为空。

多消息代码描述

当只有一个消息缓冲区时,很容易将消息缓冲区的句柄传递到xMessageBufferSendCompletedFromISR()中。 但是要考虑有两个或更多消息缓冲区的情况,ISR必须首先确定哪个消息缓冲区包含数据。如果消息缓冲区的数量很少,则有几种方法可以实现:

如果硬件允许,则每个消息缓冲区可以使用不同的中断线,从而使中断服务程序和消息缓冲区之间保持一对一的映射。

中断服务例程可以简单地查询每个消息缓冲区以查看其是否包含数据。

可以通过传递元数据(消息是什么,消息的预期接收者是什么等等)以及实际数据的单个消息缓冲区来代替多个消息缓冲区。

但是,如果存在大量或未知的消息缓冲区,则这些技术效率不高。 在这种情况下,可伸缩的解决方案是引入单独的控制消息缓冲区。如下面的代码所示,sbSEND_COMPLETED()使用控制消息缓冲区将包含数据的消息缓冲区的句柄传递到中断服务例程中。 使用sbSEND_COMPLETED()的实现:

/* Added to FreeRTOSConfig.h to override the default implementation. */#define sbSEND_COMPLETED( pxStreamBuffer ) vGenerateCoreToCoreInterrupt( pxStreamBuffer )/* Implemented in a C file. */void vGenerateCoreToCoreInterrupt( MessageBufferHandle_t xUpdatedBuffer ){size_t BytesWritten.    /* Called by the implementation of sbSEND_COMPLETED() in FreeRTOSConfig.h.    If this function was called because data was written to any message buffer    other than the control message buffer then write the handle of the message    buffer that contains data to the control message buffer, then raise an    interrupt in the other core.  If this function was called because data was    written to the control message buffer then do nothing. */    if( xUpdatedBuffer != xControlMessageBuffer )    {        BytesWritten = xMessageBufferSend(  xControlMessageBuffer,                                            &xUpdatedBuffer,                                            sizeof( xUpdatedBuffer ),                                            0 );        /* If the bytes could not be written then the control message buffer        is too small! */        configASSERT( BytesWritten == sizeof( xUpdatedBuffer );        /* Generate interrupt in the other core (pseudocode). */        GenerateInterrupt();    }}
然后,ISR读取控制消息缓冲区以获得句柄,将句柄作为参数传递到xMessageBufferSendCompletedFromISR()中:
void InterruptServiceRoutine( void ){MessageBufferHandle_t xUpdatedMessageBuffer;BaseType_t xHigherPriorityTaskWoken = pdFALSE;    /* Receive the handle of the message buffer that contains data from the    control message buffer.  Ensure to drain the buffer before returning. */    while( xMessageBufferReceiveFromISR( xControlMessageBuffer,                                         &xUpdatedMessageBuffer,                                         sizeof( xUpdatedMessageBuffer ),                                         &xHigherPriorityTaskWoken )                                           == sizeof( xUpdatedMessageBuffer ) )    {        /* Call the API function that sends a notification to any task that is        blocked on the xUpdatedMessageBuffer message buffer waiting for data to        arrive. */        xMessageBufferSendCompletedFromISR( xUpdatedMessageBuffer,                                            &xHigherPriorityTaskWoken );    }    /* Normal FreeRTOS "yield from interrupt" semantics, where    xHigherPriorityTaskWoken is initialised to pdFALSE and will then get set to    pdTRUE if the interrupt unblocks a task that has a priority above that of    the currently executing task. */    portYIELD_FROM_ISR( xHigherPriorityTaskWoken );}
如图,使用控制消息缓冲区时的顺序:1.接收任务尝试从空的消息缓冲区中读取数据,并进入阻止状态以等待数据到达。2.发送任务将数据写入消息缓冲区。3.sbSEND_COMPLETED()将现在包含数据的消息缓冲区的句柄发送到控制消息缓冲区。4.sbSEND_COMPLETED()在正在执行接收任务的内核中触发一个中断。5.中断服务例程从控制消息缓冲区中读取包含数据的消息缓冲区的句柄,然后将该句柄传递给xMessageBufferSendCompletedFromISR()API函数以取消阻止接收任务,该任务现在可以从缓冲区读取,因为缓冲区不再存在空的。 当然,以上仅提供基础原理和方法,具体实现需结合项目实际情况。更多相关内容,请参看官方相关资料。审核编辑:汤梓红

标签:

延伸阅读

推荐阅读

RTOS实现双核MCU消息通信

RTOS实现双核MCU消息通信-手机、电脑多核的CPU你可能经常看见,但多核

通讯!全体“飞手”请注意!别让你的“无人机”当“黑户”!

全体“飞手”请注意!别让你的“无人机”当“黑户”!为全力护航成都大

当前消息!手机问题:努比亚Z30pro支持5G吗

科技、数码、互联网新闻如今都成为了大众所关注的热点了,因为在我们的

信濠光电:公司的3D玻璃产品销量保持快速增长,但目前收入占比相对不高_环球微资讯

每经AI快讯,有投资者在投资者互动平台提问:请问公司的3d玻璃产品目前

环球精选!传统村落消防安全有隐患 云南一镇政府被提起公益诉讼

6月5日,普洱市中级人民法院发布一批极具典型性与代表性的环境资源案例

环球快看:广东自贸试验区已累计形成696项制度创新成果

上证报中国证券网讯6月7日,广东省新闻办举行中国(广东)自由贸易试验

生活污染源_关于生活污染源介绍

生活污染源,关于生活污染源介绍这个很多人还不知道,我们一起来看看!1

我国一季度汽车出口107万辆 还带火了这个行业

原标题:世界第一!我国一季度汽车出口107万辆还带火了这个行业今年第

世界视讯!本川智能06月07日主力资金大幅流出

本川智能06月07日主力资金净流出2971 74万元,涨跌幅为-1 67%,主力净

全球短讯!嘉越医药宣布完成逾亿元pre-C轮融资

近日,嘉越医药宣布完成逾亿元pre-C轮融资。本轮融资由成都生物城基金

三德科技:针对无人化智能装备产品推出类似汽车行业“日常运维+专业检修”服务模式 已有项目落地

三德科技6月7日披露投资者关系活动记录表显示,鉴于产品的属性与仪器设

杰创智能:公司持续加大对云计算领域的研发投入力度,并形成了以“常青云”为核心的系列技术成果和产品

同花顺金融研究中心6月7日讯,有投资者向杰创智能提问,董秘您好!公司

俄罗斯石油产量居高不下,延长减产的OPEC+很沮丧! 环球观察

俄罗斯石油产量居高不下,延长减产的OPEC+很沮丧!

平安守护 时刻行动

为深入贯彻落实近期公安机关安保维稳工作会议精神,严打突出违法犯罪、

全球视点!腾讯照片管家怎么恢复照片_腾讯照片管家

1、你好,用电脑下个腾讯电脑管家,然后点进工具箱。2、里面有个微云,

散文丨水运宪:我的峡谷我的村 环球关注

最近一次去乌龙山大峡谷感觉特别奇妙。多云的日子避开了阳光暴晒,体肤

环球看点!华铭智能:公司的自动检票机上很早就开发了AI功能的集成 包括指纹 掌静脉 虹膜和人脸等功能

每经AI快讯,有投资者在投资者互动平台提问:请问贵公司的自动售票验票

【世界独家】6月5日美国国债收益率整体下行

上证报中国证券网讯6月5日美国国债收益率整体下行。具体来看,美国国债

伯恩茅斯官方:莱尔马、斯坦尼斯拉斯等4将合同到期离队

伯恩茅斯官方:莱尔马、斯坦尼斯拉斯等4将合同到期离队,莱尔马,总冠军,

省委老干部局主题教育调研组来金塔县调研

6月6日,省委老干部局副局长徐维德带领主题教育调研组来金塔县调研,县

通讯!淄博在全省首推“无还本续贷”创业担保贷款,企业无需还本也可续贷

“我们获得了220万元的‘无还本续贷’创业担保贷款,可连续享受6年,贴

全球新资讯:浙能电力:水系锌离子目前尚未完成结题验收 但性能测试达到项目计划书指标要求

浙能电力6月7日在互动平台表示,水系锌离子目前尚未完成结题验收,但性

【环球新要闻】龙葵是什么植物?

龙葵是一种茄科茄属一年生草本植物。龙葵的介绍:龙葵的茎近无毛或被微

永泰能源:公司无形资产主要为矿业权资产,为公司开展主营业务和增强发展后劲而配置相关资源

每经AI快讯,有投资者在投资者互动平台提问:请问公司一季报无形资产50

不挂p档会溜车吗_溜车风险未挂入p档什么意思

车辆仪表指示有打滑的危险,没有挂入P档。可能是主驾驶门没关,没有放

【全球速看料】cfs费用是什么意思_cfs charge是什么费用

1、拼柜货拆柜费用是在目的港产生的,是等船到了目的港后,由目的港拆

周口市中医院开展2023“中国心肺复苏周”义诊宣传活动-当前聚焦

河南县域经济网讯为提升群众心脏急救意识,提高院外心脏骤停救治成功率

【天天热闻】高考第一天 全国各地爱心助考 确保考生顺利应考

今天,2023年全国高考正式开始,全国1291万考生奔赴考场。高考事关千家

国网元宝山区供电公司:到元宝山区高考考点开展保电专项检查 全球信息

2023年高考战鼓已经敲响,作为护航高考的一份子,6月6日上午,国网元宝山

猜您喜欢

Copyright ©  2015-2022 亚洲服装网版权所有  备案号:京ICP备2021034106号-51   联系邮箱:5 516 538 @qq.com