一.簡介
在i.MX RT1170處理器中,Resource Domain Controller (RDC) 用於實現多核處理環境下的資源隔離和訪問控制。RDC允許系統設計者定義不同Domain之間的訪問權限,確保每個核心或總線主控僅能訪問其授權的記憶體區域和外設,從而提高系統的安全性和穩定性。
二.運作步驟
當 CM7 核心發起對 Periph1(例如 GPIO)的使用時,RDC(Resource Domain Controller)會通過多個子模組(如 Main Fabric、MDAC、MRC 等)進行管理和控制,以確保資源的安全和可靠使用。
RDC 對 Peripheral 具體的操作流程如下:
1. 發起訪問請求(CM7 核心):
l CM7 核心發起對 Periph1 的訪問請求,例如讀取 GPIO 狀態。
l 該請求包含 DID(Domain 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 的 PDAP(Peripheral 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. 釋放 Semaphore(SEMA42 行為,可選):
l 完成操作後,如果使用了 Semaphore,CM7 核心需要釋放 Semaphore。
l 釋放 Semaphore 後,其他有權限的域可以申請並獲取 Semaphore 以訪問 Periph1。
RDC 對 Peripheral 具體的操作流程如下:
1. 發起訪問請求(CM7核心):
l CM7 核心發起對特定記憶體區域的訪問請求,這可以是讀取或寫入操作。
2. MDAC:
l MDAC(Master Domain Assignment Controller)負責生成請求的 DID,並設置請求的非安全和特權屬性。
l MDAC 根據預編程的主域分配(MDA)暫存器生成每個系統總線事務的 DID。
3. Main Fabric:
l 在傳輸過程中,Main Fabric 會將 DID 和其他控制信息(如讀取、寫入和特權模式)附加到總線事務中。
4. MRC:
l MRC(Memory Region Controller)根據預編程的MRGD(Memory Region Descriptor)暫存器,實施對從屬記憶體的訪問控制。
l MRC 確認 CM7 核心對該記憶體區域具有適當的訪問權限,並允許對記憶體的讀取或寫入操作。
l 記憶體區域由MRSA (Memory Region Start Address) 和 MREA (Memory Region End Address)暫存器定義其邊界。
l MRC控制暫存器設置域的訪問權限並啟用記憶體區域。
5. 資源域控制(RDC行為):
l RDC接收到總線事務後,會檢查該請求的DID與記憶體區域的MRC(Memory Region Control)暫存器中配置的允許域列表。
l 如果 DID 在允許列表中,並且符合設置的訪問權限(例如讀取或寫入),則允許該請求。
6. 執行訪問:
l 當RDC和MRC確認CM7核心具有適當的訪問權限後,允許對記憶體區域的訪問。
三.實作
本次使用 Hello World multi-core 範例導入 RDC 在雙核下使用 printf,M7 鎖住 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

