許璐璐 鄭吉洲 彭夏鵬 李 悅
北京航天自動(dòng)控制研究所,北京100854
?
基于SPARC的嵌入式實(shí)時(shí)操作系統(tǒng)移植
許璐璐 鄭吉洲 彭夏鵬 李 悅
北京航天自動(dòng)控制研究所,北京100854

基于嵌入式實(shí)時(shí)操作系統(tǒng)進(jìn)行應(yīng)用開(kāi)發(fā)時(shí),首先需要將其移植到對(duì)應(yīng)的硬件平臺(tái)上。SPARC架構(gòu)處理器是航天工程中常用的一款處理器,本文首先簡(jiǎn)要介紹了SPARC體系結(jié)構(gòu)、寄存器窗口等相關(guān)概念,然后對(duì)嵌入式實(shí)時(shí)操作系統(tǒng)的SPARC移植進(jìn)行了分析和實(shí)現(xiàn)。最后進(jìn)行了測(cè)試驗(yàn)證,結(jié)果表明移植后的操作系統(tǒng)運(yùn)行穩(wěn)定正常,性能滿(mǎn)足應(yīng)用需求。 關(guān)鍵詞 SPARC;寄存器窗口;嵌入式實(shí)時(shí)操作系統(tǒng);移植
由于嵌入式硬件體系的多樣性,在基于嵌入式實(shí)時(shí)操作系統(tǒng)進(jìn)行應(yīng)用開(kāi)發(fā)時(shí),首先需要將其移植到對(duì)應(yīng)的硬件平臺(tái)上。
SPARC處理器是航天工程中常用的一款處理器,寄存器窗口是其一個(gè)重要概念,在進(jìn)行基于SPARC的嵌入式實(shí)時(shí)操作系統(tǒng)移植時(shí)需要對(duì)其進(jìn)行相關(guān)處理。本文對(duì)嵌入式實(shí)時(shí)操作系統(tǒng)的SPARC移植進(jìn)行了研究和實(shí)現(xiàn)。
1.1 寄存器窗口
SPARC體系結(jié)構(gòu)繼承伯克利RISC結(jié)構(gòu),寄存器窗口是其一個(gè)重要概念。1個(gè)寄存器窗口包含32個(gè)寄存器,通常記為%g0,…,%g7;%l0,…,%l7;%i0,…,%i7;%o0,…,%o7。其中%g0,…,%g7為全局寄存器,其余24個(gè)為當(dāng)前窗口寄存器,只對(duì)當(dāng)前程序可見(jiàn)[1]。當(dāng)調(diào)用子程序時(shí),會(huì)分配一個(gè)全新的窗口。寄存器窗口簡(jiǎn)化了函數(shù)調(diào)用過(guò)程。

圖1 寄存器窗口
SPARC架構(gòu)規(guī)定一個(gè)基于SPARC的處理器可以包含N=2**n(1≤n≤5)個(gè)窗口。在一個(gè)寄存器窗口組中,相鄰寄存器窗口存在寄存器公用。CWP(Current Window Pointer)指向當(dāng)前窗口,SAVE指令將分配一個(gè)全新的窗口CWP-1,其中8個(gè)ins寄存器繼承窗口CWP的outs寄存器的值。RESTORE指令則將CWP加1,使之前的窗口為當(dāng)前窗口。
特別的,%o6為%sp即棧頂指針,%i6為%fp即棧幀指針(相當(dāng)于棧底),%fp與%sp之間的堆棧即為當(dāng)前堆棧幀。編譯器通常用save %sp,-96,%sp之類(lèi)的語(yǔ)句為新的程序分配一個(gè)新的堆棧幀。

