世界热讯:RTOS实现双核MCU消息通信

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

标签:

THE END
广告、内容合作请点击这里 寻求合作
免责声明:本文系转载,版权归原作者所有;旨在传递信息,不代表中国财投网的观点和立场。

相关热点

资讯播报

@高考考生 多地考点启用智能安检门,这些设备物品不要带 热文
世界热讯:RTOS实现双核MCU消息通信
36氪2023 Q1营收获双位数增长,企服点评运营数据“狂飙”-环球今热点
每日头条!阿尔巴尼亚女人多吗?
天天讯息:23旭越惠诚2优先A票面利率为2.4200%
世界观天下!恒指公司:大市回调之下科指仍录强劲资金流入
全瓷烤瓷牙进口和国产的区别_全瓷烤瓷牙
海关总署:前5个月铁矿砂、原油、煤进口量增价跌|即时看
孙子兵法中为上兵的手段是什么?_在孙子兵法中为上兵的手段是什么
世界新消息丨智能为途径,飞凡深挖舒适出行本源
一步一想心中向着渺茫的意思_渺茫的意思
北陆药业:公司降糖类产品包括格列美脲片及瑞格列奈片
和胜股份:在项目研发前沿领域一直与宁德时代深度合作 天天观察
泰国恐怖片校园怪谈在线观看_泰国恐怖片_环球资讯
环球热资讯!长春高新回应股价跌停:公司经营一切正常 集采对业绩影响“中性偏好”
一牛顿的力等于多少千克_一牛顿的力等于多少公斤
三星 Galaxy Z Flip 5 折叠机配置信息曝光:外屏变大,芯片升级
推动实现“家门口的幸福”!苏州相城黄桥街道聚力党建便民服务
天宸股份拟受让天宸健康15%股权收问询函:需说明是否存在向关联方输送利益等情形 今日热闻
实时焦点:龙虎榜 栖霞建设9月15日成交明细
Failed to connect to zw.gozuowen.com port 80: Timed out
中经评论:向下扎根向上生长 “技能中国”未来可期
手机模拟战争游戏推荐 在战场上做士兵
研学游又"火"了——"全链"发力,打造"游学江苏"品牌-今日精选
攀枝花学院获颁“四川省哲学社会科学重点实验室”牌匾
《预制菜 鲍鱼花胶鸡》等八项团体标准征求意见_环球热消息
铜陵有色:公司阴极铜的原材料来源分为自产铜精矿和国内、国外采购铜精矿模式|热消息
世界球精选!思维决定一切
兰州高新区首家乡村就业帮扶车间开业
世界热资讯!股票带r是什么意思
不挂p档会溜车吗_溜车风险未挂入p档什么意思-环球焦点
2023端午节手抄报简单漂亮字少
天天短讯!被删除的Sam Altman谈话纪要,讲了什么?
拉力赛车类游戏推荐
借云之力赋能企业出海 SHOPLINE如何让电商玩家跑在“快车道”? 每日信息
税收红利精准直达 经营主体减压力强信心 当前热门
山西省长治市平顺县广泛开展“五大”活动,推进高质量发展-世界快报
股票红线和绿线分别代表什么
实惠喵怎么分享给好友 操作方法介绍-环球信息
中铁工业(600528)6月7日主力资金净卖出664.32万元-全球热消息
方大炭素(600516)6月7日主力资金净卖出918.55万元-快播
家乡的端午节作文500字左右
世界观点:首开股份(600376)6月7日主力资金净买入81.28万元
河南虞城:开展护航高考“静音”交通秩序专项整治
新疆库车:推进生态环境治理 擦亮“美丽乡村”建设新名片 今日观点
播报:新华全媒+丨我国外贸连续4个月保持正增长
我国一季度汽车出口107万辆 还带火了这个行业
经合组织预测全球经济2023年增长2.7%
【当前热闻】城市运营进入新阶段 央企成为发展主力军
生死狙击好号和密码大全真的_生死狙击好号和密码大全
当前速看:江苏出台14条措施推动外贸稳规模优结构
花旗:2025年铜均价有望升至1.2万美元,现在是布局铜金属的良机|环球今亮点
河北口岸首次在入境船舶截获长角立毛蚁 天天观天下
全球热头条丨加拿大央行意外重启加息,美元兑加元短线跳水近70点
腾讯QQ回应考生喊话
A股:连续24个跌停板!股民:想想都觉得害怕!
环球快播:奥比中光:子公司奥锐达与斯坦德机器人将共同研发新一代激光雷达
每日观察!2千元装个增程器,宝骏悦也的新技术,抄袭老年代步车?
天津普林拟关联收购 被问高溢价是否损害上市公司利益 观天下
“地球褶皱”里的山海情_环球焦点
全球微资讯!拒不向特斯拉道歉 网红车评人"蔡老板"被宁波中院强制执行
资讯:芒种过后 忙收抢种——陕西西安“三夏”见闻
世界即时看!民生信托超53亿元股权被冻结
世界热讯:聚力打造鲁北地区生物医药产业创新高地
全球关注:云铝股份董秘回复:首先感谢您对云铝股份的关心、支持和信赖
愿做生态文明追梦人 ——记全国林草系统先进工作者潘雪雷
美国玩具及纪念品公司SRM Entertainment申请纳斯达克IPO上市
全球滚动:金新农5月份生猪销售收入1.12亿元
深耕改革创新“试验田” 广东自贸区与港澳合作获突破进展
百色芒果甜蜜上市,交易中心“芒山芒海” 天天报资讯
广西党政企大联播丨广西高考助威团祝福考生:“试”不可挡,高考加油!-世界微动态
每日观察!南宁的朋友有口福了!6月10日,恭城油茶在自治区博物馆摆长桌宴!
速看:如何通过炼油利润率判断石油市场前景?这三位能源分析师给出了答案
天天热讯:我爱我家:新房业务占总收入的比重已经下降至10%左右
全球视点!放弃造车,苹果把虚拟现实放入“快车道”
快消息!吉林:数字孪生工厂“激活”老工业基地
焦点快看:今日晚间原油行情分析(2023年6月7日)
国网元宝山区供电公司:高考保电我在岗 学子圆梦我护航 世界热点评
电投产融: 关于公司股东云能资本非公开发行可交换公司债券获得符合深交所挂牌条件无异议函的公告
启辰大V DD-i超混动有望7月份内上市
财联社创投通:5月碳中和领域108.64亿元融资 环比增143.2% 储能赛道最“吸金”
前沿热点:16球16助 梅西当选sofascore法甲赛季最佳 在五大联赛可再踢2年
世界速看:远离这些高危水域!桂林这份防溺水地图请收好→
【天天新要闻】阿维塔的销量,谭本宏的难题
“太难了!”出境游为何“签证难”?何时能好转?
南宁荷塘惊现并蒂莲,长成概率为十万分之一-今日快讯
全球热门:广西疾控专家提醒:6月要重点预防与防范这些疾病
全球即时看!提醒!端午节假期首日火车票明日开售
广西开展经营性自建房安全专项整治“百日攻坚”行动
关注:拓维信息:公司生产的AI服务器支持英伟达GPU运行
产业 | 第十九届深圳文博会东莞展馆时尚吸睛,五大板块展现“潮流东莞”魅力
英媒:德赫亚准备拒绝沙特的丰厚报价,继续留在曼联|世界播报
芳笛环保全资子公司拟将位于汪岭社区的土地使用权及地上附属物出售给天门市高投腾新投资发展有限公司
白酒概念板块涨0.01% 来伊份涨9.4%居首
安信证券:新能源车依然高增长 头部车企盈利能力有望持续提升_世界最资讯
封闭合同与终止合同有什么不同?
科林电气中标国家电网3个采购项目 总金额9474.88万元
公司在数据管理方面有何优势?优博讯回应|全球热头条
每日消息!中电兴发:公司目前暂时没有液冷技术数据中心
全球即时看!WSTS:预计今年全球半导体行业出现两位数下滑 但明年将反弹约11.8%

相关推荐

精彩推送

3