一区二区三区成人_色婷婷av一区二区三区软件_国产精品福利av_亚洲五码中文字幕_色伊人久久综合中文字幕_欧美妇女性影城_亚洲一二三区在线观看_91在线视频网址_国产九色精品成人porny_国产一区二区电影_亚洲夂夂婷婷色拍ww47_日韩和欧美一区二区_国产欧美va欧美不卡在线_欧美电影免费观看完整版_日本不卡一区二区_韩国欧美一区二区

RTOS實(shí)現(xiàn)雙核MCU消息通信

  • strongerHuang
  • 2023-06-08 02:27:36

手機(jī)電腦多核的CPU你可能經(jīng)常看見,但多核的單片機(jī)相對(duì)來說就不那么常見了。隨著需求的增加、技術(shù)的進(jìn)步,單片機(jī)已不再局限于單核了,因此,近幾年陸續(xù)出現(xiàn)了雙核的單片機(jī)了。 你可能會(huì)好奇,雙核單片機(jī)之間怎么通信?其實(shí),通信的方式和方法有很多種。本文就給大家描述一下:使用FreeRTOS消息緩沖區(qū),實(shí)現(xiàn)簡(jiǎn)單的非對(duì)稱多處理(AMP)核心到核心通信,結(jié)合STM32H7(M4和M7) 雙核處理器為例。

概述


(資料圖片僅供參考)

實(shí)現(xiàn)STM32H7雙核之間通信是FreeRTOS官方提供的一個(gè)方案,是基于FreeRTOS消息緩沖區(qū),該消息緩沖區(qū)是無(wú)鎖循環(huán)緩沖區(qū),可以將大小不同的數(shù)據(jù)包從單個(gè)發(fā)送方傳遞到單個(gè)接收方。 說明,該消息緩沖區(qū)僅提供數(shù)據(jù)的傳輸,不提供通信相關(guān)協(xié)議處理。

基本原理

實(shí)現(xiàn)雙核之間通信基本原理:發(fā)送和接收任務(wù)位于非對(duì)稱多處理器(AMP)配置中的多核微控制器(MCU)的不同內(nèi)核上,這意味著每個(gè)內(nèi)核都運(yùn)行自己的FreeRTOS程序。 同時(shí),一個(gè)內(nèi)核在另一個(gè)內(nèi)核中具有生成中斷的能力,以及兩個(gè)內(nèi)核都有訪問的內(nèi)存區(qū)域(共享內(nèi)存)。消息緩沖區(qū)以每個(gè)內(nèi)核上運(yùn)行在應(yīng)用程序已知的地址置在共享內(nèi)存中,如下圖: 理想情況下,還將有一個(gè)內(nèi)存保護(hù)單元(MPU),以確保只能通過內(nèi)核的消息緩沖區(qū)API來訪問消息緩沖區(qū),并最好將共享內(nèi)存標(biāo)記為不可被其他程序占用。

單消息代碼描述

這里官方提供了實(shí)現(xiàn)該方案的基礎(chǔ)代碼(僅供參考)。 將數(shù)據(jù)發(fā)送到流緩沖區(qū)的代碼:

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()    }}
從流緩沖區(qū)讀取數(shù)據(jù)的代碼:
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()    }}
如果任務(wù)在xMessageBufferReceive()中進(jìn)入阻塞狀態(tài)以等待緩沖區(qū)包含數(shù)據(jù),則將數(shù)據(jù)發(fā)送到緩沖區(qū)必須取消阻塞該任務(wù),以便它可以完成其操作。 當(dāng)xMessageBufferSend()調(diào)用sbSEND_COMPLETED()時(shí),任務(wù)將不受阻礙。 ISR通過將消息緩沖區(qū)的句柄作為參數(shù)傳遞給xMessageBufferSendCompletedFromISR()函數(shù)來解除對(duì)任務(wù)的阻塞。 如圖箭頭所示,其中發(fā)送和接收任務(wù)位于不同的MCU內(nèi)核上:1.接收任務(wù)嘗試從空的消息緩沖區(qū)中讀取數(shù)據(jù),并進(jìn)入阻止?fàn)顟B(tài)以等待數(shù)據(jù)到達(dá)。2.發(fā)送任務(wù)將數(shù)據(jù)寫入消息緩沖區(qū)。3.sbSEND_COMPLETED()在正在執(zhí)行接收任務(wù)的內(nèi)核中觸發(fā)一個(gè)中斷。4.中斷服務(wù)例程調(diào)用xMessageBufferSendCompletedFromISR()來解除阻止接收任務(wù),該任務(wù)現(xiàn)在可以從緩沖區(qū)讀取,因?yàn)榫彌_區(qū)不再為空。

多消息代碼描述

當(dāng)只有一個(gè)消息緩沖區(qū)時(shí),很容易將消息緩沖區(qū)的句柄傳遞到xMessageBufferSendCompletedFromISR()中。 但是要考慮有兩個(gè)或更多消息緩沖區(qū)的情況,ISR必須首先確定哪個(gè)消息緩沖區(qū)包含數(shù)據(jù)。如果消息緩沖區(qū)的數(shù)量很少,則有幾種方法可以實(shí)現(xiàn):

