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)鍵詞:
福建省南平市創(chuàng)新“一庫(kù)三單”信息化管理平臺(tái)_速看料
- 莆田市29個(gè)項(xiàng)目入選福建省2023年重點(diǎn)招商項(xiàng)目
- 含編內(nèi)!福建一批事業(yè)單位招人! 視焦點(diǎn)訊
- 福建高速路嚴(yán)查“分心駕駛” “電子警察”全部啟用
- 福建將提升閩政通APP精準(zhǔn)檢索、智能推送能力 開發(fā)人臉(語(yǔ)音)識(shí)別等功能
- 福建出臺(tái)促進(jìn)外資擴(kuò)增量穩(wěn)存量提質(zhì)量若干政策措施|熱門看點(diǎn)
- 廈大團(tuán)隊(duì)發(fā)現(xiàn)阿爾茨海默病的治療新靶點(diǎn)
- 2023年影視產(chǎn)業(yè)推介會(huì)在福建廈門舉行|世界速讀
- 【環(huán)球聚看點(diǎn)】2023年廈金海域聯(lián)合增殖放流活動(dòng)舉行
- 主題教育進(jìn)行時(shí) | 以賽事經(jīng)濟(jì)助推體育產(chǎn)業(yè)高質(zhì)量發(fā)展
- RTOS實(shí)現(xiàn)雙核MCU消息通信2023-06-08
- 高考頭一天,警察蜀黍有多忙?_當(dāng)前速讀2023-06-08
- 《山河令》制片人馬韜去世 多位工作人員發(fā)2023-06-08
- 全球微速訊:看來國(guó)家是動(dòng)真格了?第二批央2023-06-08
- 平安證券:拿地收縮聚焦,熱度分化加劇|天2023-06-08
- 一個(gè)沒有財(cái)富效應(yīng)的股市,一定不是一個(gè)健康2023-06-08
- 水果蘿卜的功效與禁忌(水果蘿卜好處和注意2023-06-08
- 下血本?皇馬給貝林厄姆的合同:稅后年薪102023-06-08
- 撐不住了!尤文已致信皇馬巴薩 商討退出歐2023-06-08
- 比亞迪高考作文押題成功!公關(guān)李云飛評(píng)論區(qū)2023-06-08
- 漢川市高考考場(chǎng)首設(shè)“智能安檢門”-環(huán)球微2023-06-08
- 環(huán)球熱點(diǎn)!國(guó)企領(lǐng)導(dǎo)與女子親密逛街被拍引熱2023-06-08
- 道孚縣氣象臺(tái)發(fā)布雷電黃色預(yù)警信號(hào)【III級(jí)/2023-06-08
- 國(guó)內(nèi)商品期市日間盤多數(shù)收跌 甲醇跌超3%2023-06-08
- 大盤弱勢(shì)震蕩不改 走勢(shì)反復(fù)在所難免2023-06-08
- 信濠光電:公司尚未涉及光模塊CPO業(yè)務(wù)2023-06-08
- 當(dāng)前關(guān)注:阜蒙縣氣象局發(fā)布冰雹橙色預(yù)警【2023-06-08
- 2023高考數(shù)學(xué)開考,考生沉著進(jìn)入考場(chǎng) 焦點(diǎn)2023-06-08
- 南向資金今日凈買入2.41億港元|觀點(diǎn)2023-06-08
- 熱資訊!名師點(diǎn)評(píng)上海高考作文:題目平實(shí)大2023-06-08
- 檔案日活動(dòng)預(yù)告|一起了解“石景山走過的路2023-06-08
- 驚險(xiǎn)萬(wàn)分!孩子在窗臺(tái)外搖搖欲墜,僅靠媽媽2023-06-08
- 優(yōu)博訊:公司目前暫未使用MLOps進(jìn)行開發(fā)2023-06-08
- 焦點(diǎn)要聞:海南橡膠:公司合同采用書面方式2023-06-08
- 焦點(diǎn)資訊:高質(zhì)量發(fā)展背景下的信托業(yè)蝶變2023-06-08
- 環(huán)球時(shí)訊:卡霍夫卡水電站大壩遭破壞,會(huì)有2023-06-08
- 全球熱資訊!外媒稱布林肯將訪華,外交部回2023-06-08
- “飛機(jī)+高鐵”一站式聯(lián)訂 天津“空鐵聯(lián)運(yùn)2023-06-08
- 對(duì)數(shù)相加等于真數(shù)相乘_兩個(gè)數(shù)相乘的積一定2023-06-08
- 打工人這個(gè)梗_打工人的梗出自哪里2023-06-08