圖2 N=8的寄存器窗口結(jié)構(gòu)
1.2 控制/狀態(tài)寄存器
處理器狀態(tài)寄存器(%PSR):Bit0~Bit4為當(dāng)前窗口指針(CWP)。Bit5為T(mén)rap使能位(ET),Bit8~Bit11為處理器中斷級(jí)別(PIL)。
無(wú)效窗口標(biāo)識(shí)寄存器(%WIM):因?yàn)榇翱跀?shù)N固定,為防止窗口溢出,設(shè)置了WIM寄存器。N=8時(shí),Bit0~Bit7分別對(duì)應(yīng)窗口0~7,當(dāng)某位為1時(shí)表示對(duì)應(yīng)窗口為無(wú)效窗口。WIM只能有1位為1。
其他的還有陷阱基址寄存器(%TBR),乘除法寄存器(%Y),浮點(diǎn)狀態(tài)寄存器(%FSR),浮點(diǎn)寄存器(%f 0~%f 31)。
1.3 窗口上溢、下溢
上溢(overflow):當(dāng)前為SAVE指令,并且CWP-1對(duì)應(yīng)窗口無(wú)效時(shí),發(fā)生overflow trap。在程序調(diào)用時(shí),每調(diào)用1個(gè)新子程序就對(duì)應(yīng)1個(gè)SAVE語(yǔ)句,當(dāng)子程序調(diào)用層數(shù)大于窗口數(shù)時(shí),發(fā)生窗口溢出,需要進(jìn)行overflow trap處理,通常是將無(wú)效窗口的下一個(gè)窗口寄存器值保存到對(duì)應(yīng)堆棧中,然后將%WIM下移。
下溢(underflow):調(diào)用RESTORE指令,并且CWP+1對(duì)應(yīng)窗口為無(wú)效窗口時(shí),發(fā)生underflow trap。通常RESTORE的窗口內(nèi)容是之前overflow trap處理時(shí)保存到堆棧中的,當(dāng)恢復(fù)到原來(lái)窗口時(shí)需要從堆棧中讀出原寄存器值。
移植工作主要是重建嵌入式實(shí)時(shí)操作系統(tǒng)的硬件抽象層(HAL)[2],包括:數(shù)據(jù)類(lèi)型重定義、任務(wù)堆棧結(jié)構(gòu)設(shè)計(jì)、實(shí)現(xiàn)任務(wù)切換及中斷處理等。數(shù)據(jù)類(lèi)型重定義是針對(duì)不同微處理器的字長(zhǎng)不同,移植時(shí)需要與處理器匹配。針對(duì)32位SPARC,將堆棧數(shù)據(jù)類(lèi)型定義為32位整型。
2.1 臨界區(qū)互斥
臨界區(qū)互斥是通過(guò)開(kāi)關(guān)中斷來(lái)實(shí)現(xiàn)的,進(jìn)入臨界區(qū)前先關(guān)閉中斷,退出臨界區(qū)后重新打開(kāi)中斷。關(guān)中斷時(shí),先將當(dāng)前PIL保存,再將PIL置為0x0F(只有中斷號(hào)大于當(dāng)前PIL值時(shí)才會(huì)響應(yīng)中斷,因此通過(guò)將PIL置為15可實(shí)現(xiàn)關(guān)中斷),開(kāi)中斷時(shí)即恢復(fù)原來(lái)的PIL值。
2.2 任務(wù)堆棧幀設(shè)計(jì)
發(fā)生任務(wù)切換時(shí),需要保存當(dāng)前任務(wù)環(huán)境(處理器當(dāng)前各寄存器值),因此需要根據(jù)SPARC結(jié)構(gòu)設(shè)計(jì)任務(wù)堆棧幀。當(dāng)任務(wù)切出時(shí),按照此幀結(jié)構(gòu)保存當(dāng)前處理器各寄存器值;任務(wù)切入時(shí),再將此幀中保存的值恢復(fù)到各對(duì)應(yīng)寄存器中。任務(wù)棧幀如圖3所示。

