譚 磊 李 益 付建國
(中車株洲電力機車研究所,湖南 株洲412000)
變流器控制平臺作為一個高性能實時控制系統,其硬件架構中通常包含多塊不同的控制芯片,一塊控制芯片往往又包含多個內核。而整個控制平臺通常只有一個網口與外界進行交互,這就必然使得數據需要在多個內核之間經過冗長的數據鏈路大范圍遷徙。
然而,眾多不同架構的CPU 一起工作,并且它們的系統頻率、程序周期、通信接口各不相同,如何保證各個CPU 之間數據實時可靠傳輸成為一個關鍵問題。
變流器控制平臺的數據在控制器正常高速運行時周期性的產生和傳輸;主要包括控制字、波形監視和故障記錄等數據;其特點是,單包數據尺寸小,傳輸頻率快,對實時性和同步性要求高。
核間通信是多核芯片和多芯片平臺設計都必然會考慮的問題,通常,核間和芯片間的物理通信鏈路已經由芯片廠商或者硬件設計人員鋪設好。
對于變流器控制平臺而言,CPU 多數都在運行實時控制程序,并且控制周期各不相同。如何利用已有的物理通道,設計合適的數據傳輸方法,在不中斷CPU 實時控制時序前提下,滿足大量數據在不同時鐘域之間的可靠同步傳輸是問題的關鍵。
在多核芯片中,通常廠商會集成IPC 作為內核之間的通信途徑。IPC 結構圖如圖1 所示。
IPC 模塊通常是單向通信的,要實現兩個CPU 之間相互通信需要兩組對稱IPC 模塊相互配合。當CPU1 需要向CPU2 傳輸數據時,其流程如下:
2.1.1 CPU1 先將數據寫入IPC_RAM中。
2.1.2 設置相應的IPC_Reg 寄存器組。
2.1.3 中斷通知CPU2 數據已經發送完成。
2.1.4 CPU2 響應中斷,并從IPC_RAM中讀取數據緩存至本地等待程序使用。
2.1.5 CPU2 清標志,告知CPU1 讀取完成。

圖1 IPC 結構圖
由于不同CPU 的程序運行周期不同步,當CPU1 發完數據之后,CPU2 并不能立刻將其讀走,所以有可能造成舊數據被覆蓋或者新數據無法更新。對于該問題,IPC 是以中斷的方式進行處理的,CPU1 可以通過中斷使CPU2 立刻響應并將數據讀走。
然而,變流器控制平臺作為一種實時控制平臺,CPU 內部運行的控制程序的優先級無疑是最高的,不允許被其它任務打斷,從而影響控制時序。并且,IPC 只存在于同一芯片中不同內核之間的通信,而異構多核變流器控制平臺中,存在多塊芯片多個內核,更多的時候需要在不同芯片的內核之間進行通信,而芯片之間并不存在IPC 機制。故而,單純的使用IPC 通信,并不能解決多芯片、異構多核的變流控制平臺跨時鐘域內核之間通信問題。
隨著半導體工藝的發展,單片SOC 上集成的電路越來越多,很多芯片都在CPU 外圍集成了多種外設接口,然而高速的CPU 與低速的外設接口之間也同樣存在速率不匹配的問題。
為解決高速CPU 與低速外設之間的速率不匹配問題,芯片廠商通常會在兩者之間引入FIFO 緩沖區機制。當CPU 需要發送數據時,只要發送緩沖區未滿,則直接往里填充即可,無需考慮外設接口的當前狀態。而外設只需判斷發送FIFO 里是否有數據,然后不斷的往外發送即可。接收也是同理,外設將接收到的數據先存入接收FIFO 中,而CPU 只需在空閑時來讀取即可。
FIFO 的引入,很好的解決了CPU 與外設間速率不匹配問題。但是該機制是以單個字節或者字為單位,不能實現多路數據之間的同步傳輸,并且需要硬件FIFO 控制器支持,不能直接用于異構多核變流器控制平臺中內核間數據互傳。
對于多核芯片的CPU 之間通常存在共享存儲區域,這使得兩個CPU 之間可以進行數據交互。對于不同芯片之間,通常會采用雙口RAM進行粘合,或者通過EMIF、UPP、EMB 等總線訪問FPGA 構建的共享存儲區來進行數據通信。

