專利名稱:一種多任務(wù)實時操作系統(tǒng)的實現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及操作系統(tǒng)設(shè)計與實現(xiàn)技術(shù)領(lǐng)域,具體涉及一種在單片機嵌入式實時操作系統(tǒng)中實現(xiàn)多任務(wù)調(diào)度的方法。
在應(yīng)用系統(tǒng)中,當目標系統(tǒng)軟件比較復(fù)雜、規(guī)模比較龐大時,就需要一個操作系統(tǒng)的支持。目前,嵌入式的RTOS風(fēng)靡全球,例如Palm,VxWorks,Windows CE等等。但購買一個商用RTOS成本太高,而且無法獲得源代碼,同時由于商用RTOS具備較完善的功能,規(guī)模較大,需要的內(nèi)存和外存較多,較難移植到具體的單片機小系統(tǒng)上。因此編寫一個適用性強,功能合適,規(guī)模較小的單片機操作系統(tǒng)就顯得非常有必要了。這也有助于單片機應(yīng)用軟件的編寫規(guī)范化和模塊化。
本發(fā)明的技術(shù)問題是這樣解決的,構(gòu)造一種可用于單片機嵌入式系統(tǒng)的多任務(wù)實時操作系統(tǒng)的實現(xiàn)方法,其特征在于包括以下步驟為每一個任務(wù)設(shè)置一個最大允許等待時間,將每一個需要占用CPU運行的任務(wù)分為優(yōu)先級任務(wù)和一般任務(wù),用一個整數(shù)類型的數(shù)組記錄每個任務(wù)的等待時間并在定時器程序中對其數(shù)值進行減量刷新;設(shè)置任務(wù)建立函數(shù),可將一個任務(wù)與其相對應(yīng)的任務(wù)程序相連,并建立該任務(wù)的TCB,將一個或多個其長度不大于基本單位時間的不定長時間片分配給一個任務(wù);設(shè)置任務(wù)掛起函數(shù),用于在非臨界區(qū)的內(nèi)存空間實現(xiàn)多任務(wù)之間的調(diào)度,調(diào)度時,用函數(shù)和全局變量的形式來替換掉調(diào)度處的局部變量,每一個任務(wù)在所分配到的時間片結(jié)束或被掛起之前占用CPU;按照以下步驟進行多任務(wù)調(diào)度保存現(xiàn)場狀態(tài)、檢查就緒任務(wù)隊列中有無任務(wù),如有任務(wù)則利用調(diào)度算法取出一個就緒任務(wù),調(diào)用任務(wù)運行函數(shù)將該取出的任務(wù)設(shè)置為運行狀態(tài),恢復(fù)現(xiàn)場狀態(tài);其中,所述調(diào)度算法包括以下步驟如果有等待時間超過最大允許等待時間的任務(wù),則運行該任務(wù);如果有優(yōu)先級任務(wù),則按照輪轉(zhuǎn)法確定下一個就緒的優(yōu)先級任務(wù);如果沒有優(yōu)先級任務(wù),按照輪轉(zhuǎn)法確定下一個就緒的一般任務(wù)。
在按照本發(fā)明提供的方法中,所述調(diào)用任務(wù)掛起函數(shù)是執(zhí)行以下步驟將第一參數(shù)表示任務(wù)號所對應(yīng)的任務(wù)掛起第二參數(shù)表示的掛起時間,所述掛起時間以基本單位時間為單位,所述掛起時間為0時,將所述第一參數(shù)表示任務(wù)號對應(yīng)的任務(wù)重新放到所述就緒任務(wù)隊列的末尾;所述掛起時間不為0時,將所述第一參數(shù)表示任務(wù)號對應(yīng)的任務(wù)掛起所述第二時間表示的掛起時間后,再重新放到所述就緒任務(wù)隊列的末尾。
在按照本發(fā)明提供的方法中,還包括以下步驟設(shè)置任務(wù)就緒函數(shù)用于使某一個任務(wù)處于就緒狀態(tài)。
在按照本發(fā)明提供的方法中,還包括以下步驟設(shè)置任務(wù)優(yōu)先級設(shè)置函數(shù),用于在調(diào)用該函數(shù)時,改變一般任務(wù)為優(yōu)先級任務(wù)或改變優(yōu)先級任務(wù)為一般任務(wù)。
在按照本發(fā)明提供的方法中,還包括以下步驟設(shè)置任務(wù)刪除函數(shù)用于刪除一個任務(wù)。
在按照本發(fā)明提供的方法中,所述保存現(xiàn)場包括以下步驟關(guān)中斷;保存當前任務(wù)斷點信息,如堆棧、程序指針、寄存器等到該任務(wù)的TCB環(huán)境中以及開中斷;所述恢復(fù)現(xiàn)場包括以下步驟關(guān)中斷;用保存在該TCB中的環(huán)境信息來設(shè)置CPU堆棧、程序指針、寄存器等以及開中斷。
實施本發(fā)明提供的在單片機嵌入式實時操作系統(tǒng)中實現(xiàn)的一種多任務(wù)實時操作系統(tǒng)的實現(xiàn)方法,與許多現(xiàn)有RTOS相比,具有以下顯著進步允許多個任務(wù)并行,任務(wù)執(zhí)行速度快,能夠滿足實時性要求;可支持足夠多的并行任務(wù),并行任務(wù)數(shù)量只受到實際硬件條件限制,例如8051系統(tǒng)內(nèi)部和外部RAM空間。通過合理地調(diào)整程序的嵌套調(diào)用,可以允許32個或者更多的任務(wù)同步執(zhí)行。這對于一般的嵌入式應(yīng)用足夠了;利用本發(fā)明方法實現(xiàn)似的操作系統(tǒng)占用極少的資源;并方便用戶調(diào)用,對用戶而講,他無須了解OS的原理,不需要了解信號量等保證機制。只了解幾個調(diào)用函數(shù)的用法即可,同時又給用戶程序提供了足夠的靈活性,在任一個合適的程序處都可以實現(xiàn)任務(wù)調(diào)度;針對性和實用性非常強?;诒景l(fā)明的方法,可以在當前的許多軟件增加RTOS的功能,而且整個過程非常簡單,與此同時,還提供了一個OS平臺,方便軟件的模塊化工作。
為在嵌入式操作系統(tǒng)中實現(xiàn)多任務(wù),同時還要滿足實時性,需要對CPU時間進行劃分。在本發(fā)明中,任務(wù)的時間劃分不采用固定的時間片,而采用不定長時間片,時間片長短可以由用戶任意設(shè)置,只要有足夠精確的定時器。由于8051資源有限且應(yīng)用系統(tǒng)千差萬別,操作系統(tǒng)沒有也不可能占用某一個具體的定時器,因此該定時器需要用戶提供。假設(shè)用戶設(shè)置了8051的定時器T0,定時周期為10ms,并且把該時長(10ms)作為任務(wù)調(diào)度的基本時間單位。那么,10ms就是一個任務(wù)的最小時間片,也就是執(zhí)行任務(wù)可能的最小延時時間。為了保證實時性,就需要用戶任務(wù)程序在10ms內(nèi)完成,如果無法完成,必須掛起該任務(wù),騰出CPU給其他的需要運行的任務(wù)。
假設(shè)一個實例中有一個任務(wù)task0,該任務(wù)全部執(zhí)行完畢需要15ms。那么,可以把該任務(wù)程序分成兩部分。先執(zhí)行該任務(wù)的第一部分約8ms的程序部分(只要小于10ms即可),掛起該任務(wù)后,允許其他任務(wù)占用CPU,等待調(diào)度程序再次分配CPU,來執(zhí)行剩下的第二部分的程序。
那么任務(wù)是如何調(diào)度的?通常在多任務(wù)環(huán)境中,由于任務(wù)必須在自己已經(jīng)分到的內(nèi)存空間正確運行,互不干擾,互不破壞,這樣對于每個任務(wù)而言,都需要足夠的內(nèi)存空間來保存當前的大量環(huán)境狀態(tài),這樣操作系統(tǒng)占用的空間將會較大。如果一個用戶程序中有10個任務(wù),一個任務(wù)占用1K RAM空間,那么10個任務(wù)將占用10K RAM,這將消耗嵌入式用戶大量的寶貴資源,非常不經(jīng)濟,適用性很差。
如前所介紹,本發(fā)明采用的多任務(wù)實現(xiàn)方法,實際上是類似于MSDOS,Win31的“協(xié)作多任務(wù)”,即任務(wù)(程序)一直運行到它們主動讓出CPU為止。而不是Linux,Windows NT所支持的“搶占調(diào)度多任務(wù)”。采用目前這種方法,顯然用戶程序需要在一個不處于臨界區(qū)的地方(即是釋放掉臨界資源后的地方)實現(xiàn)任務(wù)調(diào)度,用函數(shù)和全局變量的形式來替換掉調(diào)度處的局部變量。這樣,操作系統(tǒng)就不用保留各個任務(wù)當前的大量狀態(tài)信息,并且不需要信號量,郵箱等復(fù)雜并發(fā)保證機制。這樣,此操作系統(tǒng)就可以做到非常短小精悍,目前只占用128字節(jié)的RAM和2k的ROM空間(可以允許8個任務(wù)同時執(zhí)行,如果任務(wù)增減,RAM空間將比例增減。實際上,RAM空間也就是所有TCB占用的空間),能夠在一般的嵌入式系統(tǒng)中得到廣泛的應(yīng)用。
任務(wù)調(diào)度的具體實現(xiàn),可以用一個掛起任務(wù)的函數(shù)來實現(xiàn)。該函數(shù)有兩個參數(shù),參數(shù)1表示掛起的任務(wù)號,參數(shù)2表示掛起的單位時間。顯然,任何一個任務(wù)可以掛起其他的任務(wù),也可以自身掛起;當自身掛起時,即是讓出了CPU;當掛起時間為0時,即是把自身任務(wù)重新放到了就緒任務(wù)的隊尾。然后執(zhí)行調(diào)度算法,把CPU分配給一個即將運行的任務(wù)。
那么采用哪種調(diào)度算法?基本上采用環(huán)形調(diào)度法,即時間片輪轉(zhuǎn)法。假設(shè)就緒任務(wù)一共有4個,采用“1→2→3→4→1”的調(diào)度方法,以保證所有任務(wù)都能執(zhí)行。換言之,每個任務(wù)使用一個時間片的CPU后,釋放處理機給下一個排在就緒隊首的任務(wù)后,自己返回到就緒隊列的隊尾(或者干脆掛起若干時間,騰出時間給其他就緒任務(wù))。對于優(yōu)先級任務(wù),比如中斷級別的任務(wù),或者頻繁執(zhí)行但執(zhí)行時間又很短暫的任務(wù),可以搶先執(zhí)行,但同樣遵循環(huán)形調(diào)度法則。用戶程序中需要定義一個最大等待時間。當一個一般級別的任務(wù)由于被優(yōu)先級搶先,導(dǎo)致在就緒隊列中等待時間超過最大等待時間時,此一般任務(wù)將被無條件的最先執(zhí)行。采用上述的調(diào)度方法后,就可以保證所有任務(wù)都可以被執(zhí)行,又能夠保證優(yōu)先級的任務(wù)的實時性。
在作為本發(fā)明方法一個實施例的操作系統(tǒng)中,提供以下接口給用戶,方便用戶的靈活應(yīng)用1)任務(wù)建立函數(shù)把一個任務(wù)與其相對應(yīng)的任務(wù)程序相連,并建立該任務(wù)的TCB;2)任務(wù)刪除函數(shù)刪除一個任務(wù);3)任務(wù)就緒函數(shù)使某一個任務(wù)處于就緒態(tài);4)任務(wù)優(yōu)先級設(shè)置函數(shù)改變一個任務(wù)的優(yōu)先級;5)任務(wù)運行函數(shù)立刻執(zhí)行某一個任務(wù);6)任務(wù)掛起函數(shù)掛起某一個任務(wù)一定的時間;7)操作系統(tǒng)啟動函數(shù)啟動運行。
另外,需要一個整數(shù)類型的數(shù)組。該數(shù)組元素的個數(shù)為任務(wù)的總數(shù),元素為各個任務(wù)等待的單位時間的時長。用戶需要在用戶的定時器程序中對所有數(shù)組元素進行減量操作。操作系統(tǒng)需要各個任務(wù)等待時長(操作系統(tǒng)本身沒有定時計數(shù)功能),才能進行正確的調(diào)度和控制。
在
圖1示出的基于本發(fā)明的多任務(wù)調(diào)度方法的實現(xiàn)流程中,在框101中,關(guān)中斷,在框102中,保存當前任務(wù)斷點信息,如堆棧、程序指針、寄存器等到該任務(wù)TCB環(huán)境中,在框103中,開中斷;在框104中,檢查在就緒任務(wù)隊列中,有無隊列(隊列是否為空),如果隊列為空,則返回框104繼續(xù)檢查;如就緒任務(wù)隊列不為空,進到框105,在框105中,按照其流程在圖2中給出的調(diào)度算法取出一個就緒任務(wù),并進到框106中,在框106中,設(shè)置該任務(wù)為運行狀態(tài),再在框107框中關(guān)中斷,在108框中,用保存在該TCB中的環(huán)境信息來設(shè)置CPU堆棧、程序指針、寄存器等,在框109中,開中斷。
在圖2示出的調(diào)度算法的流程圖中,在框201中,檢查有無等待時間超過最大允許等待時間的任務(wù)嗎,如沒有,則在框202中,檢查有無優(yōu)先級任務(wù),如沒有,則在框203中按照輪轉(zhuǎn)法找到下一個就緒的一般任務(wù),最后在框205中,取出該任務(wù);如在框202中查出存在優(yōu)先級任務(wù),則在框204中,按照輪轉(zhuǎn)法找到下一個就緒的優(yōu)先級任務(wù),并進到框205取出該任務(wù);如果在框201中,檢查到存在有其等待時間超過最大允許等待時間的任務(wù),則直接到框205取出該任務(wù)。
下面以一個具體的實例程序來說明利用本發(fā)明方法實現(xiàn)RTOS進行多任務(wù)調(diào)度的實際用法。
運行硬件環(huán)境80C552小系統(tǒng);顯示16×2字符LCD;鍵盤4鍵。程序完成如下功能LCD左上角部分被兩個顯示任務(wù)輪流占用,LCD右上角顯示當前時間;LCD左下角部分由一個任務(wù)實現(xiàn)動畫顯示,LCD右下角顯示一個實時數(shù)據(jù),當有鍵盤按下時,該數(shù)據(jù)被改變。
簡單說明一下該實例程序。該程序共有6個任務(wù),分述如下Task0每100ms執(zhí)行一次,實現(xiàn)一個普通數(shù)據(jù)變量的累加,并且顯示到顯示屏的坐標(0,0)處;Task1每1秒鐘執(zhí)行一次,讀取并顯示當前時間到坐標(8,0)處,同時在1分鐘的時間內(nèi),允許Task0和Task4交替執(zhí)行30秒;Task2實現(xiàn)簡單的動畫顯示,顯示到坐標(0,1)處;Task3每500ms實現(xiàn)一次實時數(shù)據(jù)的刷新,顯示位置(8,1);Task4實現(xiàn)簡單的動畫顯示,顯示到坐標(0,0)處;Task5每10ms讀取鍵盤口,當有鍵盤按下時,改變實時數(shù)據(jù),并且立刻運行Task3。
顯然,這里刻意把Task0和Task4顯示內(nèi)容處于同一個位置,來驗證任務(wù)的刪除和重建功能。
用戶程序中設(shè)定了一個10ms定時器T0,在定時器中斷程序中對任務(wù)計數(shù)器數(shù)組中的每個值都運行一次減量運算(或者稱為減一操作)。這樣操作系統(tǒng)就可以根據(jù)任務(wù)計數(shù)器數(shù)組中的數(shù)值進行正確的任務(wù)調(diào)度和處理了。因此操作系統(tǒng)的時間單位就是10ms。最快的響應(yīng)和控制將在10ms后執(zhí)行,從而滿足實時性。
主要程序可以如下實現(xiàn)Task0首先,該普通數(shù)據(jù)變量遞加,按十進制格式顯示在坐標(0,0)處,然后自身掛起10個單位的時間即可。
Task1從一個實時鐘芯片,如DS1687讀取時間后,按時間顯示格式顯示在坐標(8,0)處;判斷該時間是否為前30秒鐘,如果是,重建Task0,刪除Task4,否則重建Task4,刪除Task0,最后自身掛起100個單位的時間;Task2在坐標(0,1)到(7,1)之間,顯示一個位置循環(huán)左移的小圖標,每次顯示間距100毫秒,即自身掛起10個單位的時間;Task3按十進制格式顯示一個實時數(shù)據(jù)到坐標(8,1)處,然后自身掛起50個單位的時間;Task4在坐標(0,0)到(7,0)之間,顯示一個位置循環(huán)右移的小圖標,每次顯示間距100毫秒,即自身掛起10個單位的時間;Task5讀鍵盤口數(shù)據(jù),如果沒有鍵被按下,且持續(xù)60秒鐘的話,關(guān)閉液晶背光;否則根據(jù)按鍵改變實時數(shù)據(jù)的數(shù)值,然后立刻調(diào)用Task3(即完成數(shù)據(jù)的實時刷新),最后自身掛起1個單位的時間。
在用戶的主程序中,開始分別調(diào)用任務(wù)建立函數(shù)來建立6個任務(wù);然后初始化定時器T0,最后調(diào)用操作系統(tǒng)啟動函數(shù)即可。
另外,本程序中的Task5定時鍵盤處理任務(wù)摘自一個實際的監(jiān)控系統(tǒng)軟件中的10毫秒定時中斷程序部分。從中可見,該任務(wù)每10ms執(zhí)行一次,讀取鍵盤口,消抖動,允許用戶的加速鍵應(yīng)用,每30秒自動送入一個退出鍵值到鍵盤緩沖區(qū)中。顯然,該程序比較大而復(fù)雜,在定時中斷程序中執(zhí)行會降低軟件可靠性和效率(中斷程序應(yīng)該盡量短小),在背景程序中執(zhí)行又無法保證讀鍵和顯示的實時性。如上所述,把鍵盤處理函數(shù)當作一個任務(wù)執(zhí)行,就完美地解決了上述問題。
綜上所述,實現(xiàn)本發(fā)明提出的支持多任務(wù)調(diào)度的嵌入式RTOS的實現(xiàn)方法,在充分保證多個任務(wù)實時的同時保證響應(yīng)的實時性。雖然上述實施例以單片機8051舉例,實際上它可應(yīng)用到其他類型的單片機系統(tǒng)上。它可以作為一種微內(nèi)核RTOS,實際應(yīng)用時需要用戶合理設(shè)置任務(wù)調(diào)度。由于無須開辟巨大的RAM空間來保存各個任務(wù)的環(huán)境,因此顯得非常短小精悍,可以用在許多嵌入式應(yīng)用中。運用之妙,在乎各人了。
權(quán)利要求
1.一種多任務(wù)實時操作系統(tǒng)的實現(xiàn)方法,其特征在于包括以下步驟(1)為每一個任務(wù)設(shè)置一個最大允許等待時間,將每一個需要占用CPU運行的任務(wù)分為優(yōu)先級任務(wù)和一般任務(wù),用一個整數(shù)類型的數(shù)組記錄每個任務(wù)的等待時間并在定時器程序中對其數(shù)值進行減量刷新,其特征在于,包括以下步驟(2)設(shè)置一個任務(wù)建立函數(shù),可將一個任務(wù)與其相對應(yīng)的任務(wù)程序相連,并建立該任務(wù)的TCB,將一個或多個其長度不大于基本單位時間的不定長時間片分配給一個任務(wù);(3)設(shè)置一個任務(wù)掛起函數(shù),用于在非臨界區(qū)的內(nèi)存空間實現(xiàn)多任務(wù)之間的調(diào)度,調(diào)度時,用函數(shù)和全局變量的形式來替換掉調(diào)度處的局部變量,每一個任務(wù)在所分配到的時間片結(jié)束或被掛起之前占用CPU;(4)按照以下步驟進行多任務(wù)調(diào)度保存現(xiàn)場狀態(tài)、檢查就緒任務(wù)隊列中有無任務(wù),如有任務(wù)則利用調(diào)度算法取出一個就緒任務(wù),調(diào)用任務(wù)運行函數(shù)將該取出的任務(wù)設(shè)置為運行狀態(tài),恢復(fù)現(xiàn)場狀態(tài);其中,所述調(diào)度算法包括以下步驟如果有等待時間超過最大允許等待時間的任務(wù),則運行該任務(wù);如果有優(yōu)先級任務(wù),則按照輪轉(zhuǎn)法確定下一個就緒的優(yōu)先級任務(wù);如果沒有優(yōu)先級任務(wù),按照輪轉(zhuǎn)法確定下一個就緒的一般任務(wù)。
2.根據(jù)權(quán)利要求1所述方法,其特征在于,所述調(diào)用任務(wù)掛起函數(shù)是執(zhí)行以下步驟將第一參數(shù)表示任務(wù)號所對應(yīng)的任務(wù)掛起第二參數(shù)表示的掛起時間,所述掛起時間以基本單位時間為單位,所述掛起時間為0時,將所述第一參數(shù)表示任務(wù)號對應(yīng)的任務(wù)重新放到所述就緒任務(wù)隊列的末尾;所述掛起時間不為0時,將所述第一參數(shù)表示任務(wù)號對應(yīng)的任務(wù)掛起所述第二時間表示的掛起時間后,再重新放到所述就緒任務(wù)隊列的末尾。
3.根據(jù)權(quán)利要求1所述方法,其特征在于,還包括以下步驟設(shè)置任務(wù)就緒函數(shù)用于使某一個任務(wù)處于就緒狀態(tài)。
4.根據(jù)權(quán)利要求1所述方法,其特征在于,還包括以下步驟設(shè)置任務(wù)優(yōu)先級設(shè)置函數(shù),用于在調(diào)用該函數(shù)時,改變一般任務(wù)為優(yōu)先級任務(wù)或改變優(yōu)先級任務(wù)為一般任務(wù)。
5.根據(jù)權(quán)利要求1所述方法,其特征在于,還包括以下步驟設(shè)置任務(wù)刪除函數(shù)用于刪除一個任務(wù)。
6.根據(jù)權(quán)利要求1所述方法,其特征在于,所述保存現(xiàn)場包括以下步驟關(guān)中斷;保存當前任務(wù)斷點信息,如堆棧、程序指針、寄存器等到該任務(wù)的TCB環(huán)境中以及開中斷;所述恢復(fù)現(xiàn)場包括以下步驟關(guān)中斷;用保存在該TCB中的環(huán)境信息來設(shè)置CPU堆棧、程序指針、寄存器等以及開中斷。
全文摘要
一種單片機嵌入式多任務(wù)實時操作系統(tǒng)的實現(xiàn)方法,為每個任務(wù)設(shè)置最大允許等待時間,將任務(wù)分為優(yōu)先級任務(wù)和一般任務(wù),用整數(shù)類型的數(shù)組記錄每個任務(wù)的等待時間并在定時器程序中對其數(shù)值進行減量刷新;通過設(shè)置任務(wù)建立函數(shù)和掛起函數(shù),將任務(wù)與其相對應(yīng)的任務(wù)程序相連或在非臨界區(qū)實現(xiàn)多任務(wù)調(diào)度,調(diào)度時,如果有等待時間超過最大允許等待時間的任務(wù),則運行該任務(wù);如果有優(yōu)先級任務(wù),則按照輪轉(zhuǎn)法確定下一個就緒的優(yōu)先級任務(wù);如果沒有優(yōu)先級任務(wù),按照輪轉(zhuǎn)法確定下一個就緒的一般任務(wù)。這種實現(xiàn)方法,允許多個任務(wù)并行,占用資源少,任務(wù)執(zhí)行速度快,在滿足實時性要求同時,也可提供足夠的靈活性,調(diào)用也極為便利,針對性和實用性非常強。
文檔編號G06F9/38GK1409209SQ0112690
公開日2003年4月9日 申請日期2001年9月24日 優(yōu)先權(quán)日2001年9月24日
發(fā)明者熊勇 申請人:深圳市中興通訊股份有限公司上海第二研究所