方華啟,任慰,何頂新
(華中科技大學自動化學院,武漢430074)
TOPPERS/FMP是由日本名古屋大學高田廣章教授發起的開放實時嵌入式軟件平臺TOPPERS(Toyohashi Open Platform for Embedded Real-time Systems)中的一個面向于多核環境的嵌入式實時操作系統,全稱是Flexible Multiprocessor Profile RTOS。FMP目前已經移植到了部分ARM架構的處理器、Nios II處理器以及瑞薩的SH處理器。
TOPPERS組織為功能分散型多核處理器開發了一款實時操作系統TOPPERS/FDMP(Function Distributed MultiProcessor RTOS kernel),也是遵循μITRON規范標準功能集。在TOPPERS/FDMP內核的基礎上,TOPPERS組織開發一個新的內核TOPPERS/FMP,支持動態任務遷移功能,也是針對TOPPERS/ASP內核實現的多核擴展,主要支持對稱多核處理器。
TOPPERS/FMP內核總體結構如圖1所示,FMP內核支持對稱多核處理器,所有的處理器共享同一個程序鏡像。

圖1 TOPPERS/FMP內核總體結構
FMP內核還引入了自旋鎖的機制,主要用在處理器間進行資源競爭時保護共享資源。
TOPPERS/FMP內核中新增了一個結構體,叫做PCB(Processor Control Block),主要用于管理每個處理器的數據,內核為每個處理器維護一個這樣的結構體。內核可以單獨管理每個處理器的狀態。內核中task、task excpt、cyc handler、alm handler這些可執行單元(Processing Unit)被劃分到指定的處理器上,屬于處理器私有資源,對應的處理器上的內核代碼會對其進行初始化操作。而dataqueue、eventflag、mailbox、memfix、pridataq、spin_lock這些內核對象(Kernel Object)屬于共享資源,由主處理器完成初始化操作。為了方便應用開發,TOPPERS/FMP內核擴展了靜態配置器,使其支持對多核處理器進行配置,屬于某一個處理器內核的可執行單元和內核對象,被歸為一個類型,在靜態配置腳本中叫做CLASS,配置腳本示例略——編者注。
內核采用了局部隊列調度的方式,在PCB中維護了一個局部的就緒隊列(ready_queue)。采用這種調度方式,任務基本無需在不同處理器間切換,提高了任務執行的效率,但是如果應用開發者沒有設計好應用程序,有可能出現某些處理器核心負載很輕,某些處理器核心負載很重的負載不均衡的狀態,多核處理器的性能將無法充分發揮。為了解決負載不均衡的狀態,TOPPERS/FMP內核提供了一組用于任務遷移的系統調用API,應用開發者可以根據自己需求來進行應用層的任務遷移管理,TOPPERS/FMP內核沒有直接在內核層提供動態遷移的功能的主要原因是由于無法確保內核的實時性。
多核處理器中中斷管理分為兩種類型:①所有處理器共享一個中斷源;②每個處理器有自己的中斷源。多核處理器一般引入全局中斷控制器進行總體的中斷管理,每個處理器內部有自己私有的中斷控制器。針對這樣的改變,FMP內核也引入全局中斷的管理部分,將中斷號與中斷處理程序號的高位區域(如果是32位的編號,就是高16位)用于標示對應進行處理的處理器ID。這樣對于那些中斷號一樣的中斷,通過高位區域進行處理器ID的判別也可以知道哪個處理器響應哪個中斷[8]。對于每個處理器內部的中斷處理流程還是采用TOPPERS標準中斷模型。
多核操作系統實現處理器間系統調用(inter-processor system call)采用兩種實現方式:直接內存操作(direct memory access)和遠程過程調用(remote procedure call)。遠程過程調用方式廣泛應用于非對稱處理器,或是不存在共享內存的消息傳遞型處理器中,執行時間不確定。TOPPERS/FMP內核為了保證實時性,采用了直接內存操作的方式。
TOPPERS/FMP內核啟動過程中,采用了多級屏障鎖的方式保證每個處理器的啟動進程一致,以確保內核正確啟動。
TOPPERS/FMP內核采用了直接操作其他處理器控制塊(Control Block)的方式來實現處理器間的系統調用,這就需要保證處理器間的操作是互斥的。TOPPERS/FMP內核采用了自旋鎖的方式來實現互斥,自旋鎖是通過test and set的方式實現的。鎖的粒度嚴重影響著系統調用的靈活性以及響應時間,鎖的粒度越高,并行性越好,但是響應時間就有可能得不到保證,TOPPERS/FMP實現了三種不同粒度的鎖,用戶可以在內核配置的時候進行選擇。這三種粒度的鎖分別是巨鎖(giant lock)、處理器鎖(processor lock)、細粒度鎖(fine-grained lock)。FMP內核在每個處理器上將會定義兩種鎖:任務鎖(task lock)和對象鎖(object lock)。為了避免死鎖,TOPPERS/FMP內核規定了鎖獲取的順序。在進行系統調用時,先獲取對象鎖然后獲取任務鎖,釋放鎖時先釋放任務鎖,再釋放對象鎖。由于獲取到對象鎖后,其他的任務有可能修改了待獲取的任務控制塊,TOPPERS/FMP內核采用一種簡單的重試機制,在獲取到任務鎖時,檢查對應的任務是否已經被修改,如果被修改就釋放對應的任務鎖,開始重新獲取任務鎖,循環往復。
TOPPERS/FMP的代碼主要也是在GNU環境下進行開發的,而且開發移植大致與TOPPERS/ASP的移植[10]基本一致,只是增加了一些多核相關的移植工作。
2.1.1 內核的啟動
TOPPERS/FMP內核在ZYNQ上的啟動如圖2所示,主要分為三個流程:Bootloader階段,內核啟動——匯編部分,內核啟動——C語言部分。
由于各自處理器執行的初始化內容不一樣,導致執行每一階段的耗時不一樣,為了能保證每個階段處理器都能同時開始運行,引入屏障同步的功能來實現處理器同步。
2.1.2 標準中斷處理模型移植
ZYNQ上的中斷分為私有外設中斷(PPI)、共享外設中斷(SPI)和軟中斷(SGI)。軟中斷主要用于處理器間通信。中斷優先級總共有32級,所有的中斷產生以后,將會產生IRQ或者FIQ異常。FMP內核中配置成IRQ模式進行中斷處理,因此所有的中斷產生后,將直接跳轉到IRQ的中斷向量入口處,程序可以通過查詢中斷控制器中的相應的寄存器獲知當前的請求的中斷號,然后通過查表的方式就可以跳轉到對應的中斷處理程序。
中斷處理的實現的流程圖如圖3所示,需要注意的是如果內核配置時采用了處理器鎖或者細粒度鎖的方式就需要釋放已經獲取的第一階段和第二階段鎖。還有在進行中斷處理時還需要判斷對應的中斷是不是偽中斷,如果是的話就直接返回。偽中斷表示原始的中斷已經不再等待處理了,通常是因為另外一個處理器已經在處理這個中斷了。