圖3 任務(wù)棧幀結(jié)構(gòu)
2.3 任務(wù)切換實(shí)現(xiàn)
對(duì)于一個(gè)支持多任務(wù)的實(shí)時(shí)內(nèi)核,實(shí)現(xiàn)任務(wù)切換功能是移植時(shí)需要完成的最基本任務(wù)。
任務(wù)切換分為任務(wù)級(jí)切換和中斷級(jí)切換,當(dāng)前任務(wù)主動(dòng)讓出CPU時(shí)發(fā)生任務(wù)級(jí)切換,當(dāng)退出最后一層中斷時(shí),如果有更高優(yōu)先級(jí)任務(wù)就緒則會(huì)發(fā)生中斷級(jí)切換。
對(duì)于SPARC處理器,PC和nPC無(wú)法直接讀取,但發(fā)生trap時(shí),PC和nPC會(huì)自動(dòng)存入%l1和%l2寄存器,trap返回時(shí)CPU再自動(dòng)將%l1和%l2的值寫(xiě)入PC和nPC,所以通過(guò)軟中斷0進(jìn)行任務(wù)級(jí)切換。對(duì)于每個(gè)任務(wù),邏輯上都有一組寄存器窗口,即當(dāng)前used態(tài)的窗口內(nèi)容都應(yīng)保存。所以保存任務(wù)上下文時(shí),先保存%PSR等狀態(tài)寄存器、globals寄存器及任務(wù)current窗口的outs寄存器,再做windows flush處理,保存used態(tài)的各寄存器窗口的locals和ins寄存器。

圖4 任務(wù)切換流程
根據(jù)當(dāng)前CWP和%WIM的值可將寄存器窗口劃分到4個(gè)狀態(tài)中[3]:Current,Invalid,Used,Unused。假設(shè)CWP為4,%WIM為0x01,那么寄存器窗口組可以如下劃分:W0:Invalid;W1-W3:Unused;W4:Current;W5-W7:Used。
據(jù)此,windows flush處理過(guò)程如下:從Current窗口開(kāi)始,保存locals和ins寄存器到對(duì)應(yīng)的堆棧幀中,再RESTORE退到上一個(gè)窗口,保存locals和ins寄存器的值,直到退到%WIM所指的無(wú)效窗口。再將%WIM的值設(shè)置為Current的上一個(gè)窗口,這樣當(dāng)恢復(fù)該任務(wù)時(shí),RESTORE指令將發(fā)生underflow trap,把堆棧中保存的locals和ins寄存器恢復(fù)。
恢復(fù)新任務(wù)上下文時(shí),將新任務(wù)PC和nPC存入%l1和%l2,調(diào)用jmp %l1;rett %l2退出trap,CPU將跳轉(zhuǎn)到新任務(wù)執(zhí)行,實(shí)現(xiàn)任務(wù)切換。由于發(fā)生中斷時(shí),中斷處理過(guò)程會(huì)對(duì)被中斷的任務(wù)進(jìn)行現(xiàn)場(chǎng)保護(hù),所以中斷級(jí)切換直接從任務(wù)級(jí)切換的windows flush處開(kāi)始執(zhí)行。
2.4 中斷處理
時(shí)鐘心跳是操作系統(tǒng)必不可少的,需要根據(jù)硬件平臺(tái)設(shè)置相應(yīng)的定時(shí)器,產(chǎn)生周期性的時(shí)鐘中斷來(lái)實(shí)現(xiàn)時(shí)鐘心跳。
提供中斷注冊(cè)函數(shù)供用戶(hù)注冊(cè)外部中斷的中斷服務(wù)程序,是否允許中斷嵌套交由用戶(hù)決定。同時(shí),使用獨(dú)立的中斷堆棧,提高系統(tǒng)可靠性。
中斷處理流程與一般的處理器中斷處理類(lèi)似,不再贅述(見(jiàn)圖5)。需要注意的是,進(jìn)入中斷時(shí),SPARC不會(huì)自動(dòng)檢測(cè)是否發(fā)生窗口上溢,因此,中斷處理過(guò)程需要檢測(cè)是否進(jìn)行窗口上溢處理,同樣退出中斷時(shí)也需檢測(cè)是否進(jìn)行窗口下溢處理。

圖5 中斷處理流程
硬件平臺(tái)使用的是S698-T芯片,S698-T是珠海歐比特控制工程股份有限公司面向嵌入式控制領(lǐng)域研制的一款高性能、高可靠的SoC芯片,以高性能的SPARC V8(IEEE-1754)架構(gòu)標(biāo)準(zhǔn)的32位RISC整型單元IU為主控內(nèi)核,配以IEEE-754標(biāo)準(zhǔn)的64位雙精度浮點(diǎn)處理單元FPU,內(nèi)部集成DSU支持在線(xiàn)硬件調(diào)試[4]。測(cè)試時(shí),主機(jī)上運(yùn)行集成開(kāi)發(fā)調(diào)試工具,通過(guò)DSU與目標(biāo)機(jī)相連,進(jìn)行在線(xiàn)調(diào)試。