如果硬件允許,則每個(gè)消息緩沖區(qū)可以使用不同的中斷線,從而使中斷服務(wù)程序和消息緩沖區(qū)之間保持一對(duì)一的映射。

中斷服務(wù)例程可以簡(jiǎn)單地查詢每個(gè)消息緩沖區(qū)以查看其是否包含數(shù)據(jù)。

可以通過傳遞元數(shù)據(jù)(消息是什么,消息的預(yù)期接收者是什么等等)以及實(shí)際數(shù)據(jù)的單個(gè)消息緩沖區(qū)來代替多個(gè)消息緩沖區(qū)。

但是,如果存在大量或未知的消息緩沖區(qū),則這些技術(shù)效率不高。 在這種情況下,可伸縮的解決方案是引入單獨(dú)的控制消息緩沖區(qū)。如下面的代碼所示,sbSEND_COMPLETED()使用控制消息緩沖區(qū)將包含數(shù)據(jù)的消息緩沖區(qū)的句柄傳遞到中斷服務(wù)例程中。 使用sbSEND_COMPLETED()的實(shí)現(xiàn):

/* 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讀取控制消息緩沖區(qū)以獲得句柄,將句柄作為參數(shù)傳遞到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 );}
如圖,使用控制消息緩沖區(qū)時(shí)的順序:1.接收任務(wù)嘗試從空的消息緩沖區(qū)中讀取數(shù)據(jù),并進(jìn)入阻止?fàn)顟B(tài)以等待數(shù)據(jù)到達(dá)。2.發(fā)送任務(wù)將數(shù)據(jù)寫入消息緩沖區(qū)。3.sbSEND_COMPLETED()將現(xiàn)在包含數(shù)據(jù)的消息緩沖區(qū)的句柄發(fā)送到控制消息緩沖區(qū)。4.sbSEND_COMPLETED()在正在執(zhí)行接收任務(wù)的內(nèi)核中觸發(fā)一個(gè)中斷。5.中斷服務(wù)例程從控制消息緩沖區(qū)中讀取包含數(shù)據(jù)的消息緩沖區(qū)的句柄,然后將該句柄傳遞給xMessageBufferSendCompletedFromISR()API函數(shù)以取消阻止接收任務(wù),該任務(wù)現(xiàn)在可以從緩沖區(qū)讀取,因?yàn)榫彌_區(qū)不再存在空的。 當(dāng)然,以上僅提供基礎(chǔ)原理和方法,具體實(shí)現(xiàn)需結(jié)合項(xiàng)目實(shí)際情況。更多相關(guān)內(nèi)容,請(qǐng)參看官方相關(guān)資料。審核編輯:湯梓紅

關(guān)鍵詞:

分享到:
?
  • 至少輸入5個(gè)字符
  • 表情

熱門資訊

一区二区三区成人_色婷婷av一区二区三区软件_国产精品福利av_亚洲五码中文字幕_色伊人久久综合中文字幕_欧美妇女性影城_亚洲一二三区在线观看_91在线视频网址_国产九色精品成人porny_国产一区二区电影_亚洲夂夂婷婷色拍ww47_日韩和欧美一区二区_国产欧美va欧美不卡在线_欧美电影免费观看完整版_日本不卡一区二区_韩国欧美一区二区
日本成人三级电影网站| 国产精品综合久久| 国产喷白浆一区二区三区| 久久婷婷久久一区二区三区| 日韩欧美一区二区在线视频| 91精品国产aⅴ一区二区| 日韩欧美一区电影| 久久先锋影音av| 中文字幕成人av| 亚洲综合成人在线视频| 日韩电影在线一区| 国产乱人伦偷精品视频免下载| 高清成人在线观看| 99久久国产免费免费| 欧美性大战久久久久| 亚洲日本无吗高清不卡| 在线视频国产一区| 欧美成人a∨高清免费观看| 国产欧美日韩在线| 亚洲午夜激情av| 国产在线看一区| 99在线国产| 亚洲电影免费| 777午夜精品视频在线播放| 久久九九影视网| 亚洲午夜久久久久| 激情国产一区二区| 国产传媒欧美日韩| 宅男在线精品国产免费观看| 日韩色在线观看| 日韩美女啊v在线免费观看| 日韩—二三区免费观看av| 夫妻av一区二区| 欧美在线播放一区| 欧美肥妇bbw| 1区2区3区欧美| 久久不见久久见中文字幕免费| 91国产在线免费观看| 亚洲 日韩 国产第一区| 91精品国产福利| 亚洲伊人伊色伊影伊综合网| 国产乱色国产精品免费视频| 久久综合精品一区| 欧美一二三区在线| 亚洲美女一区二区三区| 国产精品综合二区| 欧美亚洲一级二级| 欧美成人性福生活免费看| 亚洲综合色婷婷| eeuss鲁一区二区三区| 日本一区二区在线视频观看| 日韩一区二区在线观看视频播放| 一区二区三区欧美日| 成人h动漫精品一区二| 在线免费一区| 国产精品久久久久影院亚瑟| 国产一区二区三区在线观看精品| 国产区欧美区日韩区| 欧美日韩二区三区| 亚洲午夜久久久久中文字幕久| 99在线精品观看| 欧美日韩国产精选| 亚洲国产欧美另类丝袜| 91亚洲精品久久久蜜桃网站| 在线日韩一区二区| 一区二区三区在线免费| 99国产在线观看| 欧美丰满一区二区免费视频| 亚洲欧美日韩久久| 91青青草免费在线看| 欧美四级电影网| 午夜在线成人av| 日本一区二区免费看| 91精品国产入口| 欧洲亚洲一区二区| 久久久久久久性| 久久av中文字幕片| 亚洲韩国在线| 亚洲精品国产a久久久久久 | 精品99一区二区三区| 久久国产夜色精品鲁鲁99| 五月天色一区| 亚洲自拍偷拍网站| 欧美日韩精品免费看| 亚洲一区二区三区乱码| 1卡2卡3卡精品视频| 99久久精品国产精品久久| 欧美日韩视频专区在线播放| 亚洲国产成人高清精品| 精品国产_亚洲人成在线| 久久久国产精华| 92精品国产成人观看免费 | 奇米影视一区二区三区| 乱一区二区三区在线播放| 欧美国产一区二区在线观看 | 日韩欧美视频一区二区三区四区| 中文在线一区二区| 91精品国产一区二区三区动漫| 26uuu国产日韩综合| 成人动漫视频在线| 久久伊人蜜桃av一区二区| 99久久精品久久久久久清纯| 久久一区二区三区四区| 成人国产精品免费观看视频| 日韩美女一区二区三区| proumb性欧美在线观看| 久久亚洲精华国产精华液| 99久久婷婷国产综合精品| 久久网站最新地址| 91蝌蚪porny| 国产精品美女一区二区在线观看| 国产日韩一区欧美| 亚洲综合一二区| 色女孩综合影院| 国内成人自拍视频| 欧美不卡123| 99中文字幕| 亚洲天堂精品在线观看| 亚洲美女搞黄| 精品在线播放免费| 精品国产露脸精彩对白| 超碰在线97av| 亚洲伊人色欲综合网| 欧美婷婷六月丁香综合色| 国产福利一区二区三区| 国产午夜精品福利| 欧美日韩国产高清视频| 日本不卡不码高清免费观看| 日韩欧美一级二级三级| 国产一区二区三区四区hd| 亚洲一区二区精品视频| 在线影视一区二区三区| 99久精品国产| 夜夜嗨av一区二区三区中文字幕| 在线欧美小视频| 成人免费黄色大片| 亚洲人123区| 欧美日韩国产欧美日美国产精品| av爱爱亚洲一区| 一区二区三区在线免费播放| 欧美日韩一区二区不卡| 成人av资源网| 日本三级亚洲精品| 久久夜色精品国产噜噜av| 欧美亚洲免费高清在线观看| 国产综合久久久久影院| 国产精品美女www爽爽爽| 色婷婷综合激情| 91免费观看在线| 三级欧美韩日大片在线看| 精品av久久707| 色综合久久88色综合天天免费| 99视频在线观看一区三区| 亚洲国产人成综合网站| 日韩视频在线永久播放| 日韩一区二区三区高清| 高清av一区二区| 亚洲一区二区三区影院| 精品久久一区二区| 亚洲欧洲国产日韩精品| 91偷拍与自偷拍精品| 一区二区三区在线免费视频| 日韩欧美色综合| 一区二区三区三区在线| 91香蕉视频mp4| 蜜桃91丨九色丨蝌蚪91桃色| 中文字幕一区在线观看| 欧美一区二区福利视频| 亚洲一区二区免费视频软件合集| 99精品偷自拍| 六月丁香婷婷色狠狠久久| 日韩一区在线播放| 欧美成人在线直播| 欧洲精品视频在线观看| 久久偷窥视频| 91aaaa| 国产在线观看免费一区| 一区二区三区资源| 久久久av毛片精品| 欧美日本精品一区二区三区| 奇米影视首页 狠狠色丁香婷婷久久综合 | 国产色产综合产在线视频| 欧美性受xxxx黑人xyx| 欧美精品二区三区四区免费看视频 | 日本在线播放一区二区三区| 国产精品美女久久久久aⅴ | 天使萌一区二区三区免费观看| 欧美高清在线一区| 日韩视频一区二区三区在线播放 | 99久久99久久精品免费看蜜桃| 蜜桃av一区二区在线观看| 亚洲欧美日韩久久| 国产精品欧美综合在线| 亚洲精品在线观看网站| 91麻豆精品国产91久久久久| 在线观看网站黄不卡| 伊人色综合久久天天五月婷| 精品综合久久久| 国产一区二区三区四区hd| 91小视频免费观看|