圖2 某控制平臺A 結構圖
如圖2,列舉了某種控制平臺結構。不同的平臺、不同的芯片、不同的接口使得通信方式五花八門,很難完全統型。
并且,在實際應用中,共享存儲區域兩側CPU 的讀寫權限并不是完全對等的。這些特點都導致很難使用一個統一的數據傳輸方法以適應所有的平臺。
然而,通過研究每一種通信方式的特點以及總線接口的特性可以發現,無論CPU 采用的何種總線接口,包括EMIF、UPP或EMB 等,忽略它們的各自的物理特性,他們的通信數據最終都將映射到CPU 的內存區域。
基于此,本文提出了一種異構多核平臺跨時鐘域數據傳輸方法——基于塊操作的FIFO 緩沖區。該方法適用于不同的物理接口,可實現不同運行周期CPU 之間的數據穩定傳輸,并且不需要通過中斷打斷接收方實時控制任務。在具有乒乓操作的優點基礎上提高了存儲空間利用率和傳輸效率。
如圖3 所示,在共享RAM 區域開辟n 個緩沖塊,緩沖塊的大小取決于CPU 每個周期傳輸的數據量,n 的值由通信雙方最大執行周期的倍數決定:

其中:
Tr_max為接收CPU 程序最大執行周期;
Tt_min為發送CPU 程序最小執行周期。

圖3 環形緩沖區
n 個緩沖塊不需要連續,只需將他們的首地址存入地址表即可,這樣即可利用內存中零散的空間,避免了開辟連續大緩沖區造成的空間不足。每次讀寫操作時,從地址表中尋找地址,當操作到地址表中最后一個成員時,即返回到首地址,如此就可以利用零散空間形成環形緩沖。
在沒有硬件FIFO 控制器的情況下,為了實現先入先出FIFO 功能,必須采用軟件構建讀寫指針和滿空標志等。并且為了兼容共享RAM兩側權限不對等的情況,不能由雙方對同一存儲單元進行操作,必須采用讀寫標志分離,如圖4 所示。
當CPU1 向CPU2 進行數據傳輸時,CPU1 的操作流程如下:
(1)判斷滿標志是否為1,若是,則放棄寫入。若否,則根據寫指針的值查找地址表,然后將數據寫入對應的地址;
(2)操作完成之后將寫指針加一,若大于n,則令其等于0。
(3)然后判斷是否與讀指針相等,若相等,則置位寫滿標志,若不等,則滿標志清零。

圖4 環形FIFO 機制
由于采用緩沖機制,CPU2 并不需要在CPU1 發送完成之后立刻讀取,只需在空閑時將數據取走即可,CPU2 的讀操作過程如下:
(1)判斷FIFO 當前是否為空狀態,若是,則放棄讀取,若否,則根據讀指針查找地址表,找到對應的位置進行讀取。
(2)操作完成之后將讀指針加一,若大于n,則令其等于0。
(3)然后判斷是否與寫指針相等,若是,則置位讀空標志,若否,則將標志清零。
需要說明的是,FIFO 初始狀態時,讀指針等于寫指針,都指向FIFO 的第一個緩沖塊,且空標志為1。
讀操作與寫操作類似,其基本單元都是一個緩沖塊,即一個周期所需傳輸的數據,這樣的機制保證了各路通道之間的同步,有利于現場調試和故障分析。
本文提出的基于塊操作的FIFO 數據傳輸機制不依賴于具體的接口總線,將其歸一化到地址空間進行處理,并且適用于共享存儲區域兩側CPU 讀寫權限不對等的情況。解決了跨時鐘域、不同運行周期CPU 間的數據傳輸速率匹配問題,保證了數據不丟包、不重包,并實現了波形監視和故障記錄中各通道數據之間的同步。

圖5 監視數據波形
本文針對變流器控制平臺中異構多核跨時鐘域實時通信需求,充分研究了典型核間通信方法特點后,在現有乒乓操作的基礎上提出了基于塊操作的FIFO 緩沖區機制。該方法無需中斷接收方的實時控制程序,實現了異步時鐘下的數據可靠傳輸;并且該方法不依賴于具體硬件接口,可在不同的硬件平臺通用?;谠摍C制,在新的控制平臺中成功實現波形監視和故障記錄功能。