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