RTOS实现双核MCU消息通信 世界今日报
手机、电脑多核的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消息通信 世界今日报
- 全球关注:上海市纪委监委通报4起群众身边的腐败问题
- 【全球热闻】周大生:会加大在华东、华南开店力度
- 万华化学于四川投资设立新能源材料科技公司 全球今日讯
- 天宫TV | “圆梦乘组”与“博士乘组”梦幻联动! 观察
- 手机问题:中兴远航10怎么隐藏应用-独家焦点
- 手机问题:努比亚Z30Pro是双屏吗
- 6月7日华夏潜龙精选股票净值上涨0.11%
- 中信保诚基金:3200点,你可以更乐观一点 环球报资讯
- 申购费率什么意思_什么是基金申购费率|全球热点评
- 2023金融消费安全论坛暨金融消费帮扶工程启动仪式在京举行
- 什么是矿物加工技术程-当前关注
- 丰原药业:公司没有治疗猴痘病毒的药品
- 招募600人!湖南发布高校毕业生“三支一扶”计划
- 世界消息!国金证券:能拿好地且快速去化的房企更加受益
- 指鼠为鸭?江西省教育厅介入“食堂老鼠头”事件,网友爆料教职工要求控评,涉事窗口几乎没人去吃饭了……_环球焦点
- 中央气象台:未来两天麦收区多晴好 利于小麦抢收晾晒_世界通讯
- 无人机视角看秀美乌苏里江畔
- 热点聚焦:人才流失对港经济影响严重!很难看到的港澳荣景,这个夏天有点冷
- 电信话费查询的电话号码是多少_电信的话费查询号码是多少
- 300N.m超大扭矩长安汽车,UNI-T眨眼间释放驾趣本能_环球微头条
- 给高考生的11条饮食建议,家长们快收好
- 上海医保报销比例2022年具体情况 上海医保报销新规2023年最新消息-今日热门
- 战国时期七国地理位置_齐国地理位置 环球时快讯
- 长三角之窗 | “昆山是懂企业的”_天天观速讯
- 《节奏剧场 Final Bar Line》时空之轮第2弹DLC曲目试听
- 天天视讯!中信证券:苹果MR引领产业革命 内容需求有望爆发
- 教育部公布素质教育监测数据 或可减少企业间恶意竞争_全球球精选
- 哪个城市的绿化带这么卷啊?!
- 中方呼吁推动发展议题重回国际议程中心位置|焦点观察
- 每日热点:广州发展:公司气源包括国内中石油、中海油、中石化供应的管道天然气等
- DP龙猪永不停息2023巡演昆明站(时间+地点+门票+阵容)|独家焦点
- 首控集团(01269.HK)拟就债务资本化发行1.25亿股
- 吃什么补血小板白细胞_吃什么东西补血小板 每日动态
- 吉林启动省级社会组织助力乡村振兴行动_全球信息
- 魔兽世界怀旧服重皮怎么打(WOW怀旧服重皮速刷)
- 乐东成立金融法治服务中心 推进金融纠纷多元化解
- 总投资100亿元,漯河经开区超高压流体技术创新产业园项目签约
- 全球讯息:硅胶和橡胶有什么区别_硅胶和橡胶的区别
- 末世千里行完整版_末世千里行-全球播资讯
- 全球财经连线|日经指数涨破32500点,日特估行情能否延续? 环球视讯
- [快讯]美利信:长江证券承销保荐有限公司美利信使用募集资金向全资子公司增资以实施募投项目的核查意见
- 各地推出多项举措护航高考 为学子撑起“安全伞”-讯息
- 北斗“神器”助力智慧农业 科技为夏收保驾护航 百事通
- 北斗“神器”助力智慧农业 科技为夏收保驾护航
- 全球热资讯!北斗“神器”助力智慧农业 科技为夏收保驾护航
- wps向程序发送命令时出现问题怎么解决(向程序发送命令时出现问题怎么解决) 天天热消息
- 读书使人明智谁说的(读书使人明智是谁的名言)_速递
- 当前快讯:热火扳平总比分!球队三大改变收获奇效,约基奇陷入了一个怪圈?
- 陆元九院士生前采访:“中国航天,99 分都是不及格!”
- 当拼多多客服遇上“贫穷”的买谷人-今日聚焦
- 掌趣科技董事长拟减持不超1%股份,29个交易日股价涨幅超30%
- 当拼多多客服遇上“贫穷”的买谷人
- 在自家承包土地内擅自挖砂石料被判刑
- 红烧鸡腿棍做法?
- 2023年海南三亚高考成绩查询入口、查分方式:海南省考试局 世界快播报
- 国家外汇管理局局长潘功胜会见花旗集团首席执行官范洁恩
- 造成承包地停产停业怎么赔偿呢(造成承包地停产停业怎么赔偿)-当前时讯
- ST万林:业绩说明会定于6月14日举行
- 营养均衡(关于营养均衡的基本详情介绍) 全球播报
- 文化兴国运兴丨流失文物回归昭示了一个道理 天天快资讯
- 农民工在工地上受伤骨折怎样赔偿_世界简讯
- 焦点速递!小米集团-W(01810)连续2日回购 累计斥资4795.67万港元
- 沈兵履新! 全球热闻
- 正海生物:接受博时基金等机构调研
- 海南省纪委监委驻省人力资源和社会保障厅纪检监察组副组长孙长志被查
- 百色受贿罪如何判刑
- 嘂嚻龘靐龖怎么读_嘂_百事通
- 漠漠水田飞白鹭阴阴夏木啭黄鹂画面_漠漠水田飞白鹭阴阴夏木啭黄鹂 环球快资讯
- 上海第十人民医院最新研究:电子烟危害更小,对肺部影响微乎其微
- 原神繁荣的指引哪些角色需要?
- 天天热文:国博展览“数说犀尊”:为你揭秘博物馆里的“黑科技”
- 南城县气象台发布雷电黄色预警信号【III级/较重】【2023-06-06】
- 不要说话歌词完整版_不要说话歌词_天天观速讯
- 【文明嘉鱼】咸宁市生态环境局嘉鱼县分局联合鱼岳镇小湖社区开展“世界环境日”活动-当前消息
- 教育部举办2023年全国职业院校优秀教师事迹报告会
- 环球看热讯:欧亿3app下载链接_易欧官网版v6.014
- 唯品会崩了相关负责人被免职 业绩损失超亿元 通讯
- 帅化民评解放军歼-16拦截美侦察机:大陆已经够容忍了
- 当前通讯!6月6日要闻提示
- 主页被篡改教你如何恢复(主页被篡改)
- 关于狂飙张彪扮演者说张译是恩人的相关信息|视焦点讯
- “强制同化100万西藏儿童”?外籍特约观察员独家探访西藏寄宿制学校
- 基恩:弗雷德犯规德布劳内蠢到极致,但这也不是他第一次发病了 全球要闻
- 快消息!德耀西城|赵欣——志愿公益十余载 重在慈心做实事
- 通讯!安庆市新开塑化有限责任公司
- 快资讯:今日六大基酒有哪些英文_世界六大基酒有哪六大英文
- 蒲黄的功效与作用_蒲黄的功效与作用是什么
- 方格笔记本模版(方格笔记本) 天天看点
- 全球热消息:男人不管差不差钱,夏天尽量少穿这4双“邋遢鞋”,廉价掉档次
- 手机问题:iPhone12mini怎么截图 世界头条
- 唐嫣诉丝绸公司侵权案将开庭 全球微资讯
- 人与自然和谐共生 书写多彩生态答卷 全球资讯
- 老人景区突发疾病 仁和医生紧急施救-世界快消息
- 华天:队友的表现值得骄傲-天天头条
- 苹果WWDC23前瞻:近10年最重磅产品将发布、苹果会否入局AI大战? 前沿资讯
- 济南这群“足球女孩”将代表中国参加2023年世界中学生足球锦标赛
- 西藏禁止宗教活动?外国人进入西藏佛学院探寻真相
- Y Combinator 创始人:股市投资者难以参与 AI 浪潮-今日最新
- 当前热讯:安达智能(688125)6月5日主力资金净卖出15.26万元