【NXP i.MX RT1170 技術手冊】- 雙核之MU資料及事件傳遞

一.簡介

NXP i.MX RT117x 在雙核運作下難免會需要相互間資料傳遞,MU( Messaging Unit ) 提供了 32 bit 資料傳輸,12 中斷( 4 Tx , 4 Rx , 4 GP) 可在雙方即時互傳資料。

本文主在講解透過 MU 在雙核之間資料傳輸及實作方式。

二. MU 介紹

下圖為 MU Block Diagram,在圖中可看到 MU 分為二側分別對應各別 Processor

 

從途中可看到分為四個部分分別處理資料傳輸接收、狀態 (SR) 、同步控制 (CR) 及中斷,藉由這四部分可達到雙核之間訊息通知或者事件通知


 

l   訊息通知

1.     MU 提供四組 Tx/Rx 資料長度 32 bit 可供使用,當發送端發送資料到 TR (Transmit Register),則清空狀態暫存器(SR) transmitter empty (TEn)位同時也會設定接收端 receiver full (RFn) 位,接收端 MU 會產生中斷通知 MCU 進行資料讀取

2.     當資料讀取完畢後將清空 receiver full (RFn) 位同時設定 transmitter empty (TEn)位通知發送端資料接收完畢,如此即完成一次完整資料傳輸

3.     下圖為手冊提供的流程圖,手冊當中所舉的例子是將四組 Tx 資料輸入完成後才開啟中斷通知,可透過讀取狀態暫存器 RFn TFn 確認目前資料近來是哪 Channel

 






























Note:

MU 在傳送資料前須確認 TEn 是否被設定,因為發送端無法得知接收段是否真正接收到資料,如果未確認可能導致接收段資料錯誤,同理接收端讀取資料前需確認 RFn 是否被設定,如此才可確保讀取的資料是由發送端發送過來。

 

l   事件中斷

MU 可透過中斷觸發通知另一側處理器進行處理或事件,或將相關資料放置於共同記憶體位置,如此可讓另一個側及時處理較大資料,下圖為 RT 配置可共同訪問的記憶體位置

 


















1.     設定控制暫存器(CR) General Purpose Interrupt Request (GIRn) 觸發中斷,同時會設定接收端處理器的狀態暫存器 (SR) Processor A General Interrupt Request n Pending (GIPn)

      2.     當接收端的控制暫存器 (CR) GIEn (General Purpose Interrupt Enable) 有設置則會觸發中斷,通至接收端處理器進行處理事件

      3.     當處理事件完成後清除 GIPn 後會同時清除發送端 GIRn,如此發送端處理器可藉由 GIRn 確認接收端處理器以處理完成

     下圖為手冊提供的流程,清楚的描述整體 General Purpose Interrupt

 


 




























三.
實作

本次透過 SDK multicore -> Hello Word 範例進行修改,省去配置雙核專案時間,在此專案中有預設 MCMGR middleware 是基於 MU 上建立,用於管理雙核運作

 

































1.    
載入 SDK 範例後,在 Master Slave專案中開啟 mcmgr_mu_internal 在此檔案中可看到 MCMGR 已經將相關的 IRQ Handler 實作,透過 mu_isr 確認中斷類型



















mu_isr 中已經通過輪方式確認各類型中斷並創建 weak symbol 方式宣告好涵式,使用者只要 override 創建負責 Handler 的涵式

 































 






















透過追蹤 MCMGR_EarlyInit 到底層可發現,由於整個 MCMGR 使用 Channel 3 發送事件資料等,故使用 MCMGR 須注意此點

 









































2.    
接下來修改 Slave 專案,透過 MU 傳送閃動次數及狀態,在 source -> hello_world_core1 中開頭新增宣告

#include "fsl_mu.h"

 

      3.     接下來要改動的地方也很簡單,由於此專案在 MCMGR_EarlyInit 已做好 MU 的初始化,讀者可直接呼叫 MU API 即可,在 main 中新增 setFleg 通知 Master 專案已經啟動

MU_SetFlags(MUB, 1);

 因為 SDK 範例使用 define 撰寫 LED 閃爍功能,筆者覺得不方便修改,故直接將 LED_TOGGLE 直接搬進去並新增要通知 Master LED 狀態及變化次數,以期可讓讀者了解 MU 傳訊運作,分別使用事件中斷及訊息傳遞

for{;;} 中調整為

    for (;;)

    {

    msg++;

        SDK_DelayAtLeastUs(500000U, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);

        if (g_pinSet)

        {

            GPIO_PinWrite(BOARD_USER_LED_GPIO, BOARD_USER_LED_GPIO_PIN, 0U);

            g_pinSet = false;

 

            if (kStatus_Success != MU_TriggerInterrupts(MUB, kMU_GenInt0InterruptTrigger ))

            {

              while(1);

            }

        }

        else

        {

            GPIO_PinWrite(BOARD_USER_LED_GPIO, BOARD_USER_LED_GPIO_PIN, 1U);

            g_pinSet = true;

        }

        MU_SendMsgNonBlocking(MUB, kMU_MsgReg0, msg);

    }

由程式當中可看到透過 MU_TriggerInterrupts GPIO low 時發送事件中斷,在變化時透過 MU_SendMsgNonBlocking 發送變化次數

 

 

4.     調整 Master 專案,同樣在 source -> hello_world_core0 中開頭新增宣告

#include "fsl_mu.h"

再來就是如第 1 點所述需要 implement 相關 IRQ Handler,此次我們使用 Channel 0 傳訊及 GenInt 0 ,故在 Master 需要 MU_Rx0FullFlagISR MU_GenInt0FlagISR

uint32_t msg = 0;

 

void MU_Rx0FullFlagISR(void){

    msg = MU_ReceiveMsgNonBlocking(MUA, kMU_MsgReg0);

    PRINTF("LED Change %d time.\r\n",msg);

    SDK_ISR_EXIT_BARRIER;

}

 

void MU_GenInt0FlagISR(void){

    PRINTF("LED Off.\r\n");

    SDK_ISR_EXIT_BARRIER;

}

 透過 IRQ Handler 印出 Slave 專案控制 LED 狀態。

main 中新增 MU_GetFlags 確認 Slave 相關配置以初始化完成

    while (1 != MU_GetFlags(MUA))

    {

    }

    (void)PRINTF("The secondary core running.\r\n");

 接下來在 Main 中需要 enable 相關中斷

    MU_EnableInterrupts(MUA, (kMU_Rx0FullInterruptEnable | kMU_Rx0FullInterruptEnable | kMU_GenInt0InterruptEnable));

 

如此 Master 及調整完畢

 

 
































































5.    
使用 RT1170 開發板燒錄後會停在 Maser 專案並看到 Slave 也被載入,點擊 Resume 會透過 Master 啟動 Slave Core,此時再次點即 Resume 即可

 






















 
 



























雙核都
啟動後可透過 Terminal 看到訊息變化,可看到在二次變化會產生一次 Off 跟預期相符,到此整個 MU 實作已完成。

 


























四.
參考資料

l  IMXRT1170RM 

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★博文作者未開放評論功能