專利名稱:嵌入式實(shí)時(shí)操作系統(tǒng)的二分查找式任務(wù)調(diào)度方法
技術(shù)領(lǐng)域:
嵌入式實(shí)時(shí)操作系統(tǒng)的二分查找式任務(wù)調(diào)度方法屬于嵌入式實(shí)時(shí)操作系統(tǒng)技術(shù)領(lǐng)域,特別涉及基于PowerPC處理器結(jié)構(gòu)的嵌入式實(shí)時(shí)操作系統(tǒng)。
背景技術(shù):
任務(wù)調(diào)度是多任務(wù)操作系統(tǒng)的核心之一。任務(wù)調(diào)度的主要功能,是從用戶任務(wù)中按照一定規(guī)則選擇一個(gè)就緒的用戶任務(wù),并跳轉(zhuǎn)到用戶任務(wù)執(zhí)行。多數(shù)嵌入式實(shí)時(shí)操作系統(tǒng)內(nèi)核是基于優(yōu)先級(jí)調(diào)度的,既每個(gè)任務(wù)根據(jù)其重要程度的不同被賦予一個(gè)優(yōu)先級(jí)數(shù)值,調(diào)度器總是選擇就緒的優(yōu)先級(jí)最高的任務(wù)運(yùn)行。常見的基于優(yōu)先級(jí)的調(diào)度方法有時(shí)間片輪轉(zhuǎn)法和先進(jìn)先出法。
任務(wù)調(diào)度主要由調(diào)度器實(shí)現(xiàn)。為了實(shí)現(xiàn)上述調(diào)度方法,調(diào)度器必須查找任務(wù)列表,獲得按調(diào)度規(guī)則應(yīng)該執(zhí)行的任務(wù)的信息,并跳轉(zhuǎn)到正確的內(nèi)存地址。本發(fā)明中所述的調(diào)度實(shí)現(xiàn)方法,指的就是這一過程。
由于操作系統(tǒng)在運(yùn)行過程中調(diào)度非常頻繁,因此調(diào)度器的性能直接影響著操作系統(tǒng)的運(yùn)行效率和系統(tǒng)穩(wěn)定性。另一方面,在嵌入式應(yīng)用中,可應(yīng)用的存儲(chǔ)資源非常有限,因此調(diào)度器的設(shè)計(jì)要在滿足實(shí)時(shí)性要求的同時(shí)還應(yīng)考慮對(duì)資源的使用要盡可能節(jié)省,從而給應(yīng)用程序以更大的使用空間。
目前,現(xiàn)存的嵌入式實(shí)時(shí)操作系統(tǒng)種類繁多,它們的調(diào)度實(shí)現(xiàn)方法各具特色。在現(xiàn)有公開的技術(shù)中,有順序遍歷就緒任務(wù)列隊(duì)法或改進(jìn)的遍歷列隊(duì)法,這種方法使用的結(jié)構(gòu)變量簡(jiǎn)單,使用靈活,但耗時(shí)不穩(wěn)定,最壞情況下必須遍歷整個(gè)任務(wù)隊(duì)列,因此當(dāng)優(yōu)先級(jí)很多的情況下,最長(zhǎng)的遍歷延時(shí)是實(shí)時(shí)系統(tǒng)不能接受的。μC/OS-II等一些實(shí)時(shí)操作系統(tǒng)采用分組映射表的方法,這種方法耗時(shí)穩(wěn)定,而且效率很高,但該方法的結(jié)構(gòu)變量復(fù)雜,使用的存儲(chǔ)空間大,而且不利于動(dòng)態(tài)改變優(yōu)先級(jí)。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種耗時(shí)穩(wěn)定、效率高而且結(jié)構(gòu)變量簡(jiǎn)單、節(jié)省存儲(chǔ)空間,適于動(dòng)態(tài)地改變?nèi)蝿?wù)優(yōu)先級(jí)的嵌入式實(shí)時(shí)操作系統(tǒng)二分查找式調(diào)度方法。
本發(fā)明的主要內(nèi)容為采用狀態(tài)掩碼表示任務(wù)列表中任務(wù)的就緒狀態(tài),在操作系統(tǒng)生成時(shí),根據(jù)用戶配置的最大優(yōu)先級(jí)分配狀態(tài)掩碼,該掩碼的每一位都標(biāo)識(shí)了一個(gè)優(yōu)先級(jí)狀態(tài),當(dāng)其中一位為0時(shí),表示該位對(duì)應(yīng)優(yōu)先級(jí)的任務(wù)都沒有就緒,即該優(yōu)先級(jí)任務(wù)列隊(duì)為空,相反當(dāng)為1時(shí),表示該位有對(duì)應(yīng)優(yōu)先級(jí)的任務(wù)已經(jīng)就緒即該優(yōu)先級(jí)任務(wù)列隊(duì)非空。在操作系統(tǒng)運(yùn)行過程中,每當(dāng)有任務(wù)進(jìn)入就緒態(tài)需要運(yùn)行時(shí),或者任務(wù)結(jié)束時(shí),對(duì)應(yīng)的系統(tǒng)內(nèi)核操作將修改狀態(tài)掩碼的相應(yīng)優(yōu)先級(jí)狀態(tài)位。
利用移位比較的方法實(shí)現(xiàn)二分查找,快速定位最高優(yōu)先級(jí)任務(wù)。首先以無(wú)符號(hào)數(shù)的形式讀取當(dāng)前的狀態(tài)掩碼值,優(yōu)先級(jí)為k的任務(wù)對(duì)應(yīng)讀出的掩碼值為2k。對(duì)n個(gè)任務(wù)優(yōu)先級(jí)的系統(tǒng),第一次生成比較因子2n/2,與狀態(tài)掩碼比較,如果比較因子大于掩碼,則將比較因子改為2n/2-n/4,否則將比較因子改為2n/2+n/4,重復(fù)上述比較步驟,每次比較因子的增量減半,直到比較因子為1,即可得到最高優(yōu)先級(jí)任務(wù)對(duì)應(yīng)的掩碼值??偙容^次數(shù)只需log2(n+1)次。
本發(fā)明的特征在于它是一種當(dāng)任務(wù)主動(dòng)申請(qǐng)調(diào)度或終止時(shí),或者中斷服務(wù)程序激活了新任務(wù)時(shí),針對(duì)PowerPC處理器且基于優(yōu)先級(jí)的先進(jìn)先出隊(duì)列調(diào)度方法;它先采用狀態(tài)掩碼表示任務(wù)列表中任務(wù)的就緒狀態(tài),而任務(wù)列表是用戶根據(jù)優(yōu)先級(jí)大小而順序列出的,然后利用移位比較的方法實(shí)現(xiàn)二分查找,快速定位最高優(yōu)先級(jí)任務(wù),調(diào)度器則據(jù)此進(jìn)行任務(wù)切換;整個(gè)過程以操作系統(tǒng)代碼的形式實(shí)現(xiàn),它依次含有以下步驟(1)設(shè)定操作系統(tǒng)代碼,它保存在MPC555控制器的存儲(chǔ)器中,包括如下部分系統(tǒng)啟動(dòng)代碼依次含有硬件初始化、初始化堆棧、初始化就緒任務(wù)列表以及開始調(diào)度的操作,在系統(tǒng)上電復(fù)位時(shí)自動(dòng)執(zhí)行;系統(tǒng)內(nèi)核操作代碼它支持搶占式調(diào)度,包括供系統(tǒng)啟動(dòng)代碼、用戶任務(wù)代碼、或中斷處理程序調(diào)用的激活任務(wù)、終止任務(wù)和調(diào)度器操作的代碼;所述的調(diào)度器操作代碼是指按照規(guī)定策略從就緒任務(wù)列表中選取一個(gè)用戶任務(wù)再跳轉(zhuǎn)到該任務(wù)執(zhí)行的操作;用戶任務(wù)代碼該由用戶自定義的用戶任務(wù)可以調(diào)用系統(tǒng)內(nèi)核操作去激活其它任務(wù)、申請(qǐng)調(diào)度或者終止自身的執(zhí)行;中斷處理程序操作代碼它依次含有中斷處理程序入口、用戶中斷服務(wù)程序和中斷處理程序結(jié)束三個(gè)部分;中斷服務(wù)調(diào)用系統(tǒng)內(nèi)核操作去激活新任務(wù);中斷處理的優(yōu)先級(jí)高于用戶任務(wù)優(yōu)先級(jí);就緒任務(wù)列表記錄當(dāng)前可以執(zhí)行的按照優(yōu)先級(jí)分類排列且以隊(duì)列形式出現(xiàn)的用戶任務(wù)信息,包括任務(wù)優(yōu)先級(jí)、用戶程序入口地址和用戶堆棧指針這三個(gè)數(shù)值;就緒態(tài)任務(wù)狀態(tài)掩碼用于標(biāo)記任務(wù)優(yōu)先級(jí)列隊(duì)的當(dāng)前狀態(tài),它是在操作系統(tǒng)生成時(shí),根據(jù)用戶配置的優(yōu)先級(jí)順序來分配狀態(tài)掩碼的,掩碼的每一個(gè)二進(jìn)制位標(biāo)識(shí)了一個(gè)優(yōu)先級(jí)狀態(tài),優(yōu)先級(jí)為n的任務(wù)對(duì)應(yīng)掩碼的第n位,當(dāng)該位為0時(shí),表示對(duì)應(yīng)優(yōu)先級(jí)的任務(wù)沒有就緒(或該優(yōu)先級(jí)任務(wù)列隊(duì)是空的),當(dāng)為1時(shí),表示對(duì)應(yīng)優(yōu)先級(jí)的任務(wù)已經(jīng)就緒(或該優(yōu)先級(jí)任務(wù)列隊(duì)中存在就緒任務(wù));(2)用二分查找法確定最高優(yōu)先級(jí)任務(wù)二分查找法中的查找目標(biāo),在這里定為所有就緒態(tài)任務(wù)代表的元素之和,即狀態(tài)掩碼值,優(yōu)先級(jí)為n的任務(wù)相當(dāng)于查找列表中值為2n的元素;當(dāng)就緒態(tài)的最高優(yōu)先級(jí)任務(wù)優(yōu)先級(jí)為k,則它代表的元素為2k,而所有就緒態(tài)任務(wù)代表的元素之和大于或等于2k,且小于2k+1,而二分查找的查找區(qū)間最后正好落到最高優(yōu)先級(jí)任務(wù)對(duì)應(yīng)的位置上;設(shè)定二分查找法的操作變量
當(dāng)前優(yōu)先級(jí)分布狀態(tài)掩碼的副本變量;二分增量變量,記錄每次循環(huán)比較的優(yōu)先級(jí)增量,它表示每次查找時(shí)子表的大小,初值為狀態(tài)掩碼位數(shù)的一半;比較因子變量,記錄每次循環(huán)生成的比較因子,它代表每次二分查找中所讀出的元素的值,初值為0;優(yōu)先級(jí)累加變量,其終值就是最高優(yōu)先級(jí)值,初值為0;它代表每次查找指針的位置,在每次循環(huán)比較時(shí),根據(jù)上一次比較的結(jié)果,它的值或者保持上一次取值,或者為自身上一次取值與二分增量變量取值累加的結(jié)果;過渡變量,生成比較因子時(shí)使用,初值為0;查找過程依次如下把CPU通用寄存器r27~r31中的數(shù)值保存在用戶堆棧中,而把這些寄存器作為上述各查找變量的存儲(chǔ)空間使用;以無(wú)符號(hào)數(shù)的形式把當(dāng)前的狀態(tài)掩碼值加載到優(yōu)先級(jí)狀態(tài)掩碼副本變量中;按以下步驟執(zhí)行循環(huán)比較過程首先把二分增量變量與優(yōu)先級(jí)累加變量的和放在過渡變量中,由過渡變量以2為底作乘冪而得到比較因子;再把比較因子與狀態(tài)掩碼值比較,若比較因子的值小于狀態(tài)掩碼值,則優(yōu)先級(jí)累加變量值設(shè)為過渡變量的當(dāng)前值,否則優(yōu)先級(jí)累加變量保持不變;把二分增量變量減半,重復(fù)以上比較過程,一直到二分增量為1無(wú)法再減半,此時(shí)優(yōu)先級(jí)累加變量中保存的值即為當(dāng)前最高的優(yōu)先級(jí)值;(3)獲取用戶任務(wù)信息以獲得的最高優(yōu)先級(jí)為索引,訪問就緒任務(wù)列表中的任務(wù)優(yōu)先級(jí)隊(duì)列,把該優(yōu)先級(jí)隊(duì)列中隊(duì)頭的元素取出,即得到應(yīng)該執(zhí)行的用戶任務(wù)信息;(4)任務(wù)切換調(diào)度器從目標(biāo)任務(wù)的用戶任務(wù)堆棧中讀取保存的運(yùn)行現(xiàn)場(chǎng)即CPU寄存器信息,把它們寫回到CPU寄存器中,然后跳轉(zhuǎn)到該用戶任務(wù)的代碼去執(zhí)行。
本發(fā)明使用簡(jiǎn)單的一級(jí)掩碼結(jié)構(gòu)而無(wú)需其它輔助結(jié)構(gòu),從而減少了存儲(chǔ)空間需求,使用高效的二分查找法并減少內(nèi)存訪問次數(shù),使調(diào)度延時(shí)穩(wěn)定,運(yùn)行高效,并且提高了靈活性。通過這些技術(shù)特點(diǎn)達(dá)到在滿足系統(tǒng)實(shí)時(shí)性要求的同時(shí)還節(jié)省了存儲(chǔ)空間的目的。
圖1二分查找法原理圖。
圖2清華OSEK操作系統(tǒng)簡(jiǎn)圖。
圖3就緒任務(wù)列表與任務(wù)狀態(tài)掩碼的對(duì)應(yīng)關(guān)系圖。
圖4調(diào)度器原理框圖。
圖5調(diào)度器在MPC555微控制器平臺(tái)上的實(shí)現(xiàn)流程圖。
圖6MPC555微控制器寄存器分類示意圖。
具體實(shí)施例方式
二分查找是一種常用的有序表查找方法。其原理見圖1。不失一般性,設(shè)列表中的元素按從大到小排列。二分查找法最開始對(duì)整個(gè)列表進(jìn)行查找。查找指針指向列表中點(diǎn)的元素,取該元素與目標(biāo)值即要查找的元素比較,若兩者恰好相等,則查找成功;若中點(diǎn)元素值小于目標(biāo)值,說明要查找的元素在表的前半部分,否則說明要查找的元素在表的后半部分。根據(jù)判斷結(jié)果,取列表的前半部分子表或者后半部分子表,將查找指針指向子表的中點(diǎn)元素重復(fù)上面的比較過程,直到查找成功或者列表已經(jīng)無(wú)法再拆分為止。二分查找對(duì)長(zhǎng)度為n的列表最多只需查找[log2(n+1)]([]表示向上取整)次,與順序查找最多需要n次相比,效率明顯提高。
本發(fā)明提出的方法是嵌入式實(shí)時(shí)操作系統(tǒng)內(nèi)核的一部分,以操作系統(tǒng)代碼的形式實(shí)現(xiàn)。下面以清華大學(xué)自主開發(fā)的清華OSEK(車用開放式系統(tǒng)及其接口規(guī)范)操作系統(tǒng)、基于MPC555微控制器的硬件平臺(tái)環(huán)境為例,說明該調(diào)度方法的實(shí)施方案。
運(yùn)行于MPC555平臺(tái)上的清華OSEK操作系統(tǒng)包括六部分啟動(dòng)代碼、系統(tǒng)內(nèi)核操作、用戶任務(wù)代碼、中斷處理程序、就緒任務(wù)列表及任務(wù)狀態(tài)掩碼。如附圖2所示。
MPC555微控制器的中斷向量表規(guī)定了多個(gè)程序入口地址。其中0x100是系統(tǒng)啟動(dòng)代碼的入口地址。啟動(dòng)代碼在系統(tǒng)上電復(fù)位時(shí)自動(dòng)執(zhí)行。第一步先進(jìn)行硬件初始化操作,即暫時(shí)禁止硬件中斷、設(shè)置系統(tǒng)時(shí)鐘頻率以及關(guān)閉軟件看門狗。這些操作的細(xì)節(jié)見表1說明。第二步操作是將堆棧指針寄存器和數(shù)據(jù)段基地址寄存器分別設(shè)置為系統(tǒng)堆棧和數(shù)據(jù)段的地址(具體數(shù)值由用戶指定)。第三步操作是將可以開始執(zhí)行的任務(wù)添加到就緒任務(wù)列表中并建立任務(wù)優(yōu)先級(jí)列隊(duì)和任務(wù)狀態(tài)掩碼(詳述見后)。最后,啟動(dòng)代碼打開硬件中斷開關(guān)允許硬件中斷,再執(zhí)行系統(tǒng)內(nèi)核操作中的調(diào)度器操作,開始執(zhí)行用戶任務(wù)。調(diào)度器根據(jù)本發(fā)明使用的方法從就緒列表中選擇用戶任務(wù)來執(zhí)行。
表1MPC555初始化過程主要硬件操作列表
系統(tǒng)內(nèi)核操作包括激活任務(wù)、終止任務(wù)和調(diào)度器三個(gè)操作。激活任務(wù)操作將一個(gè)用戶任務(wù)添加到就緒任務(wù)列表,終止任務(wù)操作將任務(wù)從就緒任務(wù)列表中刪除。調(diào)度器是任務(wù)切換機(jī)制的核心,按照一定的策略從就緒任務(wù)列表中選取一個(gè)用戶任務(wù),跳轉(zhuǎn)到該任務(wù)開始執(zhí)行。系統(tǒng)內(nèi)核操作代碼支持搶占式調(diào)度,即當(dāng)用戶任務(wù)代碼或者中斷處理程序調(diào)用系統(tǒng)內(nèi)核操作激活一個(gè)高優(yōu)先級(jí)的用戶任務(wù)的時(shí)候,激活任務(wù)操作可以調(diào)用調(diào)度器選擇新激活的任務(wù),強(qiáng)制打斷正在運(yùn)行的優(yōu)先級(jí)較低的用戶任務(wù),而轉(zhuǎn)到激活的任務(wù)去執(zhí)行。
中斷處理程序是操作系統(tǒng)中相對(duì)獨(dú)立的一部分,這部分代碼放在中斷處理程序入口地址處。它由系統(tǒng)中的硬件事件觸發(fā),何時(shí)執(zhí)行由運(yùn)行時(shí)的軟硬件狀態(tài)決定,在設(shè)計(jì)中無(wú)法預(yù)計(jì)。在MPC555微控制器中,外部中斷處理程序放在入口地址0x500處,計(jì)數(shù)器中斷處理程序放在入口地址0x900處。當(dāng)硬件產(chǎn)生中斷信號(hào)以后,CPU響應(yīng)中斷,自動(dòng)切換到相應(yīng)的入口地址執(zhí)行指令。中斷處理程序可以調(diào)用系統(tǒng)內(nèi)核操作,激活新任務(wù),從而打亂用戶任務(wù)執(zhí)行的流程。它依次含有中斷處理程序入口、用戶中斷服務(wù)程序和中斷處理程序結(jié)束三個(gè)部分。中斷處理的優(yōu)先級(jí)高于用戶任務(wù)優(yōu)先級(jí),由用戶中斷服務(wù)程序激活了的新任務(wù),只能等中斷處理程序結(jié)束后再通過調(diào)度器來執(zhí)行。具體體現(xiàn)在圖2的系統(tǒng)中,當(dāng)中斷處理程序調(diào)用“激活任務(wù)”的內(nèi)核操作時(shí),該內(nèi)核操作將不調(diào)用調(diào)度器,而是由中斷處理程序結(jié)束部分調(diào)用。
就緒任務(wù)列表記錄當(dāng)前可以執(zhí)行的用戶任務(wù)信息,包括任務(wù)優(yōu)先級(jí)、用戶程序入口地址、用戶堆棧指針。這三個(gè)數(shù)值最初均由用戶自行定義。在系統(tǒng)運(yùn)行過程中,用戶代碼或者操作系統(tǒng)代碼都可以修改用戶堆棧指針的值,從而達(dá)到在堆棧中保存或者恢復(fù)數(shù)據(jù)的目的。如果一個(gè)任務(wù)放在就緒任務(wù)列表中,稱這些任務(wù)處于就緒態(tài)。就緒列表由多個(gè)任務(wù)優(yōu)先級(jí)隊(duì)列組成,隊(duì)列的數(shù)目和優(yōu)先級(jí)數(shù)值的數(shù)目相同。用戶任務(wù)信息按照優(yōu)先級(jí)分類排列,每個(gè)優(yōu)先級(jí)的任務(wù)放在一個(gè)隊(duì)列中。任務(wù)優(yōu)先級(jí)列隊(duì)是一系列先進(jìn)先出(FIFO)隊(duì)列,每個(gè)優(yōu)先級(jí)分配一個(gè)隊(duì)列。當(dāng)執(zhí)行激活任務(wù)操作時(shí),系統(tǒng)內(nèi)核操作將該任務(wù)添加到就緒任務(wù)列表,并將它的任務(wù)編號(hào)添加到相應(yīng)優(yōu)先級(jí)的FIFO隊(duì)列中,然后進(jìn)行掩碼映射完成就序列表狀態(tài)到任務(wù)狀態(tài)掩碼的映射。
任務(wù)狀態(tài)掩碼用于標(biāo)記任務(wù)優(yōu)先級(jí)列隊(duì)的當(dāng)前狀態(tài)。在操作系統(tǒng)生成時(shí),根據(jù)用戶配置的最大優(yōu)先級(jí)分配狀態(tài)掩碼,掩碼的每一二進(jìn)制位標(biāo)識(shí)了一個(gè)優(yōu)先級(jí)狀態(tài),優(yōu)先級(jí)為n的任務(wù)對(duì)應(yīng)掩碼的的n位,當(dāng)該位為0時(shí),表示對(duì)應(yīng)優(yōu)先級(jí)的任務(wù)沒有就緒(或該優(yōu)先級(jí)任務(wù)列隊(duì)是空的),當(dāng)為1時(shí),表示對(duì)應(yīng)優(yōu)先級(jí)的任務(wù)已經(jīng)就緒(或該優(yōu)先級(jí)任務(wù)列隊(duì)中存在就緒任務(wù))。分配的掩碼位數(shù)為2的冪次,如果任務(wù)最大優(yōu)先級(jí)值在2n和2n+1之間,則分配2n+1位。當(dāng)用戶任務(wù)或中斷服務(wù)程序調(diào)用系統(tǒng)內(nèi)核操作激活任務(wù)時(shí),若某一優(yōu)先級(jí)任務(wù)列隊(duì)由空變?yōu)椴豢?,則激活任務(wù)操作將改優(yōu)先級(jí)對(duì)應(yīng)的掩碼置1。當(dāng)用戶任務(wù)結(jié)束時(shí),若該優(yōu)先級(jí)任務(wù)列隊(duì)變空,則終止任務(wù)操作將該優(yōu)先級(jí)對(duì)應(yīng)的掩碼清0。就緒任務(wù)列隊(duì)和任務(wù)狀態(tài)掩碼的對(duì)應(yīng)關(guān)系見圖3所示。
清華OSEK作為符合OSEK規(guī)范的操作系統(tǒng),具有如下特征每個(gè)任務(wù)用一個(gè)優(yōu)先級(jí)數(shù)值表示其重要程度。調(diào)度器選擇處于就緒任務(wù)列表中的最高優(yōu)先級(jí)的任務(wù)執(zhí)行。同一優(yōu)先級(jí)的任務(wù)遵從先進(jìn)先出的原則,即先加入就緒任務(wù)列表的任務(wù)優(yōu)先執(zhí)行。
支持搶占式調(diào)度,即一個(gè)優(yōu)先級(jí)高的用戶任務(wù)可以強(qiáng)制打斷一個(gè)優(yōu)先級(jí)低的用戶任務(wù)的執(zhí)行。
中斷處理程序優(yōu)先級(jí)高于用戶任務(wù)優(yōu)先級(jí)。在中斷處理程序中如果激活了新任務(wù),不能立刻進(jìn)行任務(wù)調(diào)度,而應(yīng)該等中斷處理程序結(jié)束后才進(jìn)行。所以,搶占式調(diào)度只發(fā)生在第一層中斷程序結(jié)束處。
在符合OSEK規(guī)范的操作系統(tǒng)中,選擇下一個(gè)任務(wù)來運(yùn)行有兩種情況。一種是由于用戶激活了比當(dāng)前任務(wù)的優(yōu)先級(jí)更高的任務(wù),在這種情況下,系統(tǒng)直接在這兩者之間進(jìn)行任務(wù)切換,任務(wù)切換的具體步驟在后面有詳細(xì)敘述。此時(shí),無(wú)需再考慮整個(gè)就緒任務(wù)列表的情況。另一種情況是由任務(wù)主動(dòng)申請(qǐng)調(diào)度或終止時(shí),或者中斷服務(wù)程序激活了新任務(wù)時(shí),或者由系統(tǒng)初始化代碼跳轉(zhuǎn)到用戶任務(wù)執(zhí)行時(shí),調(diào)度器要考慮整個(gè)就緒任務(wù)列表才能決定下一個(gè)運(yùn)行的任務(wù)。在本發(fā)明實(shí)現(xiàn)的系統(tǒng)中,對(duì)第一種情況的處理和目前其它操作系統(tǒng)的處理基本一致,也就是說,在圖2的系統(tǒng)中,用戶任務(wù)通過“激活任務(wù)”內(nèi)核操作調(diào)用調(diào)度器進(jìn)行任務(wù)調(diào)度時(shí),將不涉及本發(fā)明采用的方法。本發(fā)明實(shí)現(xiàn)的系統(tǒng)主要針對(duì)上述第二類情況進(jìn)行改進(jìn)。
本發(fā)明實(shí)現(xiàn)過程的原理框圖如圖4所示。調(diào)度器執(zhí)行有如下情況用戶任務(wù)直接調(diào)用調(diào)度器或者通過“終止任務(wù)”系統(tǒng)內(nèi)核操作調(diào)用調(diào)度器,或者中斷服務(wù)程序激活了新任務(wù)并在中斷處理結(jié)束時(shí)調(diào)用調(diào)度器,或者系統(tǒng)初始化代碼完成并準(zhǔn)備切換到用戶任務(wù)時(shí)調(diào)用調(diào)度器。在上述情況下,調(diào)度器按本發(fā)明實(shí)現(xiàn)的方法執(zhí)行。首先用二分查找法確定最高優(yōu)先級(jí)。這一步驟涉及的操作變量有優(yōu)先級(jí)狀態(tài)掩碼副本變量(加載系統(tǒng)當(dāng)前的優(yōu)先級(jí)分布狀態(tài)掩碼)、二分增量變量(記錄每次循環(huán)的優(yōu)先級(jí)增量)、比較因子變量(紀(jì)錄每次循環(huán)生成的比較因子)、優(yōu)先級(jí)累加變量(其累加結(jié)果為最高優(yōu)先級(jí)值)和過渡變量(生成比較因子時(shí)使用),在運(yùn)行中,系統(tǒng)將CPU通用寄存器r27~r31的原有數(shù)值放入用戶堆棧,而這幾個(gè)32位的通用寄存器分別作為上述變量的存儲(chǔ)空間使用。二分增量變量的初值為狀態(tài)掩碼位數(shù)的一半,其它變量初值均為0,然后以無(wú)符號(hào)數(shù)的形式將當(dāng)前的狀態(tài)掩碼值加載到優(yōu)先級(jí)狀態(tài)掩碼副本變量中,開始執(zhí)行循環(huán)比較過程首先將二分增量變量值與優(yōu)先級(jí)累加變量值的和放入過渡變量,由過渡變量以2為底乘冪得到比較因子,然后將比較因子與狀態(tài)掩碼值比較,如果其值小于狀態(tài)掩碼值,則優(yōu)先級(jí)累加變量值設(shè)為過渡變量的當(dāng)前取值,否則優(yōu)先級(jí)累加變量值保持不變,然后將二分增量變量值除二,重新生成比較因子,重復(fù)比較過程。例如對(duì)n個(gè)優(yōu)先級(jí)的系統(tǒng),二分增量變量的初值為n/2,由此得出第一輪比較的過渡變量為n/2,比較因子為2n/2,若該比較因子的值小于狀態(tài)掩碼值,則優(yōu)先級(jí)累加變量值設(shè)為n/2,二分增量減小為n/4,這樣第二輪生成的比較因子為2n/2+n/4,否則優(yōu)先級(jí)累加變量保持為0不變,二分增量減小為n/4,第二輪生成的比較因子就為2n/4=2n/2-n/4。上述過程一直重復(fù)到二分增量為1、不能再減半時(shí)結(jié)束。此時(shí),在優(yōu)先級(jí)累加變量中保存的值就是當(dāng)前最高的優(yōu)先級(jí)值。
上述過程是二分查找的一種變形。優(yōu)先級(jí)為n的任務(wù)相當(dāng)于列表中值為2n的元素。二分查找法中的查找目標(biāo),在這里定為所有就緒態(tài)任務(wù)代表的元素之和,即狀態(tài)掩碼值。假設(shè)處于就緒態(tài)的最高優(yōu)先級(jí)任務(wù)優(yōu)先級(jí)為k,則它代表的元素為2k,而所有就緒態(tài)任務(wù)代表的元素之和大于或等于2k,且小于2k+1,這樣,二分查找的查找區(qū)間最后正好落到最高優(yōu)先級(jí)任務(wù)對(duì)應(yīng)的位置上。查找過程沒有顯式的構(gòu)造查找列表,而只需用比較因子變量代表每次查找中所讀出的元素的值,用優(yōu)先級(jí)累加變量代表查找指針的位置,二分增量變量表示每次查找時(shí)子表的大小。每次比較時(shí),如果比較因子大于狀態(tài)掩碼,改變優(yōu)先級(jí)累加變量,相當(dāng)于取子表的前半部分繼續(xù)查找,否則相當(dāng)于取子表的后半部分查找。從而大大節(jié)省了占用的內(nèi)存空間。
得到當(dāng)前最高優(yōu)先級(jí)后,根據(jù)它來定位任務(wù)。以優(yōu)先級(jí)為索引進(jìn)行一次內(nèi)存尋址,就可以從就緒任務(wù)列表中定位到當(dāng)前最該運(yùn)行的任務(wù)列隊(duì),讀取隊(duì)首的用戶任務(wù)信息。
在系統(tǒng)獲得最高優(yōu)先級(jí)的任務(wù)信息后,進(jìn)行任務(wù)切換。任務(wù)切換是指在打斷當(dāng)前任務(wù)而轉(zhuǎn)到另一個(gè)任務(wù)執(zhí)行時(shí),將被打斷的任務(wù)運(yùn)行現(xiàn)場(chǎng)即CPU的寄存器保存到用戶預(yù)留的內(nèi)存空間即用戶堆棧中,在恢復(fù)到該用戶任務(wù)執(zhí)行時(shí),將保存的內(nèi)容重新寫入CPU寄存器,這樣,用戶任務(wù)可以像沒有被間斷過一樣正常運(yùn)行。MPC555微控制器屬于PowerPC結(jié)構(gòu)的處理器,其寄存器全集見圖6,其中,用戶程序運(yùn)行需要保存的寄存器如表2所示。
在PowerPC處理器結(jié)構(gòu)中,LR保存函數(shù)調(diào)用時(shí)的返回地址,MSR保存程序運(yùn)行過程的處理器配置狀態(tài),SRR0保存中斷結(jié)束后的返回地址,SRR1保存中斷發(fā)生時(shí)的MSR狀態(tài),CR、XER保存整數(shù)運(yùn)算、邏輯運(yùn)算和浮點(diǎn)運(yùn)算指令設(shè)置的標(biāo)志位,CTR用于程序循環(huán)計(jì)數(shù)。這些寄存器是程序運(yùn)行過程必不可少的。因此,一段程序如果被打斷后恢復(fù)執(zhí)行,必須恢復(fù)這些寄存器原來的狀態(tài),才能使程序運(yùn)行正常。通用寄存器r0~r31中,r1為堆棧指針,r2、r13為系統(tǒng)小數(shù)據(jù)段的基地址,這幾個(gè)寄存器的內(nèi)容不會(huì)被用戶任務(wù)破壞。r0、r3~r12用于函數(shù)調(diào)用時(shí)傳入和返回參數(shù),r14~r31用于保存臨時(shí)變量,用戶任務(wù)要正常運(yùn)行必須保證這些寄存器被正確保持和恢復(fù)。
表2PowerPC結(jié)構(gòu)處理器主要寄存器列表
按照PowerPC-EABI規(guī)范(基于PowerPC結(jié)構(gòu)的嵌入式系統(tǒng)代碼接口規(guī)范),通用寄存器r1在操作系統(tǒng)中作為當(dāng)前任務(wù)的堆棧的指針,又稱為堆棧寄存器,簡(jiǎn)稱SP。
在用戶任務(wù)激活被打斷或者申請(qǐng)調(diào)度的時(shí)候,激活任務(wù)操作或者調(diào)度器將SP指向用戶堆棧,并將堆棧指針上移保存CPU現(xiàn)場(chǎng)所需空間,然后將用戶任務(wù)現(xiàn)場(chǎng)保存在該內(nèi)存空間內(nèi);在決定切換到該任務(wù)執(zhí)行時(shí),調(diào)度器將原先保存在用戶堆棧中的用戶任務(wù)現(xiàn)場(chǎng)裝到CPU相應(yīng)的寄存器中,然后將堆棧指針下移同樣的空間,此時(shí)SRR0寄存器中記錄了用戶任務(wù)代碼應(yīng)該開始或者繼續(xù)執(zhí)行的位置,調(diào)度器執(zhí)行rfi指令,就跳轉(zhuǎn)到用戶任務(wù)代碼中執(zhí)行。
本發(fā)明軟件程序?qū)崿F(xiàn)的流程圖如圖5所示。
系統(tǒng)實(shí)現(xiàn)后,我們對(duì)該調(diào)度方法在MPC555評(píng)估系統(tǒng)運(yùn)行于40M的時(shí)鐘頻率下進(jìn)行了測(cè)試,尋找最高優(yōu)先級(jí)的過程所需要的時(shí)間穩(wěn)定在2.5μS,比遍歷就緒任務(wù)列隊(duì)法即高效又穩(wěn)定。在存儲(chǔ)需求方面更突出,只需要4個(gè)字節(jié),與兩級(jí)分組映射的方法龐大的存儲(chǔ)需求對(duì)比,該方法既節(jié)省存儲(chǔ)空間,又靈活方便。
在對(duì)n個(gè)優(yōu)先級(jí)的系統(tǒng),采用本發(fā)明方法的需要的最大查找次數(shù)為[log2(n+1)]次,而采用順序遍歷法需要的最大查找次數(shù)為n次,本發(fā)明方法在算法復(fù)雜度上明顯優(yōu)于順序遍歷法,而稍遜于μC/OS-II操作系統(tǒng)采用的兩級(jí)分組映射法(不論優(yōu)先級(jí)多少,均只需兩次查表操作)。但是,本發(fā)明方法在存儲(chǔ)空間占用上大大低于兩級(jí)分組映射法。例如對(duì)32個(gè)優(yōu)先級(jí)的系統(tǒng),本發(fā)明方法只需用4個(gè)字節(jié)(32個(gè)二進(jìn)制位)表示狀態(tài)掩碼。而兩級(jí)分組映射法需要以8個(gè)優(yōu)先級(jí)為一組建立映射表,第一級(jí)掩碼需要1個(gè)字節(jié),映射表需要4個(gè)字節(jié),第二級(jí)掩碼需要8個(gè)字節(jié),映射表需要28=256個(gè)字節(jié),總共需要269個(gè)字節(jié)。具體比較結(jié)果見表3。此外,與分組映射法相比,本發(fā)明方法采用的掩碼結(jié)構(gòu)更加簡(jiǎn)單,因而在操作系統(tǒng)動(dòng)態(tài)改變?nèi)蝿?wù)優(yōu)先級(jí)的情況下,改變狀態(tài)掩碼所需的操作比分組映射法要少得多??梢?,本發(fā)明方法具有更好的綜合性能。
表3幾種調(diào)度實(shí)現(xiàn)方法的時(shí)間和空間效率比較(以32個(gè)優(yōu)先級(jí)為例)
權(quán)利要求
1.嵌入式實(shí)時(shí)操作系統(tǒng)的二分查找式任務(wù)調(diào)度方法,包括就緒任務(wù)隊(duì)列的查找方法,其特征在于它是一種當(dāng)任務(wù)主動(dòng)申請(qǐng)調(diào)度或終止時(shí),或者中斷服務(wù)程序激活了新任務(wù)時(shí),針對(duì)PowerPC處理器且基于優(yōu)先級(jí)的先進(jìn)先出隊(duì)列調(diào)度方法;它先采用狀態(tài)掩碼表示任務(wù)列表中任務(wù)的就緒狀態(tài),而任務(wù)列表是用戶根據(jù)優(yōu)先級(jí)大小而順序列出的,然后利用移位比較的方法實(shí)現(xiàn)二分查找,快速定位最高優(yōu)先級(jí)任務(wù),調(diào)度器則據(jù)此進(jìn)行任務(wù)切換;整個(gè)過程以操作系統(tǒng)代碼的形式實(shí)現(xiàn),它依次含有以下步驟(1)設(shè)定操作系統(tǒng)代碼,它保存在MPC555控制器的存儲(chǔ)器中,包括如下部分系統(tǒng)啟動(dòng)代碼依次含有硬件初始化、初始化堆棧、初始化就緒任務(wù)列表以及開始調(diào)度的操作,在系統(tǒng)上電復(fù)位時(shí)自動(dòng)執(zhí)行;系統(tǒng)內(nèi)核操作代碼它支持搶占式調(diào)度,包括供系統(tǒng)啟動(dòng)代碼、用戶任務(wù)代碼、或中斷處理程序調(diào)用的激活任務(wù)、終止任務(wù)和調(diào)度器操作的代碼;所述的調(diào)度器操作代碼是指按照規(guī)定策略從就緒任務(wù)列表中選取一個(gè)用戶任務(wù)再跳轉(zhuǎn)到該任務(wù)執(zhí)行的操作;用戶任務(wù)代碼該由用戶自定義的用戶任務(wù)可以調(diào)用系統(tǒng)內(nèi)核操作去激活其它任務(wù)、申請(qǐng)調(diào)度或者終止自身的執(zhí)行;中斷處理程序操作代碼它依次含有中斷處理程序入口、用戶中斷服務(wù)程序和中斷處理程序結(jié)束三個(gè)部分;中斷服務(wù)調(diào)用系統(tǒng)內(nèi)核操作去激活新任務(wù);中斷處理的優(yōu)先級(jí)高于用戶任務(wù)優(yōu)先級(jí);就緒任務(wù)列表記錄當(dāng)前可以執(zhí)行的按照優(yōu)先級(jí)分類排列且以隊(duì)列形式出現(xiàn)的用戶任務(wù)信息,包括任務(wù)優(yōu)先級(jí)、用戶程序入口地址和用戶堆棧指針這三個(gè)數(shù)值;就緒態(tài)任務(wù)狀態(tài)掩碼用于標(biāo)記任務(wù)優(yōu)先級(jí)列隊(duì)的當(dāng)前狀態(tài),它是在操作系統(tǒng)生成時(shí),根據(jù)用戶配置的優(yōu)先級(jí)順序來分配狀態(tài)掩碼的,掩碼的每一個(gè)二進(jìn)制位標(biāo)識(shí)了一個(gè)優(yōu)先級(jí)狀態(tài),優(yōu)先級(jí)為n的任務(wù)對(duì)應(yīng)掩碼的第n位,當(dāng)該位為0時(shí),表示對(duì)應(yīng)優(yōu)先級(jí)的任務(wù)沒有就緒(或該優(yōu)先級(jí)任務(wù)列隊(duì)是空的),當(dāng)為1時(shí),表示對(duì)應(yīng)優(yōu)先級(jí)的任務(wù)已經(jīng)就緒(或該優(yōu)先級(jí)任務(wù)列隊(duì)中存在就緒任務(wù));(2)用二分查找法確定最高優(yōu)先級(jí)任務(wù)二分查找法中的查找目標(biāo),在這里定為所有就緒態(tài)任務(wù)代表的元素之和,即狀態(tài)掩碼值,優(yōu)先級(jí)為n的任務(wù)相當(dāng)于查找列表中值為2n的元素;當(dāng)就緒態(tài)的最高優(yōu)先級(jí)任務(wù)優(yōu)先級(jí)為k,則它代表的元素為2k,而所有就緒態(tài)任務(wù)代表的元素之和大于或等于2k,且小于2k+1,而二分查找的查找區(qū)間最后正好落到最高優(yōu)先級(jí)任務(wù)對(duì)應(yīng)的位置上;設(shè)定二分查找法的操作變量當(dāng)前優(yōu)先級(jí)分布狀態(tài)掩碼的副本變量;二分增量變量,記錄每次循環(huán)比較的優(yōu)先級(jí)增量,它表示每次查找時(shí)子表的大小,初值為狀態(tài)掩碼位數(shù)的一半;比較因子變量,記錄每次循環(huán)生成的比較因子,它代表每次二分查找中所讀出的元素的值,初值為0;優(yōu)先級(jí)累加變量,其終值就是最高優(yōu)先級(jí)值,初值為0;它代表每次查找指針的位置,在每次循環(huán)比較時(shí),根據(jù)上一次比較的結(jié)果,它的值或者保持上一次取值,或者為自身上一次取值與二分增量變量取值累加的結(jié)果;過渡變量,生成比較因子時(shí)使用,初值為0;查找過程依次如下把CPU通用寄存器r27~r31中的數(shù)值保存在用戶堆棧中,而把這些寄存器作為上述各查找變量的存儲(chǔ)空間使用;以無(wú)符號(hào)數(shù)的形式把當(dāng)前的狀態(tài)掩碼值加載到優(yōu)先級(jí)狀態(tài)掩碼副本變量中;按以下步驟執(zhí)行循環(huán)比較過程首先把二分增量變量與優(yōu)先級(jí)累加變量的和放在過渡變量中,由過渡變量以2為底作乘冪而得到比較因子;再把比較因子與狀態(tài)掩碼值比較,若比較因子的值小于狀態(tài)掩碼值,則優(yōu)先級(jí)累加變量值設(shè)為過渡變量的當(dāng)前值,否則優(yōu)先級(jí)累加變量保持不變;把二分增量變量減半,重復(fù)以上比較過程,一直到二分增量為1無(wú)法再減半,此時(shí)優(yōu)先級(jí)累加變量中保存的值即為當(dāng)前最高的優(yōu)先級(jí)值;(3)獲取用戶任務(wù)信息以獲得的最高優(yōu)先級(jí)為索引,訪問就緒任務(wù)列表中的任務(wù)優(yōu)先級(jí)隊(duì)列,把該優(yōu)先級(jí)隊(duì)列中隊(duì)頭的元素取出,即得到應(yīng)該執(zhí)行的用戶任務(wù)信息;(4)任務(wù)切換調(diào)度器從目標(biāo)任務(wù)的用戶任務(wù)堆棧中讀取保存的運(yùn)行現(xiàn)場(chǎng)即CPU寄存器信息,把它們寫回到CPU寄存器中,然后跳轉(zhuǎn)到該用戶任務(wù)的代碼去執(zhí)行。
全文摘要
嵌入式實(shí)時(shí)操作系統(tǒng)的二分查找式任務(wù)調(diào)度方法屬于車用嵌入式實(shí)時(shí)操作系統(tǒng)領(lǐng)域,其特征在于先采用狀態(tài)掩碼表示用戶按優(yōu)先級(jí)高低順序排列的任務(wù)列表中任務(wù)的就緒狀態(tài),然后利用移位比較實(shí)現(xiàn)二分查找,快速定位最高優(yōu)先級(jí)任務(wù),調(diào)度器則據(jù)此進(jìn)行任務(wù)調(diào)度和切換。它用簡(jiǎn)單的一級(jí)掩碼表示就緒態(tài)任務(wù)的優(yōu)先級(jí)分布狀態(tài),利用二分查找提高了定位最高優(yōu)先級(jí)任務(wù)的效率,并在代碼實(shí)現(xiàn)上減少訪問內(nèi)存次數(shù)。具有調(diào)度延時(shí)穩(wěn)定,效率高,存儲(chǔ)空間少的優(yōu)點(diǎn)。它作為清華汽車電子開放式系統(tǒng)(清華OSEK)的一部分,已在MPC555硬件平臺(tái)上實(shí)現(xiàn)。
文檔編號(hào)G06F9/445GK1529233SQ20031010046
公開日2004年9月15日 申請(qǐng)日期2003年10月17日 優(yōu)先權(quán)日2003年10月17日
發(fā)明者孫曉民, 蔡云鵬 申請(qǐng)人:清華大學(xué)