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

-
上呼吸道感染如何治疗?呼吸道感染的症状有哪些?感冒通常是指上呼吸道感染,上呼吸道感染80%以上都是病毒感染。病毒感染的抗病毒疗效不确切,通常无需服药,而是多喝水、多休...
-
皮试阳性是什么意思?结核皮试阳性需要做进一步什么检查?皮试阳性临床有两种情况,最常见的是药物皮试,另外一种类型是对疾病的鉴别诊断。1、药物皮试:临床使用比较多的是青霉素皮试...
-
总二氧化碳高是怎么回事?二氧化碳高有什么症状和危害?总二氧化碳增高可能指两个含义,一个是动脉血气分析里的二氧化碳分压,另一个是血液生化检查里的二氧化碳结合率。动脉血气分...
-
肠胃感冒怎么缓解?胃肠型感冒是什么原因引起的?缓解胃肠型感冒的临床症状,可以从3个环节着手,具体如下:1、保暖:胃肠型感冒表现的都是胃肠道症状,由于是病毒感染,其抗...
-
支原体弱阳性是什么意思?支原体弱阳性一般怎么治疗最好?当正处在支原体感染,或者曾经有过支原体感染,支原体抗体检测可能呈阳性。支原体抗体弱阳性,只能说明曾经有过支原体感染。...
-
上呼吸道感染如何治疗?呼吸道感染的症状有哪些?
2023-06-01 11:06:38
-
皮试阳性是什么意思?结核皮试阳性需要做进一步什么检查?
2023-06-01 11:05:56
-
总二氧化碳高是怎么回事?二氧化碳高有什么症状和危害?
2023-06-01 11:05:08
-
肠胃感冒怎么缓解?胃肠型感冒是什么原因引起的?
2023-06-01 11:04:26
-
支原体弱阳性是什么意思?支原体弱阳性一般怎么治疗最好?
2023-06-01 11:03:30
-
RTOS实现双核MCU消息通信
2023-06-07 17:05:20
-
漯河城管坚守考场“最前沿” 合力“护航”高考
2023-06-07 17:15:02
-
镇平张林镇:“警司访+”新模式 多元协调解纠纷
2023-06-07 17:20:22
-
世界快讯:《秘境之眼》精彩影像评选结果揭晓 河南宝天曼保护区斩获第十名
2023-06-07 17:06:58
-
南阳卧龙区梅溪街道:释放活力强化服务 点亮夜市经济新发展
2023-06-07 17:10:18
-
新野县:扎实推进医保服务“乡村通” 不断提升公共服务满意度
2023-06-07 17:00:34
-
环球快资讯丨日本东电在福岛核污染水排海隧道完成海水灌注
2023-06-07 16:59:13
-
美研究:美国2021年每11分钟就有1人死于枪支暴力 创历史新高
2023-06-07 16:58:33
-
世界微头条丨省内首个!栾川有了国省干线公路“智慧交警”
2023-06-07 17:01:07
-
焦点!郑州城管启动全城静音模式 为考生保驾护航
2023-06-07 17:08:08
-
副市长李凤芝督导国家卫生城市管理农(集)贸市场治理工作
2023-06-07 17:19:05
-
最新:情系困难群众 “三夏”集中帮扶暖民心
2023-06-07 17:16:07
-
当前快讯:郑州市疾病预防控制局挂牌成立
2023-06-07 17:06:15
-
郑东新区多措并举保障高考期间食品安全
2023-06-07 17:15:04
-
镇平张林镇:“警司访+”新模式 多元协调解纠纷
2023-06-07 17:18:43
-
郑东新区助力莘莘学子 为高考保驾护航
2023-06-07 17:18:39
-
河南红东方化工股份有限公司磷酸盐混合液定向转化生产焦磷酸钠改扩建项目环境影响报告书征求意见稿公示_焦点短讯
2023-06-07 17:17:40
-
漯河城管坚守考场“最前沿” 合力“护航”高考_环球微速讯
2023-06-07 17:22:26
-
郾城区法院:司法拘留威力显 “老赖”立马把钱还
2023-06-07 17:06:51
-
南阳卧龙区梅溪街道:释放活力强化服务 点亮夜市经济新发展
2023-06-07 17:06:03
-
当前快讯:《秘境之眼》精彩影像评选结果揭晓 河南宝天曼保护区斩获第十名
2023-06-07 17:01:03
-
2023护航高考|一桌、一椅,一位考生和三位监考老师……
2023-06-07 17:11:30
-
机构:房企融资规模仍在下降 海外债有新发 每日资讯
2023-06-07 17:21:16
-
2023护航高考|开考当日 示范区加强考点周边环境检查整治为高考护航|看点
2023-06-07 17:16:42
-
全球热文:2023护航高考|高新区:三方联动 护航学子筑梦路
2023-06-07 17:12:40
-
许昌:服务农机合作社 全力以赴保障夏粮颗粒归仓|全球讯息
2023-06-07 17:10:43
-
中原区规范市场秩序 护航高考学子
2023-06-07 17:00:21
-
文明就在举手投足间_天天资讯
2023-06-07 17:15:01
-
新消息丨新野县:扎实推进医保服务“乡村通” 不断提升公共服务满意度
2023-06-07 17:09:00
-
全球热资讯!荥阳市委书记杨金军检查2023年高考准备工作
2023-06-07 17:05:07