首页 >资讯 > > 正文

RTOS实现双核MCU消息通信 每日热议

来源:strongerHuang 2023-06-08 08:03:14

手机电脑多核的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函数以取消阻止接收任务,该任务现在可以从缓冲区读取,因为缓冲区不再存在空的。 当然,以上仅提供基础原理和方法,具体实现需结合项目实际情况。更多相关内容,请参看官方相关资料。审核编辑:汤梓红
上一篇:中国太保:6月7日获融资买入3387.29万元,占当日流入资金比例5.72% 下一篇:最后一页
x
推荐阅读

RTOS实现双核MCU消息通信 每日热议

2023-06-08

中国太保:6月7日获融资买入3387.29万元,占当日流入资金比例5.72%

2023-06-08

天天通讯!浙江省武义县发布暴雨橙色预警

2023-06-08

热门看点:晨光新材股东户数下降1.39%,户均持股10.58万元

2023-06-08

环球最新:信濠光电:公司暂未涉及上述VR、MR领域

2023-06-08

周三(6月7日)COMEX黄金最新库存量数据|前沿资讯

2023-06-08

新乡投资集团将发行10亿元中票 申购区间3.20%~4.50%-每日视点

2023-06-08

今日看点:渌口区计生协多形式开展“5·29会员活动日”

2023-06-08

上海市购房积分怎么查_上海购房积分哪里查_每日动态

2023-06-08

瘫痪的姚晨和60岁的闫妮:她们怎么变成这样了

2023-06-08

河南省南乐县发布高温橙色预警

2023-06-08

当前要闻:A股房企批量退市加速出清 股东高管开启增持自救行动

2023-06-08

高考考场是如何防作弊的?

2023-06-08

全球热议:桃花粉面映烛光是什么歌 桃花粉

2023-06-08

凌海市气象局发布冰雹橙色预警【Ⅱ级/严重】【2023-06-07】|世界讯息

2023-06-08

海昌海洋公园(02255)称不知股价异动原因-世界快播报

2023-06-08

中国刀削面飘香巴黎集市

2023-06-08

国产最强量子计算机“悟空”7月有望发布:传统芯片千倍性能提升 ! 世界动态

2023-06-08

奥海科技:公司充电枪除了供应于大客户之外,在自主品牌的线上旗舰店也有售卖|当前速递

2023-06-08

全球最资讯丨高考首日,考生乘坐“爱心送考车”奔赴考场

2023-06-07

售价142.48万元 2023款奔驰G 350上市

2023-06-07

吉林信托增资至31.5亿元 2022年报姗姗来迟 营收“斩腰”缩水_快讯

2023-06-07

“既独具特色,又可与世界对话”:摩尔多瓦前总统彼得·鲁钦斯基来访,盛赞郎酒庄园之美

2023-06-07

联翔股份董秘回复: 公司主要产品为墙布,包括刺绣墙布和非刺绣墙布两大类-世界热点评

2023-06-07

遥望科技控股股东减持完又抛减持计划 公司2022年净利亏损刚被问询

2023-06-07

焦点快播:天气|雷雨+8级大风来了!天津双预警齐发!下班注意!

2023-06-07

浙江婺城“输血+造血”,助力四川道孚铺就致富路 新资讯

2023-06-07

「Memcyco」完成 1000 万美元种子轮融资,以保护企业免受假冒品牌劫持 当前热议

2023-06-07

天天观点:你被写在我的歌里歌词_你被写在我的歌里歌曲介绍

2023-06-07

凌海市气象局发布雷雨大风黄色预警【Ⅲ级/较重】【2023-06-07】

2023-06-07

【环球快播报】七旬村民被村支书打住院,数月无人管?当地副镇长:正处理

2023-06-07

丹东全域智慧养老服务云平台已覆盖3.2万余名困难老人-看点

2023-06-07

外交部:根本不存在所谓的秘密警察站,英方应停止抹黑中国

2023-06-07

液压行业市场深度调研 2023液压行业发展前景投资分析 全球快报

2023-06-07

抖音回应扩张自营电商:将根据用户需求做一些业务尝试 _天天精选

2023-06-07

吾尝终日不食终夜不寝以思无益不如学也翻译句子的意思_吾尝终日不食终夜不寝以思无益不如学也翻译 快看点

2023-06-07

全球今日报丨dreamweavercc序列号_dreamweaver序列号

2023-06-07

【天天播资讯】崩坏星穹铁道冤有头债有主成就攻略

2023-06-07

draft.art官方网站查找方法|全球观热点

2023-06-07

为何年轻时看《水浒传》反感宋江招安,年长后就认同宋江招安了? 当前速递

2023-06-07

ST贵人6月7日打开涨停

2023-06-07

【中国那些事儿】英媒:下一轮工业化浪潮,中国将是弄潮儿

2023-06-07

认清一个男人,不用反复试探,看这几件事就够了|天天观焦点

2023-06-07

河套学院有哪些专业 河套学院专业排名|天天观热点

2023-06-07

买房前要问经纪人的问题,最后一条最重要

2023-06-07

