国产精品久久福利_亚洲成人网久久久_国产丝袜美腿一区二区三区_亚洲三级小视频_6080国产精品一区二区_欧美日韩精品一区二区_欧美第一区第二区_亚洲欧美色婷婷

首頁 | 資訊 | 財經 | 公益 | 彩店 | 奇聞 | 速遞 | 前瞻 | 提點 | 網站相關 | 科技 | 熱點 | 生活 |
世界消息!RTOS實現雙核MCU消息通信

發稿時間:2023-06-07 22:57:04 來源: 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函數以取消阻止接收任務,該任務現在可以從緩沖區讀取,因為緩沖區不再存在空的。 當然,以上僅提供基礎原理和方法,具體實現需結合項目實際情況。更多相關內容,請參看官方相關資料。審核編輯:湯梓紅

標簽:

責任編輯:mb01

網站首頁 | 關于我們 | 免責聲明 | 聯系我們

生活晚報網版權所有

Copyright @ 1999-2017 www.gaofoto.cn All Rights Reserved豫ICP備2022016495號-7

聯系郵箱:939 674 669@qq.com    

红桃av永久久久| 伊人久久av| 青椒成人免费视频| 午夜在线小视频| 一区二区三区中文在线| 欧洲杯半决赛直播| 九色porny视频在线观看| 亚洲精品电影网站| 国产精品久久久一本精品| 免费成人你懂的| 日本免费在线一区| 99亚洲伊人久久精品影院| 最新国产精品视频| 欧美图片一区二区三区| 日韩中文字幕一区二区高清99| 国产欧美一区二区精品性色 | 亚洲精选中文字幕| 天天色综合成人网| 人人在线97| 性欧美1819sex性高清大胸| 国产精品久久久久久吹潮| 2023国产精华国产精品| 清纯唯美激情亚洲| 国产美女精品一区二区三区| 日韩女优av电影在线观看| 好久没做在线观看| 成人免费视频观看| 精品免费视频| 精品久久久久久久久久| 欧美伊人久久久久久久久影院| 精品盗摄一区二区三区| 欧美一区二区三区婷婷| 国内成+人亚洲+欧美+综合在线| 真不卡电影网| 亚洲女人天堂av| 国产女呦网站| 久色成人在线| 成人影院一区二区三区| 亚洲人成午夜免电影费观看| 国产高清视频在线观看| 欧美激情不卡| 国产盗摄一区二区三区| 日韩一区二区视频| 国产精品诱惑| 99免费精品在线观看| 国产福利视频一区二区三区| 婷婷六月综合亚洲| 日本在线视频站| 久久久久久久一区| 色在线免费观看| 精品写真视频在线观看| 日韩丝袜情趣美女图片| 大陆精大陆国产国语精品| 久久精品免费一区二区三区| 成人app下载| 天堂а√在线官网| 国产一区二区成人久久免费影院| 久久黄色美女电影| 欧美日本在线观看| 国产情侣一区| 香蕉久久免费电影| 91国产免费看| 亚洲女优在线| 日本一级理论片在线大全| 韩国在线视频一区| 亚洲成人av在线| 最新精品在线| melody高清在线观看| 国产视频在线观看一区二区| 亚洲黄色录像| 国内精品免费**视频| 亚洲午夜视频在线观看| av中文字幕在线| 国产精品久久久久aaaa| 神马久久精品| 久久国内精品自在自线400部| 最新版sss视频在线| 丝袜亚洲另类欧美综合| 久久一留热品黄| 成人av观看| 欧美在线免费观看亚洲| 狠狠做六月爱婷婷综合aⅴ| 最新四虎影在线在永久观看www| 精品久久中文字幕久久av| 快she精品国产999| 丝袜久久网站| 三区四区在线视频| 欧美吞精做爰啪啪高潮| 欧美黄色录像| 亚洲片av在线| 欧美日韩1区2区3区| 亚洲欧美日韩精品久久| 欧美午夜一区二区福利视频| 日韩成人在线播放| 极品少妇xxxx精品少妇| 亚洲精品在线三区| 成人a'v在线播放| 欧美精品色综合| 99热精品一区二区| 成人另类视频| 欧美在线不卡视频| 日韩精品一区二区久久| 黄色污网站在线免费观看| 日韩精品一卡二卡三卡四卡无卡| 欧美一区二区视频在线观看2020| 国产精品白丝av嫩草影院| 亚洲欧美三级在线| 日本不卡在线视频| 成人综合日日夜夜| av福利导福航大全在线| 亚洲欧美国产制服动漫| 欧美第一区第二区| 成人av在线播放网址| 国产成人一区| 丝袜美腿一区| 日韩精品高清视频| 中文字幕一区二区三区精华液| 美女精品视频| 日韩av中文字幕在线播放| 六月丁香综合在线视频| 99热99re6国产在线播放| 国产真实伦在线观看| 久久亚洲精品小早川怜子| 国产精品一区二区日韩| 老司机aⅴ毛片免费观看| 久久久久国产精品麻豆ai换脸| 精品亚洲a∨| 中文字幕亚洲精品视频| 91视频免费播放| 成人国产精品久久| 日韩精品黄色网| 老司机精品视频在线| 好看的中文字幕在线播放 | 国产在线|日韩| 亚洲欧美激情小说另类| 91av久久| 亚洲精品视频观看| 成人在线观看免费播放| 欧美性欧美巨大黑白大战| 精品999日本| 色戒汤唯在线观看| 日韩三级.com| 国产亚洲va综合人人澡精品| 国产精品久久久久久麻豆一区软件 | 欧美日本一区二区视频在线观看| 亚洲国产精品精华素| 亚洲精品老司机| 亚洲成在人线av| 日韩福利视频网| www.51av欧美视频| 欧美亚洲国产一区二区三区| 午夜性色一区二区三区免费视频| 激情福利在线| 亚洲一区二区三区免费视频| av中文一区| 日本韩国一区| 亚洲一区二区综合| 精品久久成人| 日本亚洲精品| 日本丶国产丶欧美色综合| 亚洲乱码久久| 日韩伦理福利| 亚洲国内精品视频| 91丨porny丨首页| 亚洲福利天堂| yiren22综合网成人| 欧美视频在线观看免费| 99热在线精品观看| 涩涩视频在线| 亚洲黄页视频免费观看| 91亚洲午夜精品久久久久久| 伊人春色精品| 免费在线看黄| 欧美日韩aaaaaa| 国产精品一区2区| 老牛影视av一区二区在线观看| 日本大臀精品| 欧美色国产精品| 成人av在线播放网址| 亚洲宅男一区| 神马午夜伦理不卡 | 中文字幕亚洲区| 99精品电影| 天堂а√在线最新版中文在线| 亚洲福利视频久久| 国产精品福利在线播放| 激情亚洲成人| 日韩精品99| 在线观看免费观看在线91| 欧美日韩国产精品专区| 蜜臀av性久久久久蜜臀aⅴ四虎 | 日韩一卡二卡三卡| 久久精品日产第一区二区三区高清版 | 精品国产一区二区三区忘忧草| 国产午夜精品福利| 国产精品美女久久久浪潮软件| 日韩高清在线观看一区二区| 成全电影播放在线观看国语| 日韩午夜av电影| 综合在线观看色|