圖6 測(cè)試環(huán)境
設(shè)計(jì)了詳細(xì)的測(cè)試用例,對(duì)任務(wù)切換、任務(wù)運(yùn)行環(huán)境的保存恢復(fù)、中斷處理等進(jìn)行了測(cè)試驗(yàn)證,測(cè)試結(jié)果與預(yù)期相符,系統(tǒng)運(yùn)行穩(wěn)定正常。在主頻100MHz下,任務(wù)切換時(shí)間為11us,中斷響應(yīng)時(shí)間為5us,可以滿(mǎn)足對(duì)實(shí)時(shí)性有要求的應(yīng)用。
介紹了航天工程中常用的SPARC處理器的體系結(jié)構(gòu),對(duì)嵌入式實(shí)時(shí)操作系統(tǒng)的SPARC移植進(jìn)行了研究和實(shí)現(xiàn),并在S698-T開(kāi)發(fā)板上進(jìn)行了測(cè)試驗(yàn)證。測(cè)試結(jié)果表明,系統(tǒng)運(yùn)行穩(wěn)定正常,可靠性和實(shí)時(shí)性滿(mǎn)足航天工程的應(yīng)用要求。
[1] The SPARC Architecture Manual:Version 8[M]. CA: SPARC International,Inc, 1998.
[2] 魏淳,魏雷. Uc/OS-II在TMS320C6713上的移植[J]. 太原師范學(xué)院學(xué)報(bào)(自然科學(xué)版), 2012, 11(2): 91-94.(Wei Chun, Wei Lei. The Transplant of Uc/OS-II on TMS320C6713[J]. Journal of Taiyuan Normal University(Natural Science Edition), 2012, 11(2): 91-94.)
[3] 馮磊. SPARC結(jié)構(gòu)與實(shí)時(shí)內(nèi)核移植[D]. 北京: 中國(guó)科學(xué)院研究生院, 2006.(Feng Lei. The SPARC Architecture and Real-Time Kernel Porting[D]. Beijing: University of Chinese Academy of Sciences, 2006.)
[4] S698-T芯片用戶(hù)手冊(cè)[Z]. 廣東: 歐比特控制工程股份有限公司, 2010.(The S698-T User Mannual[Z]. Guangdong: Orbita Embedded, Inc, 2010.)
The Transplant of Embedded Real-time Operating System for SPARC Architecture
Xu Lulu, Zhen Jizhou, Peng Xiapeng, Li Yue
Beijing Aerospace Automatic Control Institute, Beijing 100854, China
Duringtheapplicationdevelopmentofembeddedreal-timeoperationsystem,theoperatingsystemportingtocorrespondinghardwareplatformisfirstlyapplied.TheSPARCarchitectureprocessoriscommonlyusedinaerospaceengineering.TheSPARCarchitectureconcepts,registerwindowandetcarebrielflyintroduced.Andthen,theembeddedreal-timeoperatingsystemportingtoSPARChardwareplatformisanalyzedandrealized.Finally,thetestsareimplementedtoverifytheperformance,andtheresultshowsthattheoperatingsystemisrunningsteadlyanditsperformancemeetstherequirementofapplications.
SPARC;Registerwindow;Embeddedreal-timeoperatingsystem;Porting
2016-01-18
許璐璐(1988-),男,江蘇人,碩士研究生,主要研究方向?yàn)榍度胧杰浖秽嵓?1970-),男,湖北人,研究員,主要研究方向?yàn)橛?jì)算機(jī)應(yīng)用技術(shù);彭夏鵬(1988-),男,湖南人,工程師,主要研究方向?yàn)榍度胧杰浖焕?悅(1984-),男,河北人,工程師,主要研究方向?yàn)榍度胧杰浖?/p>
TP319
A
1006-3242(2016)05-0077-04