RTOS实现双核MCU消息通信

2023-06-07 19:20:00 来源: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函数以取消阻止接收任务,该任务现在可以从缓冲区读取,因为缓冲区不再存在空的。 当然,以上仅提供基础原理和方法,具体实现需结合项目实际情况。更多相关内容,请参看官方相关资料。审核编辑:汤梓红

关键词:

责任编辑:ERM523

相关阅读

精彩推送

高考开战,哪台车能让考生好好午休一下? 车牌“985”警车开道!这件事他们坚持了18年,考生:警察叔叔有心了_要闻
您敢选电车吗?撞收费站起火的案例带给我们哪些警示 【全球热闻】潮州:讲好湘桥高质量发展故事
长安汽车回应网传克扣10%货款:不实,已报案 天天即时看!土耳其里拉持续贬值 再创历史新低
董洁首曝离婚风波带来的影响 从未埋怨过潘粤明_每日速讯 西南证券(600369)6月7日主力资金净卖出1136.53万元
【时快讯】光大银行举办推进粮食安全暨种业振兴会议 RTOS实现双核MCU消息通信
环球聚焦:《街头霸王6》全球销量突破百万套 系列销量超5千万套 每日热议!领导看了给你加薪!python +ddt+excel 一招鲜,接口自动化测试轻松搞定,测试报告惊艳四座!
和胜股份:在项目研发前沿领域一直与宁德时代深度合作-今亮点 快播:高考头一天,警察蜀黍有多忙?
全球资讯:直击|卡霍夫卡水电站决堤,大水涌入市区,居民带着财物撤离 今日热闻!悦达起亚入选“私家车新车上牌免查验试点企业”
汉马科技(600375)6月7日主力资金净卖出1212.85万元 环球今热点:昊华科技(600378)6月7日主力资金净卖出1061.15万元
宁沪高速(600377)6月7日主力资金净买入663.37万元 男房东趁女租客不在家,多次私闯女租客房间翻箱倒柜,报警后解释:帮忙关窗-环球快资讯
全球滚动:理想汽车北京顺义工厂最早7月投产?官方回应:确实在积极准备中 七旬村民被村支书打住院,数月无人管?当地副镇长:正处理
预估2024年苹果Vision Pro出货量约20万台 后续消费款才是主打|全球讯息 景津装备:公司产品可用于养殖行业的屠宰、粪便污水及沼渣沼液处理等 世界热点
卡霍夫卡水电站大坝遭破坏,会有哪些影响? 伟思医疗:公司运动康复机器人产品线符合神经康复智能化、标准化的康复需求 属于国内领先水平-全球热闻
下属公司累计被冻结5个银行账户,海南椰岛今日股价开盘即下跌 每日观点 2千元装个增程器,宝骏悦也的新技术,抄袭老年代步车?
浙江婺城“输血+造血”,助力四川道孚铺就致富路-环球即时看 海关总署:前5个月民营企业进出口总额同比增长13.1%-世界视点
提醒!端午节假期首日火车票6月8日开售 焦点热讯:青海春天(600381)6月7日主力资金净卖出35.96万元
当前关注:婴儿皮肤有白块是白癜风吗?白癜风会遗传吗? 北京电信多条千兆专线护航通信展览会 全力做好通信保障服务
2023年6月7日纯苯国内市场动态-环球观焦点 新乡投资集团将发行10亿元中票 申购区间3.20%~4.50% 全球球精选
焦点要闻:受贿1992615.31元!陈克祥一审获刑三年半 当前热议!江南高纤(600527)6月7日主力资金净买入42.56万元
BBA车主的下一台车为什么不能是蔚来?比如ES6? | 吴佩频道 岳阳兴长:公司惠州项目预计于2023年9月投产-热点
环球看热讯:4399欢乐斗地主第7期_4399欢乐斗地主 information是什么意思_InstallShield Installation Information是什么意思_全球热闻
世界视讯!摇橹船科技中标西安交通大学科技部人工智能重大专项! 快消息!某酒店有若干间空房_某宾馆有若干间标准房
今亮点!“既独具特色,又可与世界对话”:摩尔多瓦前总统彼得·鲁钦斯基来访,盛赞郎酒庄园之美 恩捷股份:公司现有隔膜产品适用于储能电池 环球热推荐
内蒙古粮食作物播种超亿亩 用节水农业打造“塞上粮仓” 世界简讯 再突破!华为发布GaussDB数据库,给世界一个更优选择
河北为小麦晾晒做足充分准备 确保颗粒归仓-热门 kappa是哪个国家的品牌_kap
cad2013怎么快速标注xy坐标_CAD中怎么标注点的XY坐标 如X Y 全球微动态 大型邮轮项目团队攻克多项核心技术 形成一系列科技创新成果
800万元日元等于多少人民币_800万日元等于多少人民币 环球聚焦:各地出台全方面服务保障 营造温馨、舒适高考环境
金坛到常州总站汽车时刻表查询_常州站和常州汽车总站 世界热文:社会公德的主要内容_社会公德的主要内容是什么
世界今日报丨清除上网痕迹和清除缓存一样吗_清除上网痕迹 冰心繁星一五九心中的风雨指什么_心中的风雨指什么_每日视点
第十五届“全国文化企业30强”发布 全球头条 前4月广东自贸试验区进出口同比增长22.3%
速讯:为了“保壳”金科再搞“小动作”,股票于7日起成功停牌 环球滚动:附近火车售票处电话_附近火车售票处
征和工业:公司浙江项目目前已签署《国有建设用地使用权出让合同》,资金来源为公司自有或自筹资金(包括但不限于通过银行贷款、股权融资等方式)-环球即时 【收评】豆油日内上涨0.03% 机构称油脂反弹乏力
环球热点评!@所有人,奉贤区商业秘密保护示范单位开始申报! 看点:下滑18%!新基金发行遇冰点?
2023上海青浦咖啡文化周丨在练塘乡村的稻田边喝咖啡,你要的“诗和远方”都有! 金埔园林:“金埔转债”于6月8日配售及网上申购_天天即时
彭文生:美联储6月或“跳过”加息 年内降息概率较小 探索“毗邻党建”新模式 宝山罗泾镇“牵手”太仓浏河打造“北上海泾彩乡村” 当前速讯
永新股份:公司海外业务仍处于扩张期 天士力:获得《药物临床试验批准通知书》-天天热点
【收评】锰硅日内下跌1.66% 机构称硅锰钢招和盘面价格均较为承压 环球播报:交强险多少钱2023年,交强险价格表2023?
当前播报:[路演]*ST民控:如果有优质股权契合公司的发展 将考虑通过控股或参股等方式参与 天天百事通!《中国奇谭》快闪打卡区来了 主题“小卖部”在上海影城开业!
华铭智能:公司的自动检票机上很早就开发了AI功能的集成 包括指纹 掌静脉 虹膜和人脸等功能 最新!2023年上海高考语文写作题来啦-信息
世界快报:[路演]汇隆活塞:近三年主营平均毛利率为46.06% 全球观察:机构:房企融资规模仍在下降 海外债有新发
建科机械:智能化钢筋加工配套软件和智慧工厂管理软件已在多家大型重点客户和项目使用 新动态 夏季养心应该这么做,来看
多空相互影响 金价延续震荡 热点 欧盟将对实施“经济勒索”的国家加征关税是针对中国?外交部回应
中国长城收年报问询函 要求说明业绩对政府补助是否存在重大依赖 今日讯 每日速讯:电子后视镜新国标将于7月实施 行业市场规模有望超60亿
【视频】污水未经处理排入泾河!陕西一煤矿被罚62万元,4人被刑事拘留,2人被行政拘留 西康高铁建设持续进行
2023PT展 | 园区新品介绍深度解读 快资讯:宇邦新材:公司的MBB焊带和SMBB焊带分别主要适用于P型的PERC电池和N型的Topcon电池
亚洲艺术体操锦标赛中国队包揽集体项目金牌,上海运动员郭崎琪参赛_每日看点 北京拟规定:已购共有产权住房家庭取得证书未满5年 不允许转让产权份额 世界实时
焦点热文:[路演]青岛双星:“稀土金”轮胎目前已实现对主机厂的配套 在公司替换市场的销量目前约占10% 全球观察:【天气】雷雨再突袭,雨水多但梅雨还没来……
澳优出售新西兰奶粉工厂 买方为伊利全资子公司 海澜之家(600398)6月7日主力资金净卖出259.65万元
天山路街道为老人推出免费的“爱心下午茶”|今日快看 对中国F1车手周冠宇使用歧视性词汇“Chinaman”,英国天空体育道歉 每日消息
注意!森特股份将于6月28日召开股东大会 公司在数据管理方面有何优势?优博讯回应-今日热门