采用非對稱雙核 MCU 提高系統(tǒng)性能
Message RAM 僅僅作為 IPC 的數(shù)據(jù)緩存,IPC 還需借助于特定的控制邏輯電路來完成。如圖 6 所示,Master 子系統(tǒng)和 Control 子系統(tǒng)都是通過 5 個寄存器來實現(xiàn) IPC 的邏輯流程控制:IPCACK、IPCSTS、IPCFLG、IPCCLR、IPCSET。這 5 個寄存器都是 32 位,每一個 bit 對應于 IPC 的一個通道,因此最多可實現(xiàn) 32 個通道的握手通信。Bit0 到 Bit3 總共 4 個通道可以觸發(fā)消息接收方的 IPC 中斷,Bit4 到Bit31 共 28 個通道則需要消息接收方的軟件查詢來獲取 Message RAM 中是否收到數(shù)據(jù)。如果兩個內(nèi)核之間僅僅傳遞狀態(tài)和控制信息(例如 RTOS 中的 Semaphore),僅通過以上寄存器便可以實現(xiàn),而無需 Message RAM 的參與。
以下通過舉例 Master 子系統(tǒng)往 Control 子系統(tǒng)發(fā)送一幀數(shù)據(jù),來簡單介紹 IPC 模塊的操作流程。
1. Cortex-M3 先在 MTOC Message RAM 中寫入一幀數(shù)據(jù);
2. Cortex-M3 置位 MTOCIPCSET(CM3 映射存儲器區(qū))的 Bit9,如圖 6 所示,此時 MTOCIPCSTS(C28x 映射存儲器區(qū))的 Bit9 也將置位;
3. C28x 輪詢 MTOCIPCSTS 的 Bit9,查詢到 Bit9 已置位;(如果之前的操作是 Bit0 到 Bit3 其中之一, 則將觸發(fā) C28x 產(chǎn)生一個 IPC 中斷)
4. C28x 讀 MTOC Message RAM 中的數(shù)據(jù),此時,Cortex-M3 成功將一幀數(shù)據(jù)發(fā)送至 C28x。
3.2 Shared RAM 內(nèi)存區(qū)
大部分情況下,2K 字節(jié)的 IPC Message RAM 區(qū)能夠滿足 C28x 和 M3 子系統(tǒng)之間的數(shù)據(jù)通信,配合DMA,通信效率也可以進一步提高。如果用戶希望一次性在兩個子系統(tǒng)傳遞更大塊的數(shù)據(jù),另一種方法是通過 Shared RAM 內(nèi)存。
TMS320F28M35H52C 有一個 64K 字節(jié)大小的 Shared RAM 區(qū),總共 8 塊 S0-S7,每塊 8K 字節(jié)大小,如圖 7 所示。Cortex-M3 可以設置讓任何一塊 Shared RAM 區(qū)由 C28x 或 M3 主控,比如,映射 S0 至C28x 側(cè)以后,C28x CPU 和 DMA 可以讀寫 S0,而 M3 和 uDMA 將只能讀 S0,不能寫入和預取。
假如 Cortex-M3 需要一次性發(fā)送 6K 字節(jié)的數(shù)據(jù)到 C28x 側(cè),它可以先將 Shared RAM 區(qū) S0 映射到本地存儲器空間,接著通過 IPC 發(fā)送一個標志位給 C28x 來通知其可以將數(shù)據(jù)取走。
3.3 IPC 的軟件驅(qū)動
controlSUITE 軟件開發(fā)包中提供 2 種 IPC 的軟件驅(qū)動庫,IPC Driver 和 IPC_Lite Driver。IPC_Lite Driver 僅使用 IPC 寄存器來實現(xiàn)通信,不需要額外的 RAM,但是用戶只能支持一個 IPC 中斷服務 ISR,且不支持以隊列形式來處理 IPC 請求。IPC_Lite Driver 使用方式如下:
1,主動發(fā)起數(shù)據(jù)請求的內(nèi)核會首先調(diào)用 IPC_Lite Driver 提供的名函數(shù)。在這個例子匯總,M3 是發(fā)送數(shù)據(jù)的內(nèi)核并執(zhí)行“IPCLiteMtoCDataRead” 函數(shù)。
? IPC_FLAG2 是 C28 中斷標志,指示 C28 內(nèi)核一個消息到來。
? IPC_FLAG17 是響應標志,C28 用其指示 M3 核一個命令已經(jīng)被處理。
? 需要讀取數(shù)據(jù)的 C28 的地址也被作為一個參數(shù)傳遞給 C28 內(nèi)核。
? 這個函數(shù)在 while 循環(huán)中被調(diào)用的原因是,它可能返回 STATUS_FAIL 并且不會發(fā)送信息給C28 直至 MtoC IPC 中斷 2 和標志 17 可用, 之后,該函數(shù)返回 STATUS_PASS.
2,被動接收數(shù)據(jù)請求的內(nèi)核會在 ISR 中解析其 IPCCOM寄存器的命令。這個例子中,C28 MtoCIPCINT2 ISR 知道標志置位,解析 MTOCIPCCOM寄存器的命令,識別出是讀數(shù)據(jù)命令。
3,被動接收數(shù)據(jù)請求的內(nèi)核會調(diào)用與主動發(fā)起數(shù)據(jù)請求的內(nèi)核相同的函數(shù)名。這個例子中,C28 執(zhí)行 IPCLiteMtoCDataRead, IPC_FLAG2 作為中斷標志參數(shù), IPC_FLAG17 作為狀態(tài)標志參數(shù)。
4,如果接收到命令有效,IPC_Lite 的驅(qū)動函數(shù)會處理讀命令并確認(acknowledges)狀態(tài)和中斷標志。如果接收到的命令無效,則只有中斷標志被確認(acknowledged)用來釋放中斷給后續(xù)的命令,而狀態(tài)標志仍然置位。
IPC Driver 通過在 Message RAM 中建立環(huán)形緩沖區(qū),使得多個 IPC 通信命令可以以隊列的形式被緩沖,然后逐個處理,并且可以同時支持多個 IPC 中斷服務程序 ISR,當然,IPC Driver 需要更多的RAM 來支持。和 IPC-Lite 不同,為了使用 IPC 驅(qū)動,需要在 M3 和 C28 的項目中增加一些設置。
第一步是在 M3 和 C28 的鏈接定位文件(.cmd)中添加 IPC 循環(huán)緩沖區(qū)和指針段到 CTOM和 MTOC message RAM。如下所示:
第二步,應用程序源碼中必須定義并且初始化至少一個 volatile global tIpcController 變量 (為 C28 –M3 IPC 中斷使用),如下所示:
評論