RTOS实现双核MCU消息通信 全球快资讯

2023-06-07 16:58:08 来源: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

相关阅读

精彩推送

终于定档!TVB新剧《灵戏逼人》下月播出,力捧小生上演人鬼恋 天天热门 信濠光电:目前,公司的3D防护玻璃主要应用于智能手机产品 环球消息
光模块有没有在生产?盈方微:公司没有该业务 天天关注:东京股市明显回落
全球热文:注意!森特股份将于6月28日召开股东大会 焦点热议:金埔园林:“金埔转债”于6月8日配售及网上申购
全球最新:公司有从事VR和AR方面研发吗?信濠光电回应 博敏电子:截至本公告披露日 公司及其控股子公司对外担保总额为约26.88亿元
环球速看:即将推出的恐怖游戏展示了虚幻引擎5的出色表现 借新能源东风深入重卡市场,宇通重卡全系新品上市
今日热议:《山河令》制片人马韬去世 多位工作人员发文悼念 吃人嘴软拿人手短是什么意思近义词(吃人嘴软拿人手短是什么意思) 最新快讯
RTOS实现双核MCU消息通信 全球快资讯 sml尺码对照表_sml哪个大号 哪个小号-世界视讯
数码博主进化论 世界观天下 5家名酒企业抛出2023发展目标,靠什么赢得双位数高增长?
天天微动态丨外账会计主要做什么每月上几天班(外账会计主要做什么) 天天最资讯丨今日成交额最高的信用债为“23安交01”
波音公司回应787飞机发现问题:影响近期交付 纽威股份:纽威集团拟减持不超2%公司股份 百事通
探路者揭示了更容易学习和玩起来更有趣的新规则手册|今日快讯 注意!菲菱科思:特定股东张海燕计划减持不超过100万股_全球今热点
qq网名女生高冷霸气英文2020(qq网名女生高冷霸气英文) 木偶奇遇记手抄报简单又漂亮三年级_木偶奇遇记手抄报
会计要素有哪些特征(会计要素有哪些) EldenRing开发者希望更频繁地发布新游戏
即时看!火笔顺怎么写田字格_火字笔顺怎么写 cad拉伸命令怎么用(cad拉伸命令) 速读
第一届中国式现代化企业发展峰会暨经观未来品牌发布会在京举办 热消息:太监最早起源于哪个国家_太监起源哪个朝代
熵增定律为什么可怕(熵增定律为什么绝望) 京东20年:VC史上经典一战
天天日报丨ArmoredCore6Collector'sEdition售价230美元并配备您自己的机甲 全球新动态:港股异动 | ASMPT(00522)涨超5% 机构称行业景气回升驱动戴维斯双击
天天快看:difxdriverpackagelnstall error_package control 焦点简讯:河北口岸首次在入境船舶截获长角立毛蚁
当前动态:氢气对人体的十大好处 创辉(氢气对人体的作用好处与坏处) 违法销售产自日本核辐射区食品,广东一百货公司被罚1万元
荣盛发展回复年报问询函:短期内销售不景气,公司存一定偿债压力 海关总署:前5个月民营企业进出口总额同比增长13.1%-天天热文
全球热门:六五环境日国家主题展TA们成了明星 港股异动 | 九方财富(09636)涨超4% 在线高端投教服务市场行业龙头地位巩固 业绩及估值有望彰显高弹性
天天快资讯丨麒麟尾猫是什么_麒麟尾猫 桑葚酱的做法厨师机版_桑葚酱的做法
面食的做法大全家常_面食小猪的做法 环球快看点丨光大银行行长王志恒:加强对粮食安全等重点领域的信贷支持力度
澳优子公司拟向伊利方面出售新西兰奶粉工厂60%股权 白糖未来行情以偏弱运行为主 静待现货市场继续去库 讯息
行政总裁兼执行董事许清流增持恒安国际(01044)20万股 每股作价约34.32港元 世界关注:全国110家洗煤厂样本开工率71.13% 较上期降2.57%
国泰君安(香港):首予鸿腾精密(06088)“买入”评级 目标价1.95港元 通威股份:硅料价格能否稳定很难说 公司会讨论方案来稳定股价
朝阳科技:公司有向客户提供VR面罩等产品 全球热推荐 每日视点!铁角飞驰怎么去(铁角飞地怎么去 魔兽世界7 0至高岭铁角飞地在哪里)
优然牧业全智能牛舍正式亮相 引领行业步入“无人化养牛”时代 环球时讯:人保财险长沙市分公司牵头住建安责险共保体积极开展“安全生产月”活动
【到佛山 逛禅城】“最平安”之此心安处是禅城|焦点资讯 和胜股份:在项目研发前沿领域一直与宁德时代深度合作_天天要闻
【全球聚看点】新疆伽师县:“甜蜜产业”采收季 农户喜迎好“丰”景 焦点消息!我的世界神奇宝贝喷火龙怎么mega进化(我的世界神奇宝贝喷火龙配招)
全球热议:高考加油,祝大胜归来!直击茂名考点现场 今日关注:凯里白衣天使在高铁上救治突发疾病的孩子
焦点资讯:野村东方国际证券祁宗超:多重因素共振 日股创33年新高 今日开考!加油,少年!
大方县黄泥塘镇2023年“美丽乡村”篮球联赛开赛 杉金张家港年产5000万平方米偏光片项目投产_速看
每日热议!北流市气象台发布雷电黄色预警信号【III级/较重】【2023-06-07】 守护满分,祝福满分!直击2023高考黄埔现场
西藏珠峰(600338)6月7日主力资金净买入59.91万元 焦点日报:国机汽车(600335)6月7日主力资金净买入1200.58万元
大有能源(600403)6月7日主力资金净卖出161.53万元 观察 Stable Diffusion「偷」代码建起10亿美元帝国?Stability AI创始人骗局被扒皮
江淮汽车(600418)6月7日主力资金净卖出7528.15万元-全球播报 事发凯里:他只剩个头在外面了!见状,抱孩子的大哥果断出手……|天天动态
三水区气象台发布暴雨黄色预警【III级/较重】【2023-06-07】 观速讯丨凯美特气:惠州凯美特气体有限公司例行停车检修完成并复产
菲达环保(600526)6月7日主力资金净买入205.85万元 汪俊林明确郎酒三大发展目标|全球新视野
国电南瑞(600406)6月7日主力资金净卖出2787.69万元|当前快看 小商品城(600415)6月7日主力资金净买入1.53亿元 今日热讯
方大炭素(600516)6月7日主力资金净卖出918.55万元 世界报道:达仁堂(600329)6月7日主力资金净买入1272.65万元
押题成功? 各家GPT来写今年高考作文,谁最出彩? 布林肯将在几周内访华?外交部回应 世界播报
车企价格战,供应商躺枪?网传长安汽车强扣10%货款!官方回应来了_世界观察 天天微速讯:国企领导出差带“小三”逛街?中央巡视组回应:将督促查实
牛弹琴:有人说阿里变了,但我看,阿里还是当年那个阿里 每日讯息!又炒“中俄太空威胁”!美媒曝美国将发射新间谍卫星追踪中俄航天器
每日视点!山东国资强势出手!郭广昌旗下德邦证券或易主 每日动态!长安汽车回应网传供应商“申诉函”,直扣货款等内容不实已报案
世界百事通!战投浮亏7%,中奥通宇IPO三成募资款用于买房 天天速看:接连举牌浙江交科和中原高速,长城人寿意欲何为?
成都工作最新招聘信息(成都工作)|天天短讯 电脑画图纸教程自学视频(电脑画图) 焦点报道
功率谱密度求功率(功率谱密度)_焦点播报 水浒传晁盖人物简介(水浒传晁盖)|快资讯
jiguangshijie.ys168.com(jiguangshijie) 天天观点 全球焦点!kdj中j线代表什么意思(kdj线分别代表什么)
今头条!外媒:芬兰宣布驱逐9名俄罗斯外交官 中国建设银行存款利率上涨?存20万到期利息18600,存钱抓紧了