摘 要: 針對操作系統(tǒng)內(nèi)核占用系統(tǒng)資源的問題,提出了一種新的實(shí)時(shí)操作系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)方法。在仔細(xì)研究了μC/OS-II后,改進(jìn)了原μC/OS-II的TCB模塊,配合多任務(wù)調(diào)度狀態(tài)機(jī)構(gòu)成的硬件調(diào)度系統(tǒng)替代了軟調(diào)度系統(tǒng),提高了多任務(wù)調(diào)度性能并將改進(jìn)的系統(tǒng)內(nèi)核在FPGA上硬件化。通過修改51內(nèi)核,設(shè)計(jì)了多任務(wù)映射的堆棧區(qū),解決了51系列微控制器堆棧過小無法運(yùn)行多任務(wù)的問題。
關(guān)鍵詞: μC/OS-II;實(shí)時(shí)操作系統(tǒng);FPGA
?
隨著現(xiàn)代信息技術(shù)突飛猛進(jìn)的發(fā)展,軟件模塊化技術(shù)也有了廣泛提高。為了更好地發(fā)揮微控制器的性能以及滿足更多的功能,使軟硬件能夠更好地結(jié)合和展示,在微控制器中移植嵌入式操作系統(tǒng)已經(jīng)成為一種趨勢。目前,嵌入式系統(tǒng)的應(yīng)用范圍非常廣泛,不同領(lǐng)域有不同要求。通常有非實(shí)時(shí)系統(tǒng)和實(shí)時(shí)系統(tǒng),而實(shí)時(shí)系統(tǒng)中又分硬實(shí)時(shí)和軟實(shí)時(shí)系統(tǒng)。在要求苛刻的系統(tǒng)中,一般需要硬實(shí)時(shí)操作系統(tǒng)。本文涉及飛行器剎車控制系統(tǒng),必須使用硬實(shí)時(shí)操作系統(tǒng)。
1 項(xiàng)目產(chǎn)生背景
某軍用機(jī)型的航空剎車控制系統(tǒng)原使用微控制器80C31,外擴(kuò)ROM、RAM及其他外設(shè)。軟件為前后臺系統(tǒng),圖1為原系統(tǒng)連接示意圖。
?
當(dāng)新機(jī)型的剎車系統(tǒng)控制要求升級后,系統(tǒng)控制對象增多,控制算法復(fù)雜度增大,原有系統(tǒng)已完全不能勝任現(xiàn)在的要求。因此,需要尋求新解決方案來滿足新系統(tǒng)要求。
為了保證能夠向下兼容原系統(tǒng),在原有系統(tǒng)基礎(chǔ)上能夠最大限度升級改進(jìn),仍選用51內(nèi)核的微控制器。經(jīng)過論證,決定選用FPGA構(gòu)造新系統(tǒng),在FPGA系統(tǒng)中內(nèi)嵌8051 IP核。這是在Oregano Systems公司提供的免費(fèi)8051 IP核的基礎(chǔ)上根據(jù)系統(tǒng)的需要而定制的。僅保留51的內(nèi)核部分,并對內(nèi)核進(jìn)行一定的改造以適應(yīng)需要的操作系統(tǒng)的移植。通過Verilog語言編寫多個(gè)可編程外設(shè)數(shù)字模塊掛接在系統(tǒng)總線上,功能遠(yuǎn)遠(yuǎn)超越一般的51方案。將各種數(shù)字器件通過編程和IP核的方式集成在FPGA中,這極大地提高了單芯片功能,減少了元器件數(shù)量,從而簡化了整個(gè)系統(tǒng)設(shè)計(jì),降低了系統(tǒng)故障率,縮短了循環(huán)開發(fā)周期,大幅度減少了電路板面積和系統(tǒng)總成本。
新系統(tǒng)中的軟件部分舍棄了前后臺系統(tǒng),使用實(shí)時(shí)操作系統(tǒng)。這樣,軟件系統(tǒng)可以很方便地分成多個(gè)在開發(fā)和運(yùn)行上獨(dú)立而又具有一定聯(lián)系的小任務(wù),便于多人員參與開發(fā)。系統(tǒng)中的各種硬件被看成獨(dú)立的資源,由各任務(wù)來調(diào)用。設(shè)計(jì)者希望創(chuàng)新性地將實(shí)時(shí)操作系統(tǒng)的內(nèi)核部分的功能硬件化至FPGA中,從而進(jìn)一步加強(qiáng)系統(tǒng)的硬實(shí)時(shí)特性。因?yàn)椴僮飨到y(tǒng)產(chǎn)生的負(fù)載都將由硬件來承擔(dān)。而此時(shí)操作系統(tǒng)對于軟件編程員來說幾乎是透明的,如同使用一塊操作系統(tǒng)芯片,只要將編寫的任務(wù)編譯好直接載入Flash,系統(tǒng)啟動(dòng)后程序初始化操作系統(tǒng)的各控制寄存器填入各任務(wù)入口地址即可開始運(yùn)行。系統(tǒng)采用免費(fèi)公開源代碼的μC/OS-II實(shí)時(shí)操作系統(tǒng),并在其基礎(chǔ)上根據(jù)新系統(tǒng)的硬件條件進(jìn)行修改,量身定做一個(gè)合適的硬件實(shí)時(shí)操作系統(tǒng)。
改進(jìn)后的新系統(tǒng)示意框圖如圖2所示。
2 改進(jìn)的任務(wù)調(diào)度機(jī)制的設(shè)計(jì)
作為實(shí)時(shí)系統(tǒng)最為關(guān)鍵的組成部分——實(shí)時(shí)操作系統(tǒng)內(nèi)核,其主要功能有:事件管理、時(shí)間管理、中斷服務(wù)、實(shí)時(shí)調(diào)度等[1],如圖3所示?,F(xiàn)階段主要針對內(nèi)核的調(diào)度機(jī)和事件管理功能進(jìn)行硬件化改進(jìn),并對51 IP內(nèi)核結(jié)構(gòu)進(jìn)行相應(yīng)改進(jìn)。
2.1 任務(wù)控制塊(TCB)的改進(jìn)
基于μC/OS-II的思想,每個(gè)任務(wù)在建立后都有一個(gè)TCB來管理該任務(wù)。TCB是一個(gè)數(shù)據(jù)結(jié)構(gòu),當(dāng)任務(wù)的CPU使用權(quán)被剝奪時(shí),μC/OS-II用它來保存該任務(wù)的狀態(tài)。新系統(tǒng)中,TCB修改后其數(shù)據(jù)結(jié)構(gòu)占用13 B,其中參數(shù)如下所示:
typedef struct os_tcb
{
? INT8U??OSTCBStkPtr;
OS_EVENT?*OSTCBEVENTPtr;
??? void???*OSTCBMsg;
void???*OSTCBTaskPtr;
INT8U??OSTCBId;
INT8U??OSTCBPrio;
INT8U??OSTCBCntInitVlu;
INT8U??OSTCBCnt
INT16U??OSTCBDly;
INT8U??OSTCBStat;
BOOLEAN?OSTCBDelReq;
};
該數(shù)據(jù)結(jié)構(gòu)刪減了原有TCB的部分參數(shù),保留原有TCB部分參數(shù)意義不變,具體請見參考文獻(xiàn)[2]。被修改的TCB參數(shù)意義表述如下:
OSTCBStkPtr為任務(wù)堆棧指針,占1 B,其保存的是51堆棧指針SP的值;
??? *OSTCBTaskPtr為任務(wù)函數(shù)入口地址指針,其保存的是該任務(wù)的入口地址;
OSTCBId為任務(wù)ID號,參數(shù)取值為0~63,任意任務(wù)的ID值不允許相同,其為每個(gè)任務(wù)唯一識別碼;
OSTCBPrio為任務(wù)優(yōu)先級,參數(shù)取值為0~63,0為最高優(yōu)先級,63為最低優(yōu)先級,各個(gè)任務(wù)的優(yōu)先級允許相同;
OSTCBCntInitVlu為任務(wù)剩余時(shí)間片初始化值,取值從255~0;
OSTCBCnt為任務(wù)剩余時(shí)間片,取值從255~0;
OSTCBStat為任務(wù)當(dāng)前狀態(tài)及控制寄存器。讀寄存器,則會返回當(dāng)前任務(wù)的狀態(tài),例如運(yùn)行或者就緒態(tài);寫寄存器,則控制當(dāng)前任務(wù)自動(dòng)進(jìn)入某狀態(tài),例如寫入掛起信號,則調(diào)度系統(tǒng)狀態(tài)機(jī)自動(dòng)將當(dāng)前任務(wù)掛起。
這些參數(shù)中,最重要的改動(dòng)是OSTCBPrio和OSTCBCnt,由此系統(tǒng)改進(jìn)成支持時(shí)間片輪番調(diào)度的可剝奪型內(nèi)核。創(chuàng)建任務(wù)時(shí),任務(wù)的OSTCBId被賦唯一初值,OSTCBPrio被賦予合適的優(yōu)先級,其允許和其他任務(wù)同等優(yōu)先級,OSTCBCnt被賦予合適的任務(wù)執(zhí)行時(shí)間。任務(wù)執(zhí)行過程中,OSTCBId和OSTCBPrio不允許改變,而在一個(gè)系統(tǒng)節(jié)拍過后,當(dāng)前任務(wù)的OSTCBCnt將減1,在任務(wù)執(zhí)行過程中OSTCBCnt將隨系統(tǒng)節(jié)拍不斷減小,直至為0。當(dāng)就緒態(tài)中同種優(yōu)先級的所有任務(wù)的OSTCBCnt全部減為0時(shí),重新將各個(gè)任務(wù)的OSTCBCntInitVlu的值載入至OSTCBCnt。
任務(wù)的調(diào)度規(guī)則是:
(1)OSTCBPrio越小,則越優(yōu)先執(zhí)行;
(2)OSTCBPrio相等,則OSTCBCnt越大的越優(yōu)先執(zhí)行;
(3)OSTCBPrio和OSTCBCnt都相等,則OSTCBId越小越優(yōu)先執(zhí)行。
任務(wù)調(diào)度執(zhí)行示意圖如圖4所示。
在原μC/OS-II系統(tǒng)中,內(nèi)核通過一個(gè)“就緒表”完成對系統(tǒng)的就緒態(tài)最高優(yōu)先級任務(wù)的調(diào)度。系統(tǒng)內(nèi)核基本工作是任務(wù)調(diào)度,系統(tǒng)運(yùn)行中,將會有一定的資源消耗在調(diào)度上,大約占用CPU資源的2%~5%。這對于51內(nèi)核來說,可能占用的CPU資源更多。
本系統(tǒng)改進(jìn)的目的,是要盡量用硬件完成系統(tǒng)的調(diào)度,釋放調(diào)度占用的CPU資源。因此改進(jìn)后的系統(tǒng)去掉了“就緒表”,而使用一個(gè)有限狀態(tài)機(jī)完成對系統(tǒng)的調(diào)度。
在一個(gè)系統(tǒng)節(jié)拍中,狀態(tài)機(jī)將遍歷所有任務(wù)的OSTCBId、OSTCBPrio、OSTCBCnt和OSTCBStat參數(shù),找到STCBStat處于就緒態(tài)的任務(wù),且按照上文中所述的調(diào)度規(guī)則進(jìn)行搜尋。找到最合適規(guī)則的任務(wù)ID號即OSTCBId值,首先將其寫到任務(wù)調(diào)度緩沖區(qū)TaskIdBuf,之后等待,準(zhǔn)備在恰當(dāng)?shù)臅r(shí)機(jī)寫入調(diào)度寄存器TaskId,進(jìn)行任務(wù)切換。
2.2 任務(wù)堆棧區(qū)(STK)的改進(jìn)
51系列單片機(jī)的內(nèi)部直接尋址范圍00H~7FH,CPU復(fù)位后,堆棧指針SP復(fù)位為07H,堆棧向上增長,顯然堆棧最大深度為120 B,而且00H~1FH段為4組通用寄存器區(qū),20H~2FH為位尋址區(qū),如果需要使用這些區(qū)域,堆棧的深度則縮減為80 B,這對于多任務(wù)處理顯然是極其有限的。
μC/OS-II移植最關(guān)鍵的是堆棧設(shè)計(jì),這里有兩個(gè)最重要的問題:模擬多任務(wù)堆棧結(jié)構(gòu)和51系列單片機(jī)堆棧較小缺陷的解決。
解決問題的方法是修改8051的IP核源代碼,將51核內(nèi)部直接尋址區(qū)修改成如圖5所示的尋址區(qū)。
通過內(nèi)部地址映射管理器的映射,將FPGA的RAM中的80 B映射到直接尋址區(qū)的30H~7FH的任務(wù)堆棧區(qū)中,這80 B的數(shù)據(jù)都作為同一個(gè)任務(wù)的堆棧,這對于一般能在51系統(tǒng)上運(yùn)行的任務(wù)已足夠,能夠解決堆棧空間較小的問題。本系統(tǒng)最多支持64個(gè)任務(wù),因此,在RAM中有連續(xù)64個(gè)80 B的STK區(qū)塊可以映射到直接尋址區(qū)的STK區(qū)塊上,同時(shí),映射管理器將RAM中連續(xù)的64個(gè)13 B的TCB區(qū)塊映射到FPGA控制寄存器區(qū)的TCB寄存器區(qū)塊上。如此,當(dāng)任務(wù)調(diào)度寄存器TaskId中填入的任務(wù)ID號改變時(shí),直接尋址區(qū)的STK的數(shù)據(jù)和FPGA控制寄存器區(qū)TCB的數(shù)據(jù)將隨之而改變,映射所指向的區(qū)塊由調(diào)度寄存器TaskId來決定。當(dāng)調(diào)度系統(tǒng)決定要開始一次新的任務(wù)調(diào)度時(shí),由如下步驟來完成:
(1)給51內(nèi)核1個(gè)INT0外部0號中斷信號,通知需要進(jìn)入系統(tǒng)調(diào)度狀態(tài);
(2)中斷服務(wù)程序?qū)?dāng)前任務(wù)使用寄存器入棧;
(3)中斷服務(wù)程序?qū)?dāng)前任務(wù)SP的內(nèi)容保存到當(dāng)前任務(wù)TCB的OSTCBStkPtr;
(4)中斷服務(wù)程序發(fā)信號至FPGA的調(diào)度系統(tǒng)狀態(tài)機(jī),狀態(tài)機(jī)自動(dòng)將任務(wù)調(diào)度緩沖區(qū)TaskIdBuf的數(shù)據(jù)寫入調(diào)度寄存器TaskId,切換STK和TCB;
(5)中斷服務(wù)程序?qū)⑶袚Q后的任務(wù)TCB的OSTCBStkPtr寫入51內(nèi)核的SP;
(6)中斷服務(wù)程序?qū)⑶袚Q后的任務(wù)使用寄存器出棧;
(7)退出中斷,切換后的任務(wù)開始繼續(xù)運(yùn)行。
如此修改后,任務(wù)切換中軟件需要完成的工作就極其簡單了,這極大降低了軟件系統(tǒng)對任務(wù)切換進(jìn)行控制所消耗的成本,這些工作由硬件系統(tǒng)在任務(wù)運(yùn)行的同時(shí)并行完成。這樣,即使將系統(tǒng)時(shí)鐘節(jié)拍頻率設(shè)定得比較高,系統(tǒng)的額外負(fù)載也不會過重。系統(tǒng)硬件對STK和TCB的物理映射,也同時(shí)保證了一個(gè)任務(wù)對其他任務(wù)的STK和TCB的不可見性,保護(hù)了其他任務(wù)的STK和TCB數(shù)據(jù)不受該任務(wù)的影響,從而一定程度上保證了任務(wù)運(yùn)行的安全。
本文提出一個(gè)新的思想和嘗試方法進(jìn)行操作系統(tǒng)的設(shè)計(jì)。其創(chuàng)新點(diǎn)主要體現(xiàn)在:
(1)將操作系統(tǒng)硬件化。以往的操作系統(tǒng)屬于在應(yīng)用系統(tǒng)上運(yùn)行的軟件的一部分,需要占用應(yīng)用系統(tǒng)中CPU的部分資源。而操作系統(tǒng)硬件化后,在任務(wù)運(yùn)行的同時(shí),硬件操作系統(tǒng)并行地完成了任務(wù)調(diào)度的準(zhǔn)備工作,只需要運(yùn)行中的任務(wù)完成保存現(xiàn)場數(shù)據(jù)至堆棧的工作,操作系統(tǒng)將立即切換任務(wù)。任務(wù)切換所需要的時(shí)間遠(yuǎn)遠(yuǎn)小于傳統(tǒng)軟件操作系統(tǒng)。
(2)各任務(wù)在RAM區(qū)的STK映射到51內(nèi)核的直接尋址區(qū)的STK中,解決了51系列微控制器堆棧區(qū)過小的問題,并使得各個(gè)任務(wù)的堆棧區(qū)都是獨(dú)立的。而編寫任務(wù)程序時(shí),則是相對于同一個(gè)空間地址進(jìn)行操作,且任務(wù)堆棧切換無需軟件控制,避免了程序上出錯(cuò)造成的影響。同樣使用映射技術(shù)的還有TCB區(qū)和ECB區(qū),此處不再贅述。
該改進(jìn)方案已基本在FPGA系統(tǒng)上實(shí)現(xiàn),目前仍處于性能測試階段,不足之處有待改進(jìn)。
?
參考文獻(xiàn)
[1] 徐惠民.基于VxWorks的嵌入式系統(tǒng)及實(shí)驗(yàn)[M].北京:北京郵電大學(xué)出版社,2006.
[2] LABROSSE J J.The real-time kernel second edition[M].北京:北京航空航天大學(xué)出版社,2003.
[3] 張培仁.基于C語言編程MCS-51單片機(jī)原理與應(yīng)用[M].北京:清華大學(xué)出版社,2003.
[4] 朱明程,熊元姣.ACTEL數(shù)字系統(tǒng)現(xiàn)場集成技術(shù)[M].北京:清華大學(xué)出版社,2004.
[5] 田志鑫,張雷.在51單片機(jī)上移植μC/OS-II關(guān)鍵問題的解決[A].微計(jì)算機(jī)信息,2007,23(12):56-58.
[6] 孫旭祥.淺析實(shí)時(shí)操作系統(tǒng)的任務(wù)調(diào)度[A].通信對抗,2005(12):47-50.
[7] 溫圣軍,王簡瑜.80C51原始IP核內(nèi)部RAM的擴(kuò)展方案[A].單片機(jī)與嵌入式應(yīng)用,2008(2):64-66.