采用非對稱(chēng)雙核 MCU 提高系統性能

Message RAM 僅僅作為 IPC 的數據緩存,IPC 還需借助于特定的控制邏輯電路來(lái)完成。如圖 6 所示,Master 子系統和 Control 子系統都是通過(guò) 5 個(gè)寄存器來(lái)實(shí)現 IPC 的邏輯流程控制:IPCACK、IPCSTS、IPCFLG、IPCCLR、IPCSET。這 5 個(gè)寄存器都是 32 位,每一個(gè) bit 對應于 IPC 的一個(gè)通道,因此最多可實(shí)現 32 個(gè)通道的握手通信。Bit0 到 Bit3 總共 4 個(gè)通道可以觸發(fā)消息接收方的 IPC 中斷,Bit4 到Bit31 共 28 個(gè)通道則需要消息接收方的軟件查詢(xún)來(lái)獲取 Message RAM 中是否收到數據。如果兩個(gè)內核之間僅僅傳遞狀態(tài)和控制信息(例如 RTOS 中的 Semaphore),僅通過(guò)以上寄存器便可以實(shí)現,而無(wú)需 Message RAM 的參與。

以下通過(guò)舉例 Master 子系統往 Control 子系統發(fā)送一幀數據,來(lái)簡(jiǎn)單介紹 IPC 模塊的操作流程。
1. Cortex-M3 先在 MTOC Message RAM 中寫(xiě)入一幀數據;
2. Cortex-M3 置位 MTOCIPCSET(CM3 映射存儲器區)的 Bit9,如圖 6 所示,此時(shí) MTOCIPCSTS(C28x 映射存儲器區)的 Bit9 也將置位;
3. C28x 輪詢(xún) MTOCIPCSTS 的 Bit9,查詢(xún)到 Bit9 已置位;(如果之前的操作是 Bit0 到 Bit3 其中之一, 則將觸發(fā) C28x 產(chǎn)生一個(gè) IPC 中斷)
4. C28x 讀 MTOC Message RAM 中的數據,此時(shí),Cortex-M3 成功將一幀數據發(fā)送至 C28x。
3.2 Shared RAM 內存區
大部分情況下,2K 字節的 IPC Message RAM 區能夠滿(mǎn)足 C28x 和 M3 子系統之間的數據通信,配合DMA,通信效率也可以進(jìn)一步提高。如果用戶(hù)希望一次性在兩個(gè)子系統傳遞更大塊的數據,另一種方法是通過(guò) Shared RAM 內存。
TMS320F28M35H52C 有一個(gè) 64K 字節大小的 Shared RAM 區,總共 8 塊 S0-S7,每塊 8K 字節大小,如圖 7 所示。Cortex-M3 可以設置讓任何一塊 Shared RAM 區由 C28x 或 M3 主控,比如,映射 S0 至C28x 側以后,C28x CPU 和 DMA 可以讀寫(xiě) S0,而 M3 和 uDMA 將只能讀 S0,不能寫(xiě)入和預取。
假如 Cortex-M3 需要一次性發(fā)送 6K 字節的數據到 C28x 側,它可以先將 Shared RAM 區 S0 映射到本地存儲器空間,接著(zhù)通過(guò) IPC 發(fā)送一個(gè)標志位給 C28x 來(lái)通知其可以將數據取走。

3.3 IPC 的軟件驅動(dòng)
controlSUITE 軟件開(kāi)發(fā)包中提供 2 種 IPC 的軟件驅動(dòng)庫,IPC Driver 和 IPC_Lite Driver。IPC_Lite Driver 僅使用 IPC 寄存器來(lái)實(shí)現通信,不需要額外的 RAM,但是用戶(hù)只能支持一個(gè) IPC 中斷服務(wù) ISR,且不支持以隊列形式來(lái)處理 IPC 請求。IPC_Lite Driver 使用方式如下:


1,主動(dòng)發(fā)起數據請求的內核會(huì )首先調用 IPC_Lite Driver 提供的名函數。在這個(gè)例子匯總,M3 是發(fā)送數據的內核并執行“IPCLiteMtoCDataRead” 函數。
? IPC_FLAG2 是 C28 中斷標志,指示 C28 內核一個(gè)消息到來(lái)。
? IPC_FLAG17 是響應標志,C28 用其指示 M3 核一個(gè)命令已經(jīng)被處理。
? 需要讀取數據的 C28 的地址也被作為一個(gè)參數傳遞給 C28 內核。
? 這個(gè)函數在 while 循環(huán)中被調用的原因是,它可能返回 STATUS_FAIL 并且不會(huì )發(fā)送信息給C28 直至 MtoC IPC 中斷 2 和標志 17 可用, 之后,該函數返回 STATUS_PASS.
2,被動(dòng)接收數據請求的內核會(huì )在 ISR 中解析其 IPCCOM寄存器的命令。這個(gè)例子中,C28 MtoCIPCINT2 ISR 知道標志置位,解析 MTOCIPCCOM寄存器的命令,識別出是讀數據命令。
3,被動(dòng)接收數據請求的內核會(huì )調用與主動(dòng)發(fā)起數據請求的內核相同的函數名。這個(gè)例子中,C28 執行 IPCLiteMtoCDataRead, IPC_FLAG2 作為中斷標志參數, IPC_FLAG17 作為狀態(tài)標志參數。
4,如果接收到命令有效,IPC_Lite 的驅動(dòng)函數會(huì )處理讀命令并確認(acknowledges)狀態(tài)和中斷標志。如果接收到的命令無(wú)效,則只有中斷標志被確認(acknowledged)用來(lái)釋放中斷給后續的命令,而狀態(tài)標志仍然置位。
IPC Driver 通過(guò)在 Message RAM 中建立環(huán)形緩沖區,使得多個(gè) IPC 通信命令可以以隊列的形式被緩沖,然后逐個(gè)處理,并且可以同時(shí)支持多個(gè) IPC 中斷服務(wù)程序 ISR,當然,IPC Driver 需要更多的RAM 來(lái)支持。和 IPC-Lite 不同,為了使用 IPC 驅動(dòng),需要在 M3 和 C28 的項目中增加一些設置。
第一步是在 M3 和 C28 的鏈接定位文件(.cmd)中添加 IPC 循環(huán)緩沖區和指針段到 CTOM和 MTOC message RAM。如下所示:

第二步,應用程序源碼中必須定義并且初始化至少一個(gè) volatile global tIpcController 變量 (為 C28 –M3 IPC 中斷使用),如下所示:



評論