dnf类似的手游有哪些(类似dnf手游的横版游戏2022)

2023-06-07

每日视讯:世界银行上调中国2023年经济增速预期至5.6%

2023-06-07

焦点速递!建安风骨今犹在_魏武遗风是什么意思建安风骨魏武遗风什么梗

2023-06-07

姚琛白色信封歌词_你姚琛到我了是什么梗别姚琛我了是什么意思_实时

2023-06-07

lol解说有哪些人2021(2021lol解说排行榜) 全球滚动

2023-06-07

无影山前传_关于无影山前传介绍

2023-06-07

全球看热讯:手机数据恢复精灵

2023-06-07

焦点速看:法网八强今晚开战!

2023-06-07

安德烈·普罗森科 世界时快讯

2023-06-07

塞尔达传说王国之泪艾恩欧马神庙解谜攻略一览

2023-06-07

word的标点符号_word文档标点符号设置_环球热头条

2023-06-07

锂价又“狂飙”,46天翻倍重返31万/吨!反弹或至年底,龙头股价仍低迷

2023-06-07

值得买(300785.SZ)实控人及其一致行动人累计减持公司1.26%股份

2023-06-07

艾萨拉之眼地下城入口(艾萨拉之眼怎么去)-时讯

2023-06-07

【全球新要闻】美股异动 | 迅雷(XNET.US)宣布2000万美元股票回购计划 股价涨超29%

2023-06-07

董宇辉看上的,不是俞敏洪的7个亿

2023-06-07

环球快看:气温年较差影响因素_气温年较差

2023-06-07

全国总工会启动关爱货车司机行动|当前时讯

2023-06-07

“幸福半径”不断扩大!Ta们的“午间1小时”这么玩→_世界最资讯

2023-06-06

阿里巴巴鲁班智能设计_阿里鲁班智能设计平台 焦点快看

2023-06-06

竖向折叠屏神机将至?曝小米Flip折叠屏手机立项 全球新资讯

2023-06-06

学生称高考前学校食堂疑有霉变肉?学校回应:系烧焦所致,学生了解真相后开心赴考

2023-06-06

ecm是什么意思有什么功能_ecc kmd是什么意思-世界速讯

2023-06-06

今天开始当魔君下载_今天开始当魔君

2023-06-06

国家队为亚运队让路,“啃老”仍是中国男足无法回避的问题

2023-06-06

大都会风格是什么意思_什么是大都会风格建筑

2023-06-06

苹果WWDC吐槽大会 iOS 17用了母公司5年前技术 世界头条

2023-06-06

欧洲1至4月电动汽车销量超越柴油车-环球资讯

2023-06-06

每日信息:2023杭州云辰置业有限公司招聘

2023-06-06

尼泊尔军队从珠峰等4高峰清理3.5万多公斤废弃物

2023-06-06

全球最新:和硕董事长谈iPhone 15量产:目前处于提升良率阶段

2023-06-06

大雨袭来 气温 “大跳水” 环球热门

2023-06-06

热门看点:迷信“985”“211”房号,家长别给商家“递刀子”

2023-06-06

2023年4月奥迪A8销量怎么样? 在中排名怎么样?

2023-06-06

全球今日讯!最新数据:房企销售、拿地哪家强?

2023-06-06

环球时讯:美债“闹剧”暂缓但风险犹存

2023-06-06

【时快讯】苹果发布新款 Mac Studio,售价1999美元起

2023-06-06

每日聚焦:通城县马港镇:党建引领促就业,中塅村绘就共富“新图景”

2023-06-06

每日快讯!北影和中戏哪个好-中戏和北影哪个好

2023-06-06

第五十八章 我们和你,不太一样(其五)

2023-06-06

网友称《GTAOL》更新规模变小 都去做《GTA6》了?|全球新要闻

2023-06-06

粤泰股份收到意向投资人重整投资方案 股价已17个交易日低于1元

2023-06-06

鞋架正常的尺寸高度是多少_成品鞋架尺寸

2023-06-06

天龙八部2私服

2023-06-06

芒种将至,古有青梅煮酒习俗,别忘老传统,这4款美酒佳酿别错过_全球最新

2023-06-05

宁德电池被美国海关扣押 特斯拉合作中断?官方:假的

2023-06-05

【聚看点】6月5日上海期货交易所沪铜期货持仓比例

2023-06-05

北京中山公园残疾人免费吗? 全球微资讯

2023-06-05

在平遥斩获三大奖、被大鹏狂夸的《温柔壳》,成了今年爱情片最佳-全球简讯

2023-06-05

当前速读:北向资金今日净买入13.26亿元 贵州茅台净卖出额居首

2023-06-05

视频丨组团“洗白”境外诈骗电话 浦东警方捣毁四人团伙

2023-06-05

市林业局赴泌阳县开展结对帮扶活动

2023-06-05

天天观热点:见盟友 叙利亚外长访伊拉克深化合作

2023-06-05

艳骨_艳女幽魂

2023-06-05

关于任泉发文为李冰冰庆生的相关信息 环球观察

2023-06-05