圖2 TOPPERS/FMP內核的啟動流程
2.1.3 任務遷移支持
為了實現任務遷移,需要在目標依賴部分實現如下功能的函數:①用于當前任務的遷移函數支持,dispatch_and_migrate;②用于任務結束時的遷移函數支持,exit_and_migrate。兩個函數均在任務上下文中,在CPU鎖定狀態下,獲取到待遷移任務的源處理器和目的處理器的鎖后被調用。實現的流程圖如圖4所示。
本文分別實現采用私有定時器、私有看門狗定時器、全局定時器三種方式作為系統時鐘驅動。還有為了實現每個處理器單獨的日志輸出功能,在ZedBoard上通過MIO引出另外一路串口,并且在程序上實現了雙串口的驅動程序。然后采用FMP內核自帶的sample測試例程進行測試,驗證功能正常,移植成功。
2.2.1 測試環境說明
本文所做的評測實驗均是在ZedBoard上完成,ZYNQ處理器運行在667MHz,MMU和數據Cache、指令Cache均使能,所有測試均運行10 000次,分別在DDR RAM和片內的OCM RAM單獨進行測試。
FMP內核配置:內核采用巨鎖方式,內核系統時鐘采用32位私有定時器實現,測試所用計時器采用64位的全局定時器。
2.2.2 測試結果
本文對內核進行了如下評測實驗:內核啟動、任務切換、任務遷移、信號量、事件標志位以及優先級數據隊列的時間消耗測試。
測試發現啟用了MMU和Cache后,除了內核啟動外,在DDR RAM和OCM RAM的測試時間基本一致。
按照圖2中FMP內核啟動流程所示,程序中將從各處理器的必要的硬件相關初始化開始到第三階段屏障同步開始記作FMP內核啟動消耗時間,各處理器消耗的啟動時間表略——編者注。由于處理器1作為主處理器比從處理器多的任務因此啟動時間比處理器2長一些,由于MMU和Cache是在啟動過程使能的,導致在OCM中運行FMP內核的啟動時間稍快于DDR。
FMP內核中各個API執行的場景不同導致執行時間不同,表略——編者注。
任務激活API act_tsk按照5種測試場景進行測試。具體測試場景略——編者注。
任務指定處理器激活API mact_tsk按照2種測試場景進行測試。具體測試場景略——編者注。
任務遷移API mig_tsk按照以下3種測試場景進行測試。具體測試場景略——編者注。
任務休眠API slp_tsk和任務喚醒API wup_tsk測試了均會引起任務切換的場景。
信號量釋放API sig_sem按照以下2種測試場景進行測試。具體測試場景略——編者注。
優先級數據隊列發送API snd_pdq按照如下方法進行測試:在發送低優先級的數據隊列前,先發送若干個高優先級的數據隊列,測試了高優先級數據隊列的個數與snd_pdq的執行時間的關系,如圖5所示,執行時間與高優先級數據隊列個數近似成正比關系。

