色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

RTOS實現雙核MCU消息通信

strongerHuang ? 來源:strongerHuang ? 2023-06-07 14:48 ? 次閱讀

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

分享正文之前推薦一個嵌入式招聘信息的平臺:

概述

實現STM32H7雙核之間通信是FreeRTOS官方提供的一個方案,是基于FreeRTOS消息緩沖區,該消息緩沖區是無鎖循環緩沖區,可以將大小不同的數據包從單個發送方傳遞到單個接收方。 說明,該消息緩沖區僅提供數據的傳輸,不提供通信相關協議處理。

基本原理

實現雙核之間通信基本原理:發送和接收任務位于非對稱多處理器(AMP)配置中的多核微控制器MCU)的不同內核上,這意味著每個內核都運行自己的FreeRTOS程序。 同時,一個內核在另一個內核中具有生成中斷的能力,以及兩個內核都有訪問的內存區域(共享內存)。消息緩沖區以每個內核上運行在應用程序已知的地址置在共享內存中,如下圖:cb6c46fc-04fe-11ee-90ce-dac502259ad0.png ?理想情況下,還將有一個內存保護單元(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 can be 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()時,任務將不受阻礙。cb8bba1e-04fe-11ee-90ce-dac502259ad0.png ?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 );
}
cb941420-04fe-11ee-90ce-dac502259ad0.png如圖,使用控制消息緩沖區時的順序:1.接收任務嘗試從空的消息緩沖區中讀取數據,并進入阻止狀態以等待數據到達。2.發送任務將數據寫入消息緩沖區。3.sbSEND_COMPLETED()將現在包含數據的消息緩沖區的句柄發送到控制消息緩沖區。4.sbSEND_COMPLETED()在正在執行接收任務的內核中觸發一個中斷。5.中斷服務例程從控制消息緩沖區中讀取包含數據的消息緩沖區的句柄,然后將該句柄傳遞給xMessageBufferSendCompletedFromISR()API函數以取消阻止接收任務,該任務現在可以從緩沖區讀取,因為緩沖區不再存在空的。 當然,以上僅提供基礎原理和方法,具體實現需結合項目實際情況。更多相關內容,請參看官方相關資料

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17123

    瀏覽量

    350992
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10854

    瀏覽量

    211583
  • RTOS
    +關注

    關注

    22

    文章

    811

    瀏覽量

    119595

