【NXP i.MX RT1170 技術手冊】- 在雙核使用 RDC

關鍵字 :RT1170RDCdual-corert1170nxpmemoryapp

 一.簡介

        在i.MX RT1170處理器中,Resource Domain Controller (RDC) 用於實現多核處理環境下的資源隔離和訪問控制。RDC允許系統設計者定義不同Domain之間的訪問權限,確保每核心或總線主控僅能訪問其授權的記憶體區域和外設,從而提高系統的安全性和穩定性。

二.
運作步驟

CM7 核心發起對 Periph1(例如 GPIO)的使用時,RDCResource Domain Controller)會通過多個子模組(如 Main FabricMDACMRC 等)進行管理和控制,以確保資源的安全和可靠使用。


RDC
Peripheral 具體的操作流程如下:

1.      發起訪問請求(CM7 核心)

  l   CM7 核心發起對 Periph1 的訪問請求,例如讀取 GPIO 狀態。

  l   該請求包含 DIDDomain ID)以及其他控制信息(如讀取、寫入和特權模式)。

2.      MDAC

  l   Master Domain Assignment Controller (MDAC) 負責生成該請求的 DID,並設置請求的非安全和特權屬性。

  l   MDAC 根據預編程的主域分配MDA)暫存器生成每系統總線事務的 DID

3.      Main Fabric

  l   Main Fabric 是系統總線架構,負責管理數據傳輸和信號流

  l   Main Fabric 將包含 DID 的總線事務傳遞給 Periph1

  l   在傳輸過程中,Main Fabric 會將 DID 和其他控制信息(如讀取、寫入和特權模式)附加到總線事務中。

4.      RDC

  l   RDC 接收到總線事務後,會檢查該請求的 DID Periph1 PDAPPeripheral Domain Access Permissions)暫存器中配置的允許域列表。

  l   如果 DID 在允許列表中,並且符合設置的訪問權限(例如讀取或寫入),則允許該請求。

5.      Semaphore 控制(SEMA42,可選)

  l   如果 Periph1 被配置為需要 Semaphore,則 CM7 核心必須首先獲取 Semaphore

  l   Semaphore SEMA42 模組管理,CM7 核心需要發送請求以獲取 Semaphore

  l   如果 Semaphore 被成功獲取,SEMA42 模組會將 Semaphore 狀態反饋給 RDC,允許該請求進一步處理。

6.      執行訪問(Periph1):

  l   RDC 確認 CM7 核心具有適當的訪問權限後,允許對 Periph1 的訪問。

  l   CM7 核心執行具體的操作,例如讀取 GPIO 引腳狀態

7.      釋放 SemaphoreSEMA42 行為,可選):

  l   完成操作後,如果使用了 SemaphoreCM7 核心需要釋放 Semaphore

  l   釋放 Semaphore 後,其他有權限的域可以申請並獲取 Semaphore 以訪問 Periph1

 

         RDC Peripheral 具體的操作流程如下:

1.      發起訪問請求(CM7核心)

  l   CM7 核心發起對特定記憶體區域的訪問請求,這可以是讀取或寫入操作。

2.      MDAC

  l   MDACMaster Domain Assignment Controller)負責生成請求的 DID,並設置請求的非安全和特權屬性。

  l   MDAC 根據預編程的主域分配MDA)暫存器生成每系統總線事務的 DID

3.      Main Fabric

  l   在傳輸過程中,Main Fabric 會將 DID 和其他控制信息(如讀取、寫入和特權模式)附加到總線事務中。

4.      MRC

  l   MRCMemory Region Controller)根據預編程的MRGDMemory Region Descriptor)暫存器,實施對從屬記憶體的訪問控制。

  l   MRC 確認 CM7 核心對該記憶體區域具有適當的訪問權限,並允許對記憶體的讀取或寫入操作。

  l   記憶體區域由MRSA Memory Region Start Address) 和 MREA Memory Region End Address)暫存器定義其邊界。

  l   MRC控制暫存器設置域的訪問權限並啟用記憶體區域。

