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