原文標題:RTOS實現雙核MCU消息通信

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    RTOS實現MCU消息通信

    之間怎么通信?其實,通信的方式和方法有很多種。本文就給大家描述一下:使用FreeRTOS消息緩沖區,實現簡單的非對稱多處理(AMP)核心到核心通信,結合STM32H7(M4和M7)
    發表于 06-07 14:45 ?1181次閱讀
    <b class='flag-5'>RTOS</b><b class='flag-5'>實現</b><b class='flag-5'>雙</b><b class='flag-5'>核</b><b class='flag-5'>MCU</b>消息<b class='flag-5'>通信</b>

    非對稱MCU基礎知識及通信

    來源 網絡本文從對比兩顆分立MCU與單芯片MCU開始(以LPC4350為例),展開介紹了非對稱
    發表于 05-15 14:26

    OMAPL138的通信組件DSPLINK開發和通信演示教程

    共享一個OMAPL138的通信組件DSPLINK開發和通信演示教程,希望大家頂頂??!
    發表于 06-21 17:09

    基于MCU提高系統性能

    MCU 內核的資源和不同任務所需要的運行時間,需要更多的測試時間,因此不利于擴展和產品維護。面對種種不足,異構架構應運而生,可以很好解決上述問題。事實上,非對稱
    發表于 07-04 07:49

    非對稱MCU的基礎知識與重要特點

    本文從對比兩顆分立MCU與單芯片MCU開始(以LPC4350為例),展開介紹了非對稱
    發表于 11-01 06:29

    MCU Pico的相關資料分享

    樹莓派不講武德,自研MCU Pico,STM32哭暈在廁所!重磅,樹莓派再出Pico自研MCU
    發表于 11-04 08:51

    如何用一個比較簡單SMP的example來體現的處理能力比單核強呢?

    qemu-vexpress-a9 這個平臺上實現一下?;蛘邠Q個問題:在MCU的大部分應用場景下(排除MPU),大家都是如何看待,什么情況下必須上
    發表于 03-13 15:17

    請問之間如何通信

    請問之間如何通信? 怎么處理核對外設資源出現競爭的問題?
    發表于 05-26 06:37

    DSP MCU,什么是SP MCU

    DSP MCU,什么是SP MCU 各種數字消費產品特別是便攜式數字產品的功能已由單一
    發表于 03-26 15:00 ?1022次閱讀

    非對稱MCU基礎知識及通信

    本文從對比兩顆分立MCU與單芯片MCU開始(以LPC4350為例),展開介紹了非對稱
    發表于 03-26 15:31 ?3667次閱讀
    非對稱<b class='flag-5'>雙</b><b class='flag-5'>核</b><b class='flag-5'>MCU</b>基礎知識及<b class='flag-5'>核</b>間<b class='flag-5'>通信</b>

    應用非對稱MCU增強系統性能

    本文從對比兩顆分立MCU與單芯片MCU開始(以LPC4350為例),展開介紹了非對稱
    發表于 04-11 10:05 ?1043次閱讀
    應用非對稱<b class='flag-5'>雙</b><b class='flag-5'>核</b><b class='flag-5'>MCU</b>增強系統性能

    非對稱MCU基礎知識及通信

    本文從對比兩顆分立MCU與單芯片MCU開始(以LPC4350為例),展開介紹了非對稱
    的頭像 發表于 03-13 15:47 ?5188次閱讀
    非對稱<b class='flag-5'>雙</b><b class='flag-5'>核</b><b class='flag-5'>MCU</b>基礎知識及<b class='flag-5'>核</b>間<b class='flag-5'>通信</b>

    非對稱MCU基礎知識及通信

    本文從對比兩顆分立MCU與單芯片MCU開始(以LPC4350為例),展開介紹了非對稱
    發表于 10-26 09:21 ?11次下載
    非對稱<b class='flag-5'>雙</b><b class='flag-5'>核</b><b class='flag-5'>MCU</b>基礎知識及<b class='flag-5'>核</b>間<b class='flag-5'>通信</b>

    先楫HPM6000系列MCU怎么玩?

    多核的微控制器(MCU)向來是設計上的一大挑戰,尤其是多核異構的設計。而MCU作為其中的精簡版本,憑借其超強的處理性能和便捷開發的特性,很快受到業界的好評。先楫半導體先后推出了幾款
    的頭像 發表于 05-10 14:25 ?1661次閱讀
    先楫HPM6000系列<b class='flag-5'>雙</b><b class='flag-5'>核</b><b class='flag-5'>MCU</b>怎么玩?

    先楫HPM6000系列MCU通信方式和資源分配

    在《玩轉MCU(上)》文章里,我們給大家介紹了先楫HPM6000系列的特性、使用方法以及工程編譯與調試。本文緊接上篇內容,給大家詳細
    的頭像 發表于 05-14 09:58 ?3585次閱讀
    先楫HPM6000系列<b class='flag-5'>MCU</b><b class='flag-5'>雙</b><b class='flag-5'>核</b>的<b class='flag-5'>通信</b>方式和資源分配
    主站蜘蛛池模板: 亚洲国产精品久久无套麻豆| 久久国产主播福利在线| av免费网站不卡观看| 影音先锋色av男人资源网| 亚洲国产精品综合久久一线| 偷尝禁果H1V1幸运的山熊| 视频成人app永久在线观看 | 24小时日本在线| 一个人的免费高清影院| 亚洲人成伊人成综合网久久久| 午夜福利08550| 特级毛片全部免费播放免下载| 肉耽高h一受n攻| 色综合a在线| 午夜国产精品视频| 午夜向日葵高清在线观看| 亚洲H成年动漫在线观看不卡| 性色AV乱码一区二区三区视频| 午夜不卡久久精品无码免费| 无码丰满人妻熟妇区| 亚洲国产成人精品久久久久 | 老妇高潮潮喷到猛进猛出| 精品淑女少妇AV久久免费| 精品国产麻豆AV无码| 久久国产精品福利影集| 久久这里有精品| 欧美阿v天堂视频在99线| 青青草色青伊人| 天天拍拍国产在线视频| 亚洲精品成人AV在线观看爽翻| 亚洲精品无码久久久久A片| 医生含着我的奶边摸边做| 2020国产成人免费视频| jizzjizz中国大学生| 超碰97免费人妻| 国产香蕉视频| 啦啦啦 中国 日本 高清 在线| 欧美日韩视频高清一区| 四虎影院网红美女| 亚洲精品无码成人AAA片| 最新色导航|