品牌 资讯 搭配 材料 时尚 热点 行业 首饰 玉石 行情

RTOS实现双核MCU消息通信

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

标签:

相关文章

RTOS实现双核MCU消息通信

​RTOS实现双核MCU消息通信-手机、电脑多核的CPU你可能经常看见,但多核

2023-06-07 20:21:01

试驾海鸥真实感受:底盘扎实,动力够用,极夜黑加深海蓝好看

​此前,我们在厦门近40℃的天气里试驾了比亚迪海鸥,发现在城市道路里,

2023-06-07 19:38:40

安溪以优秀文艺宣传贯彻党的二十大精神

​近日,安溪县在县人民广场举办“学习二十大茶乡在行动”文艺惠民宣讲启

2023-06-07 19:34:37

江西省教育厅介入“高校食堂吃出疑似老鼠头”事件,其他承包商称受到牵连 全球热讯

​江西省教育厅介入“高校食堂吃出疑似老鼠头”事件,其他承包商称受到牵

2023-06-07 19:27:44

今日观点!广州越秀区东风西路小学:课程融合促“双减”落实

​中国教育报讯(通讯员尹伊记者刘盾)“我们在综合实践课上到天台的农田

2023-06-07 18:32:36

世界快看点丨文一科技(600520)6月7日主力资金净卖出94.53万元

​截至2023年6月7日收盘,文一科技(600520)报收于14 02元,上涨3 24%,换

2023-06-07 18:11:57

天天热点!苏州相城一企业获批国家博士后科研工作站

​省人力资源社会保障厅印发了《关于2022年第二批次博士后科研工作站备案

2023-06-07 17:43:03

和胜股份:在项目研发前沿领域一直与宁德时代深度合作_天天看热讯

​和胜股份表示,公司在项目研发前沿领域一直与宁德时代保持深度合作。由

2023-06-07 17:34:44

塞尔达传说王国之泪你是萨派还是科派任务怎么做[多图]_快报

​塞尔达传说王国之泪你是萨派还是科派任务怎么做?你是萨派还是科派是本

2023-06-07 17:02:01

世界热点评!6月7日 14:42分 浙矿股份(300837)股价快速拉升

​分时图快速拉升意味此时存在大单买入,在大单的推动下,股价快速地上涨

2023-06-07 16:51:03

山阴县气象台发布大风蓝色预警【Ⅳ级/一般】【2023-06-07】

​山阴县气象台2023年06月07日10时55分发布大风蓝色预警信号,预警区域:

2023-06-07 16:26:51

奔腾小马,年轻人这点爱好你算是玩明白了 焦点速递

​车尾部分则采用了与前灯组相呼应的设计风格,让整车线条非常协调。同时

2023-06-07 15:21:55

《全知读者视角》如何成为韩国特色爽文?-焦点

​《全知读者视角》是韩国的一部国民级小说,被誉为“韩国网文三巨头之一

2023-06-07 14:41:41

2023《支付宝》蚂蚁庄园6月8日每日一题答案-全球报道

​黄豆是一种非常营养丰富、健康美味的食品,具有多种功效和食用方式,我

2023-06-07 14:03:23

世界快看:小区的树挡阳光怎么办

​房子的采光会受到多重因素的影响,有时候是出于外部原因,比如小区内的

2023-06-07 13:57:45

【焦点热闻】伊人在线大香蕉

​1、郭晋安的妻子是欧倩怡2、出生于广东顺德,毕业于香港培正中学,是一

2023-06-07 13:17:06

忙种又忙收 麦黄梅子熟|环球今日报

​新华社北京6月6日电题:忙种又忙收麦黄梅子熟新华社记者胡梦雪、张晓洁

2023-06-07 12:07:09

1小时6.5元!共享单车悄然涨价 已贵过公交地铁

​2015年,被称为共享经济元年。风口之下,市场上涌现出共享单车、共享充

2023-06-07 11:17:36

沪深股通|洛阳钼业6月6日获外资卖出0.06%股份_天天热推荐

​同花顺数据显示,2023年6月6日,洛阳钼业获外资卖出1005 31万股,占流

2023-06-07 10:20:09

水浒传第一回概括300字_水浒传第一回概括

​想必现在有很多小伙伴对于水浒传第一回概括方面的知识都比较想要了解,

2023-06-07 09:55:46

blackbird日语歌怎么学_blackbird日语歌|今日热文

​1、BlackBird歌手:ぼくのりりっくのぼうよみお前には翼がある你拥有的

2023-06-07 09:18:22

世界观天下!捉急什么意思饭圈是哪里的方言 智商捉急什么意思

​想必现在有很多小伙伴对于捉急什么意思饭圈是哪里的方言(智商捉急什么

2023-06-07 08:24:09

新中国宪法发展历程思维导图_新中国宪法发展历程|环球热消息

​1、1949共同纲领。2、宪法性文件;1954第一部宪法;1978年宪法;1982年

2023-06-07 07:32:27

时讯:淘宝如何设置限购一件_淘宝限购一件怎么设置

​1、具体操作有如下几个步骤:一、下载电脑版“千牛”客户端,登录商家

2023-06-07 06:28:53

汝之秀吾何时能及下一句_汝何秀是什么意思汝之秀吾何及怎么接

​想必现在有很多小伙伴对于汝何秀是什么意思,汝之秀吾何及怎么接方面的

2023-06-07 05:57:13

高考壮行,为梦想出征

​高考壮行,为梦想出征,主流媒体,山西门户。山西新闻网是经国务院新闻办

2023-06-07 05:17:53

全球视讯!NOKIA_6300怎么删除系统文件 比如主题

​其实很简单,下载一个你手机能用的Anyview软件(jar格式的,最好连着ja

2023-06-07 04:28:16

全球消息!柿子和螃蟹一起吃有毒性吗_柿子和螃蟹一起吃有毒

​1、死蟹,蛋白质变质,细菌繁殖,进食后引起细菌性食物中毒,与同吃柿

2023-06-07 03:33:35

单身公主相亲记歌曲大全_单身公主相亲记歌曲

​1、片头曲:YOUayetheone(林志颖)插曲:你不知道 九月(唐笑)片尾曲:颜色(林

2023-06-07 03:06:31

环球时讯:农业银行(601288.SH):首席风险官武刚任职

​智通财经APP讯,农业银行(601288 SH)发布公告,农业银行于近日收到《国

2023-06-07 02:00:16