圖3 TOPPERS/FMP內核中斷移植

圖4 任務遷移目標依賴部分需實現函數

圖5 優先級數據隊列發送snd_pdq執行時間
事件標志位設置API set_flg按照如下方法進行測試:在set_flg執行之前,有若干個低優先級的任務等待事件標志位,測試了等待事件標志位的任務的個數與set_flg執行的時間的關系,如圖6所示,執行時間與等待事件標志位的低優先級的任務的個數近似成正比關系。

圖6 事件標志位設置set_flg執行時間
鑒于ZYNQ處理器上支持TrustZone功能,下一步將移植TOPPERS/SAFEG[9]嵌入式虛擬機到ZYNQ處理器上,以實現在該處理器上同時運行兩個操作系統,一個實時操作系統用于實時控制,另外一個通用操作系統(如Linux)用于實現一些比較復雜的功能,如人機交互、網絡通信等。
編者注:本文為期刊縮略版,全文見本刊網站www.mesnet.com.cn。
[1] 薛一波,王海霞.計算機系統發展的必然趨勢——多核計算[J] .中國計算機學會通訊,2010,11(6):60-62.
[2] 多核[EB/OL] .[2013-06] .http://baike.baidu.com/view/2219502.htm.
[3] 彭曉明,郭浩然,龐建民.多核處理器——技術,趨勢和挑戰[J] .計算機科學,2012,39(z3).
[4] 李彥冬,雷航.多核操作系統發展綜述[J] .計算機應用研究,2011,28(9):3215-3219.
[5] Tomiyama H,Honda S,Takada H.Real-time operating systems for multicore embedded systems[C]//SoC Design Conference,2008.ISOCC'08.International.IEEE,2008:I-62-I-67.
[6] 姜春茂,倪蘊濤,黃春梅.嵌入式多核操作系統關鍵技術[J] .科技導報,2012(11):30.
[7] 黃國睿,張平,魏廣博.多核處理器的關鍵技術及其發展趨勢[J] .計算機工程與設計,2009,30(10):2414-2418.
[8] Xilinx.Zynq-7000All Programmable SoC Technical Refer ence Manual(UG585V1.5),2013.
[9] 任慰,何頂新,趙金.開放實時嵌入式軟件平臺TOPPERS的研究現狀[J] .單片機與嵌入式系統應用,2012,12(10):8-11.
[10] 任慰,何頂新,趙金.一種新型嵌入式實時操作系統的移植研究[J] .Computer Engineering,2013,39(5).