一区二区三区成人_色婷婷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欧美不卡在线_欧美电影免费观看完整版_日本不卡一区二区_韩国欧美一区二区
日本中文一区二区三区| 日韩午夜精品电影| 秋霞成人午夜伦在线观看| 精品国产污网站| 色8久久精品久久久久久蜜| 国产精华一区二区三区| 国产成人夜色高潮福利影视| 国产精品第一页第二页第三页| 91精品国产入口在线| 91激情五月电影| 免费观看成人高| 久久久久九九九| 免费日韩av电影| 99久久99久久久精品齐齐| 天堂久久一区二区三区| 日本一区二区三区国色天香| 一区二区三区四区视频在线观看 | 久久久综合九色合综国产精品| 亚洲午夜久久久久中文字幕久| 91视频.com| 激情深爱一区二区| 99电影网电视剧在线观看| 奇米精品在线| 777午夜精品视频在线播放| 国产亚洲一区字幕| 午夜精品久久久久久久| 国产98色在线|日韩| 亚洲超碰精品一区二区| 色婷婷综合久久久久中文一区二区| 日韩二区在线观看| 综合自拍亚洲综合图不卡区| 91久久精品国产91性色tv| 99久久久无码国产精品| 久久影音资源网| 亚洲一区二区三区午夜| 国产精品视频500部| 国内成+人亚洲| 国产传媒一区二区| 不卡av在线网| 极品尤物av久久免费看| www.av精品| 色先锋资源久久综合| 国产精品麻豆网站| 国产成人精品在线看| 中文字幕中文字幕一区三区| 国产精品国产三级国产普通话99| 免费在线观看一区| 在线观看亚洲视频啊啊啊啊| 综合久久一区二区三区| 成人性生交大片免费看中文 | 欧美激情一区二区| av资源一区二区| 亚洲国产精品激情在线观看 | 国产一区二区女| 国产精品成人观看视频免费| 国产精品日韩二区| 日本一区二区三区免费观看 | 欧美中日韩免费视频| 欧美日韩一区二区在线观看| 中文字幕欧美国产| 狠狠色狠狠色合久久伊人| 久久国产精品一区二区三区| 91精品国产综合久久久久| 亚洲午夜在线观看视频在线| yourporn久久国产精品| 日本电影欧美片| 中文字幕字幕中文在线中不卡视频| 国产精品69久久久久水密桃| 欧美一区二区高清在线观看| 精品久久国产字幕高潮| 免费人成在线不卡| 日本a级片久久久| 久久久久国产一区二区三区四区| 裸体一区二区三区| 日本一区二区三区免费观看| 久久蜜桃av一区二区天堂 | 久久久久久一二三区| 精品一区二区影视| 麻豆av一区二区| 国产欧美视频在线观看| 国产91精品精华液一区二区三区 | 天天爽夜夜爽夜夜爽精品视频| 国产在线欧美日韩| 国产日韩精品一区| 成人av午夜影院| 宅男在线国产精品| 久久成人久久爱| 精品视频资源站| 日本美女一区二区| 中文字幕一区二区三区在线乱码| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 91视频观看视频| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 国产精品初高中精品久久 | 亚洲免费毛片网站| 国产精品二区在线| 欧美激情一二三区| 国产精品一区二区三区精品| 久久女同精品一区二区| 99天天综合性| 久久一区二区三区国产精品| a在线欧美一区| 亚洲精品在线电影| www.欧美.com| 国产日产欧美一区二区视频| 91婷婷韩国欧美一区二区| 久久久五月婷婷| 成人免费看片网址| 国产精品久久久久久久久久免费看| www国产亚洲精品| 国产精品乱码一区二区三区软件| 久久国产日韩欧美| 一二三四社区欧美黄| 中文字幕剧情在线观看一区| 香蕉久久一区二区不卡无毒影院| 在线观看国产一区| 狠狠色丁香久久婷婷综合丁香| 欧美老肥妇做.爰bbww视频| 国产精品456| 26uuu久久综合| 国产一区在线免费观看| 一区二区三区高清| 亚洲视频sss| 国产麻豆成人传媒免费观看| 国产精品国产精品国产专区不蜜| 久久亚洲一区二区| 性感美女极品91精品| 欧美精品xxxxbbbb| 91视频免费观看| 一区二区三区在线免费视频| 中文有码久久| 成人开心网精品视频| 亚洲欧洲精品一区二区三区不卡 | 91精品久久久久久蜜臀| 7777精品久久久大香线蕉小说| 91麻豆精品秘密入口| 国产精品福利一区二区三区| 天堂资源在线亚洲资源| 国产精品一二三四| 中文字幕精品在线不卡| 欧洲在线视频一区| 国产美女主播视频一区| 国产亚洲欧美一区在线观看| 色就是色欧美| 国产精品一区二区果冻传媒| 中文字幕中文乱码欧美一区二区| 色哟哟一区二区在线观看| eeuss鲁片一区二区三区在线看| 国产精品国产馆在线真实露脸 | 国产经典欧美精品| 亚洲国产精品高清| 91黄色免费网站| 风间由美久久久| 久久精品久久综合| 国产精品另类一区| 欧美日韩成人激情| 国产亚洲欧美另类一区二区三区| 日av在线不卡| 中文字幕久久午夜不卡| 欧美日韩精品一区二区三区四区| 97超级碰碰| 精品一区在线看| 亚洲黄色录像片| 精品久久久久一区| 一本一道久久久a久久久精品91| 91在线小视频| 精品一区二区三区免费视频| 国产精品国产a| 日韩欧美中文字幕公布| 亚洲国产欧美一区二区三区不卡| 91丨porny丨国产入口| 蜜臀av一区二区在线免费观看 | 麻豆成人免费电影| 国产精品家庭影院| 欧美一级高清片| 亚洲欧洲精品一区二区| 粉嫩av四季av绯色av第一区| 国产主播一区二区三区| 亚洲一区影音先锋| 日本一区二区三区视频视频| 欧美男同性恋视频网站| 亚洲精品第一区二区三区| 99久久无色码| 成人午夜激情片| 久久精品国产99| 一二三区精品视频| 国产精品久久久久久久第一福利| 91精品国产综合久久婷婷香蕉| 一区二区在线高清视频| 美国av一区二区三区| 91精品综合久久| 成人在线综合网| 国产尤物一区二区在线| 青青国产91久久久久久| 亚洲国产精品一区二区久久| 亚洲欧美日韩国产综合| 国产女人18水真多18精品一级做| 日韩欧美国产综合在线一区二区三区| 欧美亚一区二区| 色婷婷激情一区二区三区|