5.      資源域控制(RDC行為)

  l   RDC接收到總線事務後,會檢查該請求的DID與記憶體區域的MRCMemory Region Control)暫存器中配置的允許域列表。

  l   如果 DID 在允許列表中,並且符合設置的訪問權限(例如讀取或寫入),則允許該請求。

6.      執行訪問

  l   RDCMRC確認CM7核心具有適當的訪問權限後,允許對記憶體區域的訪問。

 

三.實作

        本次使用 Hello World multi-core 範例導入 RDC 在雙核下使用 printfM7 鎖住 printf (UART1),再透過 M4  使用 printf 確認資源被確實鎖住,當透過 RDC 鎖住 peripheral 時,另一個核訪問將導致 HardFault

  1.      SDK 選擇 multicore_examples à Hello world

 


      2.      開啟 M7 專案,在資料點擊右鍵,選擇 MCUXpresso Config Tools à Open Peripheral

      


3.     
預設 Peripheral 是關閉的狀態,點擊開關開啟

 


4.     
Peripheral 右邊 Components à Peripheral Drivers(Device specific) 右邊加號,在 Select configuration components 頁面點選 Open SDK components manager

 
5.      Drivers 分頁下搜尋 RDC,勾選 rdc rdc_sema42 後點選 OK 後跳出 SDC Component Management 視窗確認無誤後點選 Yes,確認無誤後在 select which components 點選 OK

 

  


6.     
MCUXpresso Config Tool 點選 Update Code 會提示更新的檔案,確認無誤後點選 OK,在專案中的 driver 可看到新增
RDC 相關檔案。

 


7.     
接下來調整 main 中的 include RDC 相關檔案

 

8.      新增以下程式

rdc_domain_assignment_t assignment;

rdc_periph_access_config_t periphConfig;

rdc_mem_access_config_t memConfig;

#define CUR_MASTER_DID 0 /* Current master domain ID. */

/*

 * Master index:

 * ARM core: 0

 * eDMA: 1

 * DCP: 2

 * Others: 3

 */

#define APP_MASTER_INDEX 0

 

 

void lockPeriphWithSema4(void){

 

    RDC_GetDefaultPeriphAccessConfig(&periphConfig);

    periphConfig.periph     = kRDC_Periph_LPUART1;        //debug console

    periphConfig.enableSema = true;

    RDC_SetPeriphAccessConfig(RDC, &periphConfig);

 

    RDC_SEMA42_Lock(RDC_SEMAPHORE1, (((uint8_t)kRDC_Periph_LPUART1) & 0x3F), APP_MASTER_INDEX, CUR_MASTER_DID);

    if (CUR_MASTER_DID == RDC_SEMA42_GetLockDomainID(RDC_SEMAPHORE1, (((uint8_t)kRDC_Periph_LPUART1) & 0x3F)))

     {

 

 

     }

};

void unlockPeriphWithSema4(void){

 

    /* Demo finished, make the peripheral to default policy. */

    RDC_GetDefaultPeriphAccessConfig(&periphConfig);

 

    /* Set peripheral to accessible by all domains. */

    RDC_SetPeriphAccessConfig(RDC, &periphConfig);

 

    RDC_SEMA42_Unlock(RDC_SEMAPHORE1, (((uint8_t)kRDC_Periph_LPUART1) & 0x3F));

};


 

9.      main 中的 for 圈新增

    lockPeriphWithSema4();

    (void)PRINTF("M7!\r\n");

    unlockPeriphWithSema4();

  

10. 開啟 M4 專案,include fsl_debug_console.h

 

11.  main 中初始化 debug console 並呼叫 printf

    BOARD_InitDebugConsole();

 

12. 燒錄到板子並使用 terminal 執行後確認,在 debug 模式下可看到 M4 進入 HardFault_Handler

 

 

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

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