嵌入式實(shí)時(shí)操作系統PetOS設計與實(shí)現
PetOS是一個(gè)自行設計的嵌入式實(shí)時(shí)操作系統。本文介紹了PetOS的技術(shù)背景,并詳細闡述PetOS系統中的任務(wù)調度機制、任務(wù)管理機制以及中斷管理機制的實(shí)現原理,指出PetOS在應用中的優(yōu)缺點(diǎn)。
1 引言
在嵌入式領(lǐng)域中,嵌入式實(shí)時(shí)操作系統正得到越來(lái)越廣泛的應用。采用嵌入式實(shí)時(shí)操作系統(RTOS)可以更合理、更有效地利用CPU 的資源,簡(jiǎn)化應用軟件的設計,縮短系統開(kāi)發(fā)時(shí)間,更好地保證系統的實(shí)時(shí)性和可靠性。由于RTOS需占用一定的系統資源(尤其是RAM 資源),只有μC/OS II、PalOS等少數實(shí)時(shí)操作系統能在小RAM 系統上運行。相對于μC/OS II[2]等商業(yè)操作系統,PalOS[1]操作系統是完全免費的操作系統,具有源碼公開(kāi)、內核簡(jiǎn)單等的特點(diǎn)。但該系統不支持任務(wù)優(yōu)先級、中斷等相對復雜的功能,不能很好的滿(mǎn)足嵌入式電子設備的需要。
2 PetOS簡(jiǎn)介
PalOS是UCLA(加州大學(xué)洛山機分校)為傳感器網(wǎng)絡(luò )而設計微型操系統。系統輪詢(xún)每個(gè)任務(wù)的消息隊列,如果存在消息則調用任務(wù)相應的消息處理函數。但是這種簡(jiǎn)單的輪詢(xún)機制和系統結構無(wú)法滿(mǎn)足更為復雜的應用需求。在任務(wù)管理、系統時(shí)鐘管理和中斷管理等功能上,PalOS的功能都有待加強。
PetOS以PalOS為原型,改進(jìn)了任務(wù)調度算法,引入優(yōu)先級的概念。每個(gè)任務(wù)可根據重要程度的不同被賦予一定的優(yōu)先級, CPU總是讓處于就緒態(tài)的、優(yōu)先級最高的任務(wù)先運行,從而實(shí)現任務(wù)的優(yōu)先級管理。PetOS還提供了嚴格優(yōu)先級調度模式和非嚴格優(yōu)先級調度模式,用于緩解高優(yōu)先級任務(wù)持續被調度時(shí),低優(yōu)先級任務(wù)出現‘餓死’的現象。
圖1 PetOS內核框架
簡(jiǎn)單輪詢(xún)或者優(yōu)先級調度都無(wú)法保證系統的實(shí)時(shí)性。這兩種調度都基于事件驅動(dòng),任務(wù)必須完成事件響應才會(huì )執行下一輪調度,因此系統的實(shí)時(shí)性會(huì )受到事件響應函數的粒度的影響,為了增加系統的實(shí)時(shí)性,PetOS加入了中斷管理及系統時(shí)鐘管理,用于提高系統的實(shí)時(shí)性。中斷可以由硬件產(chǎn)生,也可以由應用程序產(chǎn)生。中斷產(chǎn)生后,系統會(huì )及時(shí)進(jìn)入中斷模式進(jìn)行處理,從而保證實(shí)時(shí)性要求很高的事務(wù)能得到及時(shí)的處理。
PetOS內核框架如圖1。
3 PetOS的實(shí)現
3.1 PETOS任務(wù)維護/調度模塊
任務(wù)維護/調度模塊是PetOS的核心模塊 負責任務(wù)的管理和調度。
·TASK(任務(wù)):
TASK是PetOS應用程序的邏輯實(shí)體,擁有獨立的輸入響應、消息響應和輸出控制,是PetOS的調度實(shí)體。
PetOS任務(wù)具有如下5個(gè)狀態(tài):
·UNREGISTER :由于Task列表采用靜態(tài)數組,此狀態(tài)表示該數組項無(wú)效
·UNINIT:任務(wù)已經(jīng)注冊,但是尚未初始化,不可執行
·STOP:任務(wù)停止狀態(tài)。不接受消息,不可執行。無(wú)數據
圖2 PetOS 任務(wù)狀態(tài)轉換圖
·RUN:任務(wù)運行狀態(tài)。能接受消息,可以執行
·PAUSE:任務(wù)掛起狀態(tài):不能接受消息,不可執行。但保持數據。
任務(wù)在PetOS啟動(dòng)時(shí)被注冊,并常駐在操作系統中。即操作系統初始化完畢并啟動(dòng)之后,操作系統調度的任務(wù)列表是固定的。操作系統啟動(dòng)后,任務(wù)只會(huì )在運行、暫停、掛起狀態(tài)之前切換。
任務(wù)狀態(tài)圖如圖2:
為了方便任務(wù)的管理與控制,每個(gè)TASK都會(huì )綁定TCB(task control block)。TCB類(lèi)似于現代操作系統中進(jìn)程的PCB,它記錄了task的各種狀態(tài)變量、控制變量以及標準接口的函數指針,便于PetOS和應用程序維護。
Event(事件消息):
Event是PetOS進(jìn)程調度的粒度單位。
由于PetOS的每個(gè)任務(wù)不具備獨立的代碼/數據段/堆棧指針,我們無(wú)法在任意的位置暫停一個(gè)task而啟動(dòng)另一個(gè)。PetOS的解決策略是:將task拆分成為一個(gè)個(gè)獨立的由事件驅動(dòng)的邏輯模塊,每個(gè)task都有各自獨立的事件隊列。Task的每個(gè)邏輯功能都會(huì )被映射成一個(gè)事件,操作系統通過(guò)賦予某個(gè)task響應事件的權利來(lái)完成一次調度。而操作系統的多任務(wù)調度可以Task輪流響應事件來(lái)實(shí)現。
任務(wù)的調度:
圖3調度算法流程圖
在嵌入式系統中,很多應用要求執行的優(yōu)先級絕對優(yōu)先,比如USB文件傳輸的處理。為此,PetOS采用了多級任務(wù)機制,并賦予高優(yōu)先級的任務(wù)更高的執行權限。調度時(shí),PetOs將優(yōu)先調度優(yōu)先級高的任務(wù)。這種調度方式保證了高優(yōu)先級任務(wù)的實(shí)時(shí)響應,但可能導致低優(yōu)先級的任務(wù)永遠無(wú)法被執行。為了緩解這種‘餓死’現象,PetOS提供了兩種可選的配置:
·嚴格優(yōu)先級調度模式:即,若高優(yōu)先級的任務(wù)隊列中存在還有事件未響應的任務(wù),則無(wú)條件執行高優(yōu)先級的任務(wù)。
·非嚴格優(yōu)先級調度模式:即,當高優(yōu)先級隊列調度一輪過(guò)后,次優(yōu)先級的任務(wù)隊列中的第一個(gè)待執行任務(wù)可以得到1次調度。調度完成后繼續輪詢(xún)高優(yōu)先級隊列。
可以看到兩者的區別在于:嚴格調度模式可以保證高優(yōu)先級任務(wù)的絕對優(yōu)先,但是低級任務(wù)可能出現‘餓死’的情況。而對于非嚴格調度模式,不論任務(wù)優(yōu)先級有多低,總能以較低的頻率執行。
調度算法的分析及優(yōu)化:
在非嚴格模式下,設一級、二級、三級task隊列的長(cháng)度分別為N1,N2,N3。則二級隊列中調度一個(gè)任務(wù)需要判斷一級任務(wù)N1次;三級隊列中調度一個(gè)任務(wù)需要在一級隊列中判斷N1×N2次,在二級隊列中判斷N2次。在一級二級任務(wù)都很少被執行,而三級隊列中的任務(wù)消息粒度很小且執行頻率很高時(shí),任務(wù)調度所占用的系統消耗便會(huì )急劇上升。
一種解決方法是:PetOS給每個(gè)消息隊列加入了32Bit消息標記位。其中的每一位對應一個(gè)該優(yōu)先級中的任務(wù)。若消息標記變量的某一位為1,則代表該位對應的task存在尚未響應的事件;若為0,則表示該級隊列所有任務(wù)的事件都已經(jīng)處理完畢,可以調度次優(yōu)先級的任務(wù)。
通過(guò)消息標記位策略,若一級二級任務(wù)都不存在需要被調度的任務(wù),則三級任務(wù)被調度一次的代價(jià)只是查詢(xún)一級、二級任務(wù)的消息標記位各一次,從而大大降低了系統的消耗。
3.2中斷管理/定時(shí)函數管理
中斷管理:
由于PetOS的實(shí)時(shí)性受到事件粒度大小的影響,系統需要提供一種更強有力的實(shí)時(shí)性保障:中斷。PetOS中斷處理模塊主要完成中斷源的判斷、中斷向量的維護以及中斷響應函數的調度等工作。
PetOS支持64個(gè)中斷源[3],并對每個(gè)中斷源支持不限數目的中斷處理函數,因此該列表是一個(gè)雙向鏈表,里面包涵了該中斷號下的中斷處理函數,定位后依次執行該鏈表中的函數。
采用鏈表方式維護中斷處理函數可以更加靈活的維護中斷函數列表,但是實(shí)際上,很多中斷函數都是一次性的,比如USB連接響應函數在被調用后,需要將自己從該中斷的函數列表內刪除。而此時(shí),中斷處理函數正在使用該列表,這樣就引起了中斷函數鏈表的不一致性。
解決的方式是:
1)給所有函數句柄加入狀態(tài)。
2)維護中斷函數列表時(shí),如果句柄處于閑置狀態(tài),則進(jìn)行默認的操作;如果句柄處于IRQ狀態(tài)被刪除,則暫時(shí)不進(jìn)行直接的刪除操作,而是將句柄狀態(tài)改成PETOS_IRQ_HANDLER_CALL_STATUS_DELETE。
3)當中斷處理主函數調用完該函數后,若發(fā)現該函數的句柄狀態(tài)已經(jīng)改變,則可得知該函數已經(jīng)在調用過(guò)程中將自己注銷(xiāo)。IrqHandler會(huì )在此時(shí)重寫(xiě)中斷維護模塊API中注銷(xiāo)函數,在這里將該函數句柄刪除。
4)重新鏈接中斷函數列表和定位tmpIrqHandler找到下一個(gè)中斷處理函數句柄。
中斷擴展模塊-系統時(shí)鐘模塊和定時(shí)觸發(fā)函數:
中斷機制保證了PetOS對硬件請求的實(shí)時(shí)性響應,而對于軟件請求的實(shí)時(shí)性則由PetOS系統時(shí)鐘/定時(shí)觸發(fā)函數模塊完成。該模塊主要完成了兩部分工作:
·系統時(shí)鐘模塊:系統每隔固定的時(shí)間產(chǎn)生一個(gè)時(shí)間中斷。利用前面的中斷機制,我們可以模擬一個(gè)準實(shí)時(shí)的,不斷執行的任務(wù)。具體方法為將這段代碼注冊為系統時(shí)鐘的中斷處理函數。
·定時(shí)觸發(fā)函數模塊:為了滿(mǎn)足嵌入式電子產(chǎn)品應用程序的需要,基于系統時(shí)鐘模塊,PetOS供了定時(shí)觸發(fā)函數功能。用戶(hù)可以向系統注冊一個(gè)定時(shí)觸發(fā)函數,并指定其被調用的時(shí)間。操作系統通過(guò)預先注冊好的一個(gè)系統時(shí)鐘中斷處理函數來(lái)檢查是否有需要的定時(shí)觸發(fā)函數到期,并執行調度。
PetOS的任務(wù)調度是以事件為單位,不可能出現兩個(gè)任務(wù)同時(shí)訪(fǎng)問(wèn)同一段代碼的情況。因此,大部分代碼不需要考慮重入的問(wèn)題。
4 PetOS的不足及改進(jìn)方向
目前的調度算法還是存在任務(wù)優(yōu)先級跨度太大的問(wèn)題,高優(yōu)先級的任務(wù)可能直接導至低優(yōu)先級任務(wù)的“餓死”。
PetOS不可搶占的任務(wù)調度機制,各任務(wù)無(wú)獨立棧導致調度不夠靈活,如果一個(gè)任務(wù)的消息處理時(shí)間很長(cháng),則其他任務(wù)的消息響應時(shí)間也會(huì )很長(cháng),使得整個(gè)系統的實(shí)時(shí)性顯得較差并且無(wú)法移植阻塞式的應到到該系統中。
PetOS并沒(méi)有啟用多態(tài)運行模式,而是簡(jiǎn)單的將OS core和其他應用程序的地址空間復用。這樣雖然簡(jiǎn)化了系統結構,但是帶來(lái)了OS core的地址空間可能被其他應用程序直接訪(fǎng)問(wèn)的隱患。
因此調度算法及內存管理將是PetOS改進(jìn)的方向。
5 結束語(yǔ)
增加了優(yōu)先級調度、任務(wù)管理、中斷管理、系統時(shí)鐘管理后,PetOS由一個(gè)只適用于簡(jiǎn)單應用的微型操作系統蛻變?yōu)榭蓱糜趶碗s環(huán)境的小型操作系統。由于PetOS的模塊化結構和開(kāi)放性的代碼,使得各方案的擴展性和可維護性大大加強,大大縮短了方案開(kāi)發(fā)、產(chǎn)品維護的周期和成本。目前,基于A(yíng)RM922硬件平臺,PetOS已經(jīng)實(shí)現了MP4/學(xué)習機等嵌入式消費類(lèi)電子產(chǎn)品的方案,并已有成熟的產(chǎn)品上市,證明了PetOS的市場(chǎng)潛力。隨著(zhù)新的應用需求,PetOS會(huì )得到進(jìn)一步完善,在嵌入式領(lǐng)域發(fā)揮更大的作用。
參考文獻:
[1] UCLA Networked and Embedded Systems Lab. PALOS. http://sourceforge.net/projects/palos/ 2002
[2] JeanJ .Labrosse. uC /OS-11-源碼公開(kāi)的實(shí)時(shí)嵌人式操作系統[M],中國電力出版社,2001
[3] 杜春雷.ARM體系結構與編程[M] 清華大學(xué)出版社, 2003
[4] 沈勝慶.嵌入式操作系統的內核研究[J].微計算機信息,2006,2-2:72-74
linux相關(guān)文章:linux教程
評論