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