專(zhuān)利名稱(chēng):一種微嵌入式實(shí)時(shí)任務(wù)調(diào)度器及調(diào)度方法
技術(shù)領(lǐng)域:
本發(fā)明涉及工業(yè)控制網(wǎng)絡(luò)及智能儀器儀表控制等相關(guān)領(lǐng)域。
背景技術(shù):
在工業(yè)控制領(lǐng)域和儀器儀表行業(yè)中, 一些控制器和儀表正向數(shù)字化、網(wǎng) 絡(luò)化、智能化方向發(fā)展,中低端儀器儀表在軟件開(kāi)發(fā)過(guò)程中存在傳統(tǒng)的超循 環(huán)編程方式,具有效率低、帶碼可移植性和重用性差等缺點(diǎn),因此,迫切要 求采用具有任務(wù)調(diào)度功能的調(diào)度器或操作系統(tǒng)來(lái)改變以前順序執(zhí)行的超循環(huán) 調(diào)用方式,以滿足資源管理和系統(tǒng)的實(shí)時(shí)要求。
同時(shí),常用的嵌入式操作系統(tǒng)由于內(nèi)核大、任務(wù)調(diào)度處理過(guò)于復(fù)雜、實(shí) 時(shí)性等方面不能很好地適用智能儀器儀表小內(nèi)核、高實(shí)時(shí)、高可靠、低功耗
的要求。常見(jiàn)的一些嵌入式操作系統(tǒng)如嵌入式linux由于其內(nèi)核大、功能強(qiáng) 等特點(diǎn)一般用于功能較復(fù)雜的場(chǎng)合,如多媒體控制器、手持設(shè)備、交換機(jī)等。 ucos-ii操作系統(tǒng)多用于控制、通信等設(shè)備中,但其調(diào)度復(fù)雜,造成最小內(nèi)核 大。這些常見(jiàn)的嵌入式操作系統(tǒng)普遍存在核心調(diào)度器復(fù)雜、調(diào)度方式不靈活 等不足。同時(shí)大多數(shù)嵌入式操作系統(tǒng)在使用時(shí)都需要交納一定數(shù)額的費(fèi)用, 這對(duì)一些本身成本較低的控制設(shè)備來(lái)說(shuō)是不能接受的。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問(wèn)題是針對(duì)現(xiàn)有嵌入式操作系統(tǒng)普遍存在核心 調(diào)度器復(fù)雜、最小內(nèi)核較大,調(diào)度方式不靈活等缺陷,設(shè)計(jì)開(kāi)發(fā)了一種實(shí)時(shí) 性強(qiáng)、調(diào)度簡(jiǎn)單、內(nèi)核小、成本低的嵌入式任務(wù)調(diào)度器,以及實(shí)時(shí)任務(wù)調(diào)度方法。
本發(fā)明設(shè)計(jì)的嵌入式任務(wù)調(diào)度器主要包括任務(wù)控制模塊、任務(wù)調(diào)度算法 模塊、時(shí)鐘驅(qū)動(dòng)調(diào)度模塊、事件機(jī)制控制模塊等核心模塊。
任務(wù)控制模塊定義任務(wù)調(diào)度相關(guān)的堆棧指針、任務(wù)狀態(tài)、優(yōu)先級(jí)、任 務(wù)入口地址和任務(wù)加鎖標(biāo)志等任務(wù)屬性以及任務(wù)就緒表,通過(guò)任務(wù)狀態(tài)字描 述任務(wù)的狀態(tài),描述延時(shí)節(jié)拍以及任務(wù)就緒表。
任務(wù)調(diào)度算法模塊規(guī)定任務(wù)各種狀態(tài)切換的條件,任務(wù)調(diào)度觸發(fā)方式。任務(wù)調(diào)度觸發(fā)方式主要有六種任務(wù)延時(shí)、事件等待、任務(wù)掛起、事件觸發(fā)、 任務(wù)激活、中斷,每個(gè)任務(wù)必須調(diào)用除中斷外的任何一個(gè)或一個(gè)以上的任務(wù) 調(diào)度觸發(fā)方式。通過(guò)這六種觸發(fā)方式使任務(wù)調(diào)度變得簡(jiǎn)單快捷,提高了實(shí)時(shí) 性,同時(shí)也精簡(jiǎn)了內(nèi)核。
時(shí)鐘驅(qū)動(dòng)調(diào)度模塊采用時(shí)鐘定時(shí)中斷的方式實(shí)現(xiàn)任務(wù)的定時(shí)切換,根
據(jù)任務(wù)優(yōu)先級(jí)分配每個(gè)任務(wù)執(zhí)行的先后順序,調(diào)度函數(shù)査找就緒表中優(yōu)先級(jí)
最高的任務(wù)進(jìn)入運(yùn)行態(tài)。設(shè)定每個(gè)任務(wù)執(zhí)行的周期,根據(jù)任務(wù)優(yōu)先級(jí)來(lái)分配
執(zhí)行的先后順序。每個(gè)時(shí)鐘中斷產(chǎn)生時(shí),比較是否任務(wù)加鎖,如果任務(wù)未加
鎖則進(jìn)行一次調(diào)度,就緒表中處于就緒態(tài)的最高優(yōu)先級(jí)任務(wù)獲得CPU控制權(quán),
如果任務(wù)加鎖,當(dāng)該任務(wù)運(yùn)行任務(wù)解鎖時(shí),才產(chǎn)生調(diào)度。這樣既保證了每個(gè)
任務(wù)得到執(zhí)行,又可以根據(jù)具體需要設(shè)定每個(gè)任務(wù)執(zhí)行的周期,提高了任務(wù)
的實(shí)時(shí)性。
事件機(jī)制控制模塊定義任務(wù)事件的結(jié)構(gòu)形式,實(shí)現(xiàn)任務(wù)事件在任務(wù)調(diào) 度中的實(shí)現(xiàn)方式等。任務(wù)事件由一個(gè)結(jié)構(gòu)體來(lái)定義,包括事件等待任務(wù)名稱(chēng)、 事件狀態(tài)標(biāo)志、事件值指針、事件值長(zhǎng)度等。事件機(jī)制控制包括等待事件和 觸發(fā)事件,等待事件設(shè)置任務(wù)為掛起狀態(tài),產(chǎn)生調(diào)度;激活事件設(shè)置等待任 務(wù)狀態(tài)為就緒態(tài),產(chǎn)生調(diào)度。
同時(shí)該調(diào)度器還設(shè)置任務(wù)搶占機(jī)制,當(dāng)中斷產(chǎn)生時(shí),調(diào)度程序根據(jù)就緒 表中處于最高優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí)和當(dāng)前任務(wù)優(yōu)先級(jí)的高低以及加鎖標(biāo)志來(lái) 確定是否進(jìn)行調(diào)度。如果當(dāng)前任務(wù)的優(yōu)先級(jí)低于就緒表中的就緒態(tài)任務(wù)優(yōu)先 級(jí)且加鎖標(biāo)志為無(wú)效,則進(jìn)行調(diào)度。否則不進(jìn)行調(diào)度。這樣保證了系統(tǒng)運(yùn)行 的實(shí)時(shí)性和可靠性。
本發(fā)明還提出一種微嵌入式實(shí)時(shí)任務(wù)調(diào)度方法,該方法具體包括,首先 創(chuàng)建任務(wù),初始化任務(wù)控制模塊;就緒表中最高優(yōu)先級(jí)任務(wù)獲得運(yùn)行權(quán),進(jìn) 入主函數(shù)的空循環(huán)等待時(shí)鐘中斷產(chǎn)生任務(wù)調(diào)度,任務(wù)調(diào)度算法模塊的調(diào)度函 數(shù)根據(jù)任務(wù)控制模塊中的任務(wù)入口地址進(jìn)入任務(wù)運(yùn)行,當(dāng)任務(wù)進(jìn)入系統(tǒng)延時(shí)、
任務(wù)掛起、事件等待之一時(shí),運(yùn)行任務(wù)讓出CPU控制權(quán)進(jìn)入掛起或等待狀態(tài);當(dāng)任務(wù)系統(tǒng)延時(shí)結(jié)束、任務(wù)被其他任務(wù)激活或等待事件產(chǎn)生有效等情況之一 發(fā)生時(shí),任務(wù)控制模塊控制任務(wù)由其他狀態(tài)進(jìn)入就緒狀態(tài);當(dāng)中斷服務(wù)程序 結(jié)束,任務(wù)調(diào)度算法模塊的調(diào)度函數(shù)先檢査被中斷任務(wù)是否加鎖,如果加鎖 則直接返回任務(wù);如果未加鎖,調(diào)度函數(shù)檢測(cè)就緒表中是否存在優(yōu)先級(jí)更高 的就緒任務(wù),如果有優(yōu)先級(jí)更高的就緒任務(wù),調(diào)度函數(shù)將當(dāng)前任務(wù)狀態(tài)進(jìn)行 壓棧保護(hù),然后調(diào)用任務(wù)級(jí)任務(wù)切換函數(shù)進(jìn)行任務(wù)調(diào)度,執(zhí)行完任務(wù)調(diào)度后, 恢復(fù)被中斷任務(wù)狀態(tài),繼續(xù)運(yùn)行被中斷任務(wù)。
調(diào)度產(chǎn)生的條件主要有以下六種①當(dāng)任務(wù)進(jìn)入系統(tǒng)延時(shí)時(shí),系統(tǒng)延時(shí) 函數(shù)根據(jù)時(shí)鐘驅(qū)動(dòng)模塊中的時(shí)鐘節(jié)拍設(shè)置當(dāng)前任務(wù)控制塊中的狀態(tài)標(biāo)志,任 務(wù)進(jìn)入延時(shí)等待狀態(tài),然后調(diào)用任務(wù)調(diào)度算法模塊中調(diào)度函數(shù)進(jìn)行調(diào)度。② 當(dāng)任務(wù)控制模塊中的事件等待函數(shù)進(jìn)入等待事件產(chǎn)生時(shí),事件等待函數(shù)中設(shè) 置當(dāng)前任務(wù)狀態(tài)標(biāo)志,任務(wù)進(jìn)入掛起狀態(tài),然后調(diào)用調(diào)度函數(shù)進(jìn)行調(diào)度。③ 當(dāng)任務(wù)完成當(dāng)前操作,暫時(shí)不執(zhí)行其他操作時(shí),調(diào)用掛起函數(shù)設(shè)置當(dāng)前任務(wù) 狀態(tài)標(biāo)志,任務(wù)進(jìn)入掛起狀態(tài),然后調(diào)用調(diào)度函數(shù)進(jìn)行調(diào)度。④當(dāng)系統(tǒng)時(shí)鐘 中斷延時(shí)完成時(shí)產(chǎn)生時(shí)鐘中斷,時(shí)鐘驅(qū)動(dòng)調(diào)度模塊在時(shí)鐘中斷服務(wù)程序中將 各個(gè)延時(shí)任務(wù)的狀態(tài)標(biāo)志大于l的減l,比較是否存在延時(shí)結(jié)束任務(wù),如果存 在,表示該任務(wù)的狀態(tài)進(jìn)入就緒態(tài),比當(dāng)前任務(wù)優(yōu)先級(jí)更高的就緒任務(wù),如 果有,進(jìn)行調(diào)度;在其他中斷產(chǎn)生后,先運(yùn)行中斷服務(wù)程序,然后比較被中 斷任務(wù)是否加鎖,如果未加鎖,則進(jìn)行調(diào)度。⑤當(dāng)掛起任務(wù)等待的事件產(chǎn)生 或被其他任務(wù)激活時(shí),其狀態(tài)變量被設(shè)置為就緒態(tài),然后進(jìn)行調(diào)度。⑥任務(wù) 運(yùn)行到某個(gè)時(shí)刻,需要激活被掛起任務(wù)時(shí),事件機(jī)制控制模塊調(diào)用激活任務(wù) 函數(shù),然后調(diào)用調(diào)度函數(shù)進(jìn)行調(diào)度。
由于在任務(wù)控制模塊、調(diào)度算法、調(diào)度機(jī)制等方面采用了更有效的實(shí)現(xiàn) 方法,既保證系統(tǒng)運(yùn)行的實(shí)時(shí)性和可靠性,又減小了調(diào)度器的內(nèi)核大小,在 保證系統(tǒng)要求的前提下使得調(diào)度器的成本遠(yuǎn)低于操作系統(tǒng)的成本。
本發(fā)明解決了工業(yè)現(xiàn)場(chǎng)設(shè)備和中低端儀器儀表對(duì)操作系統(tǒng)高實(shí)時(shí)、小內(nèi) 核、低成本的要求。和現(xiàn)行的常用嵌入式操作系統(tǒng)相比,該調(diào)度器可以方便 的移植到各種8位、16位單片機(jī)上,創(chuàng)建任務(wù)方便,內(nèi)核可以減少2KB以內(nèi), 任務(wù)切換可以達(dá)到5us以內(nèi),能夠滿足這些設(shè)備的要求,并大大降低了硬件成本和軟件成本。和傳統(tǒng)的超循環(huán)方式編程相比,由于采用了調(diào)度器,不同 功能的模塊可以用不同任務(wù)來(lái)管理,在產(chǎn)品換代或系統(tǒng)更新時(shí),可以快速方 便地將原來(lái)的代碼移植到新的系統(tǒng)或產(chǎn)品上。
圖1本發(fā)明調(diào)度器總體控制流程圖
圖2任務(wù)調(diào)度算法狀態(tài)描述示意圖
圖3任務(wù)切換示意圖
圖4時(shí)鐘中斷任務(wù)切換流程圖
具體實(shí)施例方式
本發(fā)明針對(duì)微嵌入式實(shí)時(shí)任務(wù)調(diào)度器的多任務(wù)、實(shí)時(shí)性、小內(nèi)核的要求, 設(shè)計(jì)了調(diào)度器的核心數(shù)據(jù)結(jié)構(gòu)、任務(wù)調(diào)度算法、事件機(jī)制、調(diào)度算法的時(shí)鐘 驅(qū)動(dòng)調(diào)度。
1. 多任務(wù)針對(duì)多任務(wù)要求,本發(fā)明采用常見(jiàn)的4種任務(wù)狀態(tài)就緒狀 態(tài)、運(yùn)行狀態(tài)、等待狀態(tài)和掛起狀態(tài)。就緒狀態(tài)描述的是等待運(yùn)行的任務(wù)狀 態(tài);運(yùn)行態(tài)描述了任務(wù)正在運(yùn)行的狀態(tài);等待狀態(tài)描述了任務(wù)處于延時(shí)等待 的狀態(tài);掛起態(tài)描述任務(wù)當(dāng)前操作完成或正在等待事件產(chǎn)生的狀態(tài)。在調(diào)度 過(guò)程中,通過(guò)對(duì)任務(wù)控制塊中任務(wù)狀態(tài)字的設(shè)置來(lái)標(biāo)志任務(wù)狀態(tài),調(diào)度器通 過(guò)檢測(cè)任務(wù)狀態(tài)字來(lái)確定任務(wù)的調(diào)度。
2. 實(shí)時(shí)性針對(duì)實(shí)時(shí)性要求,本發(fā)明采用精簡(jiǎn)內(nèi)核代碼、可剝奪式內(nèi)核 和中斷相結(jié)合的方式來(lái)實(shí)現(xiàn)實(shí)時(shí)性要求。精簡(jiǎn)內(nèi)核使執(zhí)行的時(shí)間減少,可剝 奪內(nèi)核保證了實(shí)時(shí)性較高的任務(wù)優(yōu)先執(zhí)行的要求,中斷保證了硬件實(shí)時(shí)通信。 通過(guò)設(shè)置實(shí)時(shí)性要求較高的任務(wù)為更高優(yōu)先級(jí),時(shí)鐘中斷產(chǎn)生時(shí),比較當(dāng)前 任務(wù)和就緒態(tài)的其他任務(wù)的優(yōu)先級(jí),如果有更高優(yōu)先級(jí)的任務(wù)處于就緒態(tài), 就進(jìn)行任務(wù)切換。同時(shí)通過(guò)中斷來(lái)響應(yīng)外部信號(hào)。這樣可滿足工業(yè)控制器及 儀器儀表的實(shí)時(shí)性的需要。
3. 小內(nèi)核為了解決內(nèi)核大小問(wèn)題,本發(fā)明采用單任務(wù)隊(duì)列,通過(guò)精簡(jiǎn) 任務(wù)控制塊,采用一個(gè)狀態(tài)字描述就緒、掛起和延時(shí)節(jié)拍計(jì)數(shù)三種狀態(tài)的方 式減少任務(wù)執(zhí)行代碼,通過(guò)事件來(lái)實(shí)現(xiàn)任務(wù)間的基本通信,精簡(jiǎn)調(diào)度算法減少內(nèi)核代碼,以實(shí)現(xiàn)小內(nèi)核的要求。
4.調(diào)度鎖針對(duì)一些任務(wù)要求執(zhí)行過(guò)程中不能被其他任務(wù)中斷,本發(fā)明 在任務(wù)控制塊中加入調(diào)度鎖標(biāo)志,在中斷服務(wù)程序執(zhí)行完成后,檢査被中斷 任務(wù)是否加鎖,如果加鎖不進(jìn)行調(diào)度,直接返回被中斷任務(wù)。保證個(gè)別任務(wù) 執(zhí)行的高可靠性和高實(shí)時(shí)性。用戶可以根據(jù)具體需要在任務(wù)中進(jìn)行加鎖或解 鎖,加鎖和解鎖在每個(gè)任務(wù)中必須是成對(duì)出現(xiàn)。在調(diào)用事件等待/觸發(fā)函數(shù)、 延時(shí)函數(shù)、任務(wù)掛起/激活函數(shù)之前必須解鎖。
下面針對(duì)附圖和具體實(shí)施方式
對(duì)本發(fā)明的實(shí)施作進(jìn)一步的說(shuō)明。
該嵌入式實(shí)時(shí)任務(wù)調(diào)度器包括,任務(wù)控制模塊、任務(wù)調(diào)度算法模塊、時(shí) 鐘驅(qū)動(dòng)調(diào)度模塊、事件機(jī)制控制模塊。任務(wù)控制模塊定義任務(wù)調(diào)度相關(guān)的堆 棧指針、任務(wù)狀態(tài)、任務(wù)優(yōu)先級(jí)、任務(wù)入口地址和任務(wù)加鎖標(biāo)志以及任務(wù)就 緒表,通過(guò)任務(wù)狀態(tài)字描述任務(wù)狀態(tài)、延時(shí)節(jié)拍以及任務(wù)就緒表;任務(wù)調(diào)度 算法模塊通過(guò)調(diào)度函數(shù)描述任務(wù)狀態(tài)切換的各種條件,任務(wù)調(diào)度機(jī)制,每 個(gè)任務(wù)調(diào)用除中斷外的任何一個(gè)或幾個(gè)觸發(fā)方式,任務(wù)調(diào)度器才進(jìn)行調(diào)度; 時(shí)鐘驅(qū)動(dòng)調(diào)度模塊采用時(shí)鐘定時(shí)中斷的方式實(shí)現(xiàn)任務(wù)的定時(shí)切換,根據(jù)任 務(wù)優(yōu)先級(jí)分配每個(gè)任務(wù)執(zhí)行的先后順序,調(diào)度切換執(zhí)行優(yōu)先級(jí)最高的就緒任 務(wù);事件機(jī)制控制模塊定義任務(wù)事件的結(jié)構(gòu)形式,實(shí)現(xiàn)任務(wù)事件在任務(wù)調(diào) 度中的實(shí)現(xiàn)方式,根據(jù)任務(wù)就緒表中處于最高優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí)和當(dāng)前任 務(wù)優(yōu)先級(jí)的高低以及加鎖標(biāo)志,激活函數(shù)確定是否進(jìn)行任務(wù)調(diào)度切換。
同時(shí)該調(diào)度器還設(shè)置任務(wù)搶占機(jī)制,當(dāng)中斷產(chǎn)生時(shí),調(diào)度程序根據(jù)就緒 表中處于最高優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí)和當(dāng)前任務(wù)優(yōu)先級(jí)的高低以及加鎖標(biāo)志來(lái) 確定是否進(jìn)行調(diào)度。如果當(dāng)前任務(wù)的優(yōu)先級(jí)低于就緒表中的就緒態(tài)任務(wù)優(yōu)先 級(jí)且加鎖標(biāo)志為無(wú)效,則進(jìn)行調(diào)度,否則不進(jìn)行調(diào)度。這樣保證了系統(tǒng)運(yùn)行 的實(shí)時(shí)性和可靠性。
該調(diào)度器主要通過(guò)任務(wù)控制模塊、任務(wù)調(diào)度算法模塊、時(shí)鐘驅(qū)動(dòng)調(diào)度模 塊、事件機(jī)制控制模塊等核心模塊實(shí)現(xiàn)。任務(wù)控制模塊通過(guò)定義任務(wù)調(diào)度相 關(guān)的堆棧指針、任務(wù)狀態(tài)、優(yōu)先級(jí)、任務(wù)入口地址和任務(wù)加鎖標(biāo)志等任務(wù)屬 性以及任務(wù)就緒表,通過(guò)這些參數(shù)來(lái)描述任務(wù)的狀態(tài)、調(diào)度的條件。任務(wù)調(diào) 度算法模塊描述任務(wù)各種狀態(tài)切換的條件,任務(wù)調(diào)度觸發(fā)方式。時(shí)鐘驅(qū)動(dòng)調(diào)度模塊設(shè)定每個(gè)任務(wù)執(zhí)行的周期,通過(guò)時(shí)鐘中斷來(lái)產(chǎn)生任務(wù)切換的節(jié)拍,完 成任務(wù)的定時(shí)調(diào)度,以保證調(diào)度器的實(shí)時(shí)性。事件機(jī)制控制模塊定義任務(wù)事 件的結(jié)構(gòu)形式,實(shí)現(xiàn)任務(wù)事件在任務(wù)調(diào)度中的實(shí)現(xiàn)方式等。任務(wù)控制塊和調(diào) 度算法是調(diào)度器的核心,事件、時(shí)鐘中斷是觸發(fā)調(diào)度的條件,為調(diào)度算法服務(wù)。
調(diào)度器總體控制流程圖如附圖1所示。首先創(chuàng)建任務(wù),初始化任務(wù)控制 模塊;就緒表中最高優(yōu)先級(jí)任務(wù)獲得運(yùn)行權(quán),進(jìn)入主函數(shù)的空循環(huán)等待時(shí)鐘 中斷產(chǎn)生任務(wù)調(diào)度,調(diào)度函數(shù)根據(jù)任務(wù)控制模塊中的任務(wù)入口地址進(jìn)入任務(wù) 運(yùn)行,當(dāng)任務(wù)調(diào)用系統(tǒng)延時(shí)、事件等待、掛起三個(gè)函數(shù)之一,事件機(jī)制控制 模塊控制任務(wù)由運(yùn)行狀態(tài)進(jìn)入等待或掛起狀態(tài),調(diào)用任務(wù)調(diào)度算法模塊中調(diào) 度函數(shù),讓出CPU控制權(quán)。當(dāng)出現(xiàn)時(shí)鐘中斷、事件觸發(fā)、任務(wù)激活三種情況 之一時(shí),事件機(jī)制控制模塊控制任務(wù)狀態(tài)從掛起或等待狀態(tài)變?yōu)榫途w態(tài),調(diào) 用調(diào)度函數(shù),任務(wù)獲得CPU控制權(quán)。
任務(wù)延時(shí)當(dāng)前任務(wù)由于需要延時(shí)調(diào)用系統(tǒng)延時(shí)函數(shù)設(shè)置當(dāng)前任務(wù)狀態(tài) 標(biāo)志為延時(shí)節(jié)拍,使任務(wù)由運(yùn)行態(tài)進(jìn)入等待狀態(tài),然后進(jìn)行任務(wù)調(diào)度;事件 等待由于當(dāng)前任務(wù)通過(guò)調(diào)用事件等待函數(shù)等待某個(gè)未發(fā)生的事件,設(shè)置當(dāng) 前任務(wù)狀態(tài)標(biāo)志為0而使任務(wù)進(jìn)入掛起狀態(tài),然后進(jìn)行任務(wù)調(diào)度;任務(wù)掛起 通過(guò)設(shè)置當(dāng)前任務(wù)的狀態(tài)標(biāo)志為0使當(dāng)前運(yùn)行任務(wù)從運(yùn)行態(tài)進(jìn)入掛起狀態(tài), 然后進(jìn)行任務(wù)調(diào)度;事件驅(qū)動(dòng)函數(shù)是某個(gè)任務(wù)運(yùn)行時(shí)觸發(fā)某個(gè)事件有效時(shí), 調(diào)用事件觸發(fā)函數(shù)設(shè)置事件狀態(tài)標(biāo)志為1和事件等待任務(wù)狀態(tài)標(biāo)志為1使等 待該事件的任務(wù)從掛起狀態(tài)直接進(jìn)入就緒狀態(tài),然后進(jìn)行任務(wù)調(diào)度;而激活 任務(wù)函數(shù)是指某個(gè)任務(wù)運(yùn)行到某個(gè)階段需要啟動(dòng)一個(gè)掛起的任務(wù)執(zhí)行時(shí)調(diào)用 激活任務(wù)函數(shù)設(shè)置該掛起任務(wù)的狀態(tài)標(biāo)志為1來(lái)使該任務(wù)從掛起狀態(tài)進(jìn)入就 緒態(tài),然后進(jìn)行任務(wù)調(diào)度。時(shí)鐘中斷可以使延時(shí)節(jié)拍依次減少,當(dāng)減為1時(shí), 任務(wù)從等待狀態(tài)進(jìn)入就緒態(tài);其他中斷如果調(diào)用了事件驅(qū)動(dòng)函數(shù)或任務(wù)激活 函數(shù),可以使事件等待任務(wù)從掛起狀態(tài)進(jìn)入就緒態(tài);在被中斷任務(wù)未加鎖的 情況下,中斷都會(huì)調(diào)用調(diào)度函數(shù)。
整個(gè)任務(wù)調(diào)度就是通過(guò)任務(wù)延時(shí)、事件等待、任務(wù)掛起、事件觸發(fā)、任 務(wù)激活、中斷這六種情況之一來(lái)實(shí)現(xiàn)任務(wù)狀態(tài)的改變,從而實(shí)現(xiàn)調(diào)度的觸發(fā)。在本發(fā)明中采用了相應(yīng)的數(shù)據(jù)結(jié)構(gòu)、調(diào)度邏輯順序和調(diào)度規(guī)則來(lái)具體實(shí) 現(xiàn)。以下對(duì)該調(diào)度器中各控制模塊的具體技術(shù)實(shí)施進(jìn)行詳細(xì)描述。 1.任務(wù)控制模塊
任務(wù)控制模塊,主要由一個(gè)結(jié)構(gòu)體來(lái)管理任務(wù)執(zhí)行相關(guān)的參數(shù),每個(gè)任 務(wù)在創(chuàng)建時(shí)復(fù)制一個(gè)相同的任務(wù)控制塊結(jié)構(gòu)體。任務(wù)控制塊結(jié)構(gòu)體由任務(wù)堆
棧、任務(wù)入口地址、任務(wù)狀態(tài)字、任務(wù)優(yōu)先級(jí)和任務(wù)加鎖標(biāo)志5個(gè)部分組成。 定義任務(wù)調(diào)度相關(guān)的堆棧指針、任務(wù)狀態(tài)、優(yōu)先級(jí)、任務(wù)入口地址和任務(wù)加 鎖標(biāo)志等任務(wù)屬性以及任務(wù)就緒表,通過(guò)任務(wù)狀態(tài)字描述任務(wù)的狀態(tài),描述 延時(shí)節(jié)拍以及任務(wù)就緒表。這樣可以大大減小任務(wù)相關(guān)的參數(shù),從而減小內(nèi) 核大小。
任務(wù)堆棧用于保護(hù)被中斷或高優(yōu)先級(jí)打斷的現(xiàn)場(chǎng)數(shù)據(jù),用一個(gè)長(zhǎng)整型指 針來(lái)指向堆棧空間的初始地址,初始化時(shí)指向任務(wù)堆??臻g的頂部。任務(wù)在 切換時(shí)通過(guò)入口地址從堆??臻g壓入或推出保護(hù)的任務(wù)數(shù)據(jù)。
任務(wù)入口地址是任務(wù)運(yùn)行時(shí)的初始地址,是一個(gè)長(zhǎng)整型指針,在任務(wù)創(chuàng) 建時(shí)初始化指向任務(wù)函數(shù)名。
任務(wù)狀態(tài)字,用來(lái)表示任務(wù)當(dāng)前的狀態(tài)和延遲的時(shí)間節(jié)拍數(shù),用一個(gè)整 型或長(zhǎng)整型變量描述,0表示掛起狀態(tài),l表示就緒狀態(tài),大于l的值表示延 時(shí)節(jié)拍數(shù),在任務(wù)創(chuàng)建時(shí)初始化0。延時(shí)節(jié)拍根據(jù)時(shí)鐘中斷周期值計(jì)算出延時(shí) 減1需要的中斷次數(shù)。具體計(jì)算是中斷次數(shù)=1次延時(shí)節(jié)拍時(shí)間/系統(tǒng)時(shí)鐘中 斷周期。比如狀態(tài)標(biāo)志大于1的數(shù)表示延時(shí)多少個(gè)毫秒,而時(shí)鐘中斷周期為 200微毫秒,則時(shí)鐘中斷產(chǎn)生5次狀態(tài)標(biāo)志減1。任務(wù)狀態(tài)標(biāo)志通過(guò)任務(wù)延時(shí)、 事件等待、事件觸發(fā)、任務(wù)掛起、任務(wù)激活、時(shí)鐘中斷來(lái)進(jìn)行設(shè)置,通過(guò)調(diào) 度函數(shù)來(lái)進(jìn)行判別。
任務(wù)優(yōu)先級(jí)表示任務(wù)優(yōu)先獲得運(yùn)行權(quán)的級(jí)別,保證實(shí)時(shí)性要求高的任務(wù) 得到運(yùn)行。根據(jù)操作系統(tǒng)允許的最大任務(wù)數(shù)來(lái)定義數(shù)據(jù)類(lèi)型,如最多支持的 任務(wù)數(shù)為64個(gè),用一個(gè)8位數(shù)據(jù)描述。數(shù)字越小優(yōu)先級(jí)越高,可以用任務(wù)號(hào) 來(lái)表示。任務(wù)切換時(shí),就緒列表中優(yōu)先級(jí)最高的任務(wù)進(jìn)入運(yùn)行態(tài)。
調(diào)度鎖主要作用是保證部分任務(wù)執(zhí)行的實(shí)時(shí)性和可靠性,用一個(gè)無(wú)符號(hào) 字符型變量表示。任務(wù)加鎖標(biāo)志表示中斷處理完成后,根據(jù)被中斷任務(wù)加鎖標(biāo)志值來(lái)確定是否進(jìn)行調(diào)度,o表示未加鎖,被中斷任務(wù)可以被搶占,調(diào)用調(diào)
度函數(shù)實(shí)現(xiàn)任務(wù)切換;l表示加鎖,被中斷任務(wù)不能被強(qiáng)占,中斷完成后返回 被中斷任務(wù)。任務(wù)的加鎖和解鎖通過(guò)專(zhuān)門(mén)的函數(shù)來(lái)實(shí)現(xiàn),任務(wù)中必須是成對(duì) 出現(xiàn),否則,可能造成系統(tǒng)只運(yùn)行加鎖任務(wù)。
在調(diào)度器任務(wù)控制模塊中設(shè)置一個(gè)全局任務(wù)控制塊數(shù)組來(lái)表示任務(wù)控制 塊列表,每個(gè)任務(wù)在創(chuàng)建時(shí)復(fù)制一個(gè)對(duì)應(yīng)的任務(wù)控制塊來(lái)描述任務(wù)的屬性。 創(chuàng)建任務(wù)就是調(diào)用任務(wù)創(chuàng)建函數(shù)把任務(wù)函數(shù)名賦給任務(wù)控制塊數(shù)組中任務(wù)入 口地址;為任務(wù)開(kāi)辟堆??臻g,初始化該任務(wù)的任務(wù)堆棧;每個(gè)任務(wù)設(shè)置一 個(gè)且僅有一個(gè)優(yōu)先級(jí),任務(wù)的優(yōu)先級(jí)也可以用任務(wù)的ID號(hào)來(lái)表示;任務(wù)初始 狀態(tài)設(shè)置為就緒態(tài);加鎖標(biāo)志初始狀態(tài)為空,用戶可根據(jù)具體情況在任務(wù)中 調(diào)用加鎖、解鎖函數(shù)進(jìn)行設(shè)置。
2.任務(wù)調(diào)度算法模塊
任務(wù)調(diào)度算法模塊規(guī)定描述任務(wù)狀態(tài)切換的條件,任務(wù)調(diào)度觸發(fā)方式, 它具體表現(xiàn)在操作系統(tǒng)產(chǎn)生任務(wù)調(diào)度的執(zhí)行條件中。任務(wù)調(diào)度觸發(fā)方式主要 有六種事件等待、事件觸發(fā)、中斷、任務(wù)延時(shí)、任務(wù)掛起和任務(wù)激活,這 六種方式中都包含了任務(wù)調(diào)度函數(shù)的調(diào)用,每個(gè)任務(wù)必須調(diào)用除中斷外的任 何一個(gè)或一個(gè)以上的任務(wù)調(diào)度觸發(fā)方式來(lái)調(diào)用調(diào)度函數(shù)。
所有任務(wù)的狀態(tài)字組成了整個(gè)操作系統(tǒng)的就緒表,采用一個(gè)變量實(shí)現(xiàn)了 三種狀態(tài)的描述,精簡(jiǎn)了調(diào)度器的內(nèi)核。任務(wù)調(diào)度算法模塊在這六種觸發(fā)方 式的作用下設(shè)置對(duì)應(yīng)的任務(wù)狀態(tài)標(biāo)志,然后在就緒列表中找到優(yōu)先級(jí)最高的 任務(wù),并把這個(gè)任務(wù)切換到運(yùn)行狀態(tài)。在任務(wù)控制塊列表中使用任務(wù)在列表 中的相對(duì)位置表示優(yōu)先級(jí)的高低,并不需要實(shí)際的對(duì)任務(wù)優(yōu)先級(jí)進(jìn)行比較,
這樣可以節(jié)省調(diào)度時(shí)間。如圖2所示為任務(wù)調(diào)度算法狀態(tài)描述示意圖。具體
的方法如下
(1)任務(wù)狀態(tài)切換主要由任務(wù)延時(shí)、事件等待、任務(wù)掛起、事件觸發(fā)、 任務(wù)激活、中斷服務(wù)程序等函數(shù)的調(diào)度組成。任務(wù)的狀態(tài)由任務(wù)控制塊中的 任務(wù)狀態(tài)字給出。
當(dāng)系統(tǒng)產(chǎn)生中斷時(shí),不管是時(shí)鐘中斷還是其他中斷,操作系統(tǒng)進(jìn)入中斷 服務(wù)程序,如果是系統(tǒng)時(shí)鐘中斷,則檢査各延時(shí)任務(wù)的狀態(tài)標(biāo)志是否大于l,如果大于l,則減l,如果減l后等于l,表示任務(wù)延時(shí)結(jié)束,延時(shí)任務(wù)進(jìn)入
就緒態(tài)。
當(dāng)某個(gè)事件產(chǎn)生時(shí),設(shè)置事件狀態(tài)標(biāo)志為l,事件觸發(fā)函數(shù)通過(guò)該事件屬 性找到等待該事件對(duì)應(yīng)的等待任務(wù),將該任務(wù)的任務(wù)狀態(tài)設(shè)置為l,事件等待 任務(wù)進(jìn)入就緒態(tài)。
當(dāng)當(dāng)前任務(wù)調(diào)用任務(wù)激活函數(shù)激活某個(gè)被掛起的任務(wù)時(shí),置被激活任務(wù) 狀態(tài)標(biāo)志為l,被激活任務(wù)從掛起狀態(tài)進(jìn)入就緒態(tài)。
當(dāng)系統(tǒng)產(chǎn)生中斷時(shí),不管是時(shí)鐘中斷還是其他中斷,操作系統(tǒng)進(jìn)入中斷 服務(wù)程序,如果是系統(tǒng)時(shí)鐘中斷,則檢查各延時(shí)任務(wù)的狀態(tài)標(biāo)志是否大于l, 如果大于l,則減l,如果減l后等于l,表示任務(wù)延時(shí)結(jié)束,延時(shí)任務(wù)進(jìn)入 就緒態(tài)。
當(dāng)某個(gè)事件產(chǎn)生時(shí),事件觸發(fā)函數(shù)通過(guò)該事件屬性找到等待該事件對(duì)應(yīng) 的等待任務(wù),將該任務(wù)的任務(wù)狀態(tài)設(shè)置為l,事件等待任務(wù)進(jìn)入就緒態(tài)。
當(dāng)當(dāng)前任務(wù)調(diào)用任務(wù)激活函數(shù)激活某個(gè)被掛起的任務(wù)時(shí),置被激活任務(wù) 狀態(tài)標(biāo)志為l,被激活任務(wù)從掛起狀態(tài)進(jìn)入就緒態(tài)。
如圖3所示為任務(wù)切換示意圖,描述了任務(wù)切換過(guò)程。具體切換過(guò)程包 括,當(dāng)前事件運(yùn)行在任務(wù)延時(shí)、事件等待、任務(wù)掛起、事件觸發(fā)、任務(wù)激活、 五種任務(wù)狀態(tài)之一時(shí),或者中斷產(chǎn)生且被中斷任務(wù)未加鎖時(shí),進(jìn)入任務(wù)調(diào)度。
然后,任務(wù)調(diào)度算法模塊在就緒表從任務(wù)控制塊隊(duì)列的頭部(即任務(wù)優(yōu) 先級(jí)為0的任務(wù))開(kāi)始依次檢查任務(wù)就緒標(biāo)志,如果任務(wù)狀態(tài)標(biāo)志-l,表示 當(dāng)前任務(wù)為非就緒狀態(tài),繼續(xù)檢査下一個(gè)優(yōu)先級(jí)的任務(wù)。如果任務(wù)狀態(tài)標(biāo)志 為l,則找到最高優(yōu)先級(jí)任務(wù)。
最后,調(diào)度函數(shù)比較當(dāng)前最高優(yōu)先級(jí)任務(wù)和當(dāng)前運(yùn)行任務(wù)是否相同,如 果相同則退出調(diào)度,否則,先按照順序保存當(dāng)前任務(wù)狀態(tài)到任務(wù)??臻g,再 將CPU的堆棧指針指向需運(yùn)行的任務(wù)棧頂,從棧空間將任務(wù)狀態(tài)值,恢復(fù)程 序計(jì)數(shù)器值,運(yùn)行該任務(wù)。
內(nèi)核采用可剝奪式內(nèi)核,在其他中斷服務(wù)程序完成后,調(diào)度函數(shù)先檢查 被中斷任務(wù)是否加鎖,如果加鎖則直接返回任務(wù);如果未加鎖,調(diào)度函數(shù)檢 測(cè)就緒表中是否存在優(yōu)先級(jí)更高的就緒任務(wù),如果有,調(diào)度函數(shù)將當(dāng)前任務(wù)狀態(tài)進(jìn)行壓棧保護(hù),然后調(diào)用任務(wù)級(jí)任務(wù)切換函數(shù)進(jìn)行任務(wù)調(diào)度,執(zhí)行完成 后,恢復(fù)被中斷任務(wù)狀態(tài)。由于內(nèi)核較小,控制任務(wù)不多,本調(diào)度器不允許 中斷嵌套。
3. 時(shí)鐘驅(qū)動(dòng)調(diào)度模塊
設(shè)定每個(gè)任務(wù)執(zhí)行的周期,根據(jù)任務(wù)優(yōu)先級(jí)來(lái)分配每個(gè)任務(wù)執(zhí)行的先后 順序。每個(gè)時(shí)鐘中斷產(chǎn)生時(shí),時(shí)鐘中斷服務(wù)程序比較是否任務(wù)加鎖,每個(gè)任 務(wù)的加鎖和解鎖是成對(duì)出現(xiàn)的,如果任務(wù)未加鎖則進(jìn)行一次調(diào)度,就緒表中 處于就緒態(tài)的最高優(yōu)先級(jí)任務(wù)獲得CPU控制權(quán),如果任務(wù)加鎖,當(dāng)該任務(wù)運(yùn) 行到任務(wù)解鎖時(shí),才產(chǎn)生調(diào)度。這樣既保證了每個(gè)任務(wù)得到執(zhí)行,又可以根 據(jù)具體需要設(shè)定每個(gè)任務(wù)執(zhí)行的周期,提高了任務(wù)的實(shí)時(shí)性和可靠性。
為了確保調(diào)度器的實(shí)時(shí)性,使每個(gè)任務(wù)都能得到實(shí)時(shí)調(diào)度,在時(shí)鐘驅(qū)動(dòng) 調(diào)度模塊中采用時(shí)鐘定時(shí)中斷的方式來(lái)實(shí)現(xiàn)任務(wù)的定時(shí)切換。時(shí)鐘每產(chǎn)生一 次中斷就比較一次就緒表中的就緒任務(wù)的優(yōu)先級(jí)任務(wù),每次査找優(yōu)先級(jí)最高 的就緒任務(wù),然后調(diào)度切換執(zhí)行優(yōu)先級(jí)最高的就緒任務(wù)。用戶可以根據(jù)實(shí)時(shí) 性要求設(shè)置時(shí)鐘中斷的周期。
同時(shí),系統(tǒng)時(shí)鐘節(jié)拍函數(shù)自動(dòng)檢查每個(gè)被延遲的任務(wù),當(dāng)任務(wù)的延時(shí)結(jié) 束時(shí),時(shí)鐘驅(qū)動(dòng)調(diào)度模塊自動(dòng)將任務(wù)狀態(tài)設(shè)置為就緒狀態(tài)并進(jìn)行一次任務(wù)調(diào) 度。時(shí)鐘中斷任務(wù)切換驅(qū)動(dòng)調(diào)度過(guò)程見(jiàn)附圖4,具體算法如下
(1) 時(shí)鐘中斷服務(wù)程序從任務(wù)控制塊列表頭部開(kāi)始順序檢查各任務(wù)狀態(tài) 字,根據(jù)延時(shí)節(jié)拍周期計(jì)算需要的時(shí)鐘節(jié)拍數(shù),當(dāng)延時(shí)周期滿足要求后將所 有延遲任務(wù)的任務(wù)狀態(tài)字減1。
判斷延時(shí)狀態(tài)標(biāo)志是否大于l,如不大于l,執(zhí)行步驟(3);如大于l, 延時(shí)狀態(tài)標(biāo)志減l,檢查各個(gè)延時(shí)任務(wù)狀態(tài)標(biāo)志是否為l;
(2) 當(dāng)當(dāng)前延遲任務(wù)的狀態(tài)標(biāo)志變?yōu)閘時(shí),表示任務(wù)進(jìn)入就緒態(tài),該任 務(wù)延時(shí)結(jié)束,判斷當(dāng)前運(yùn)行任務(wù)是否加鎖;
(3) 任務(wù)調(diào)度函數(shù)判斷被中斷任務(wù)是否加鎖,如果加鎖,時(shí)鐘中斷服務(wù) 程序返回被中斷任務(wù)繼續(xù)運(yùn)行;如果未加鎖,檢測(cè)就緒態(tài)任務(wù)優(yōu)先級(jí)是否大 于當(dāng)前任務(wù),如是,進(jìn)入中斷級(jí)調(diào)度,返回被中斷任務(wù)進(jìn)行一次任務(wù)調(diào)度。
4. 事件機(jī)制控制模塊事件機(jī)制控制模塊定義任務(wù)事件的結(jié)構(gòu)形式,實(shí)現(xiàn)任務(wù)事件在任務(wù)調(diào)度 中的實(shí)現(xiàn)方式及事件操作函數(shù)等。任務(wù)事件由一個(gè)結(jié)構(gòu)體來(lái)定義,包括事件 等待任務(wù)名稱(chēng)、事件狀態(tài)標(biāo)志、事件值指針、事件值長(zhǎng)度等。每個(gè)與至少兩 個(gè)以上的任務(wù)事件相關(guān)聯(lián),其中一個(gè)任務(wù)等待事件,其它任務(wù)設(shè)置事件。事 件的操作包括等待事件和觸發(fā)事件,等待事件設(shè)置任務(wù)的狀態(tài)標(biāo)志為掛起狀
態(tài),調(diào)用調(diào)度函數(shù)進(jìn)行調(diào)度;觸發(fā)事件設(shè)置等待任務(wù)狀態(tài)為就緒態(tài),調(diào)用調(diào)
度函數(shù)進(jìn)行調(diào)度。
該調(diào)度器采用事件機(jī)制來(lái)實(shí)現(xiàn)任務(wù)間的通信及調(diào)度驅(qū)動(dòng)。事件結(jié)構(gòu)模塊 中主要包括事件的關(guān)聯(lián)任務(wù)、事件狀態(tài)標(biāo)志、事件值、事件值長(zhǎng)度等。在事 件初始化時(shí)必須配置事件的等待關(guān)聯(lián)任務(wù),用等待任務(wù)名初始化,事件狀態(tài) 標(biāo)志表示該事件是否產(chǎn)生,定義事件狀態(tài)標(biāo)志為1表示產(chǎn)生事件,為0表示 未產(chǎn)生事件。當(dāng)任務(wù)運(yùn)行過(guò)程中需要等待某個(gè)事件產(chǎn)生后才能繼續(xù)運(yùn)行該任 務(wù),任務(wù)通過(guò)事件等待函數(shù)等待一個(gè)事件的產(chǎn)生,通過(guò)檢測(cè)事件狀態(tài)標(biāo)志的 值來(lái)確定是否進(jìn)行調(diào)度。如果事件狀態(tài)標(biāo)志為l,表示事件有效,則讀取事件 值,繼續(xù)運(yùn)行該任務(wù);如果事件狀態(tài)標(biāo)志為0,表示事件沒(méi)有產(chǎn)生,則置當(dāng)前 任務(wù)進(jìn)入掛起狀態(tài),進(jìn)行任務(wù)調(diào)度。如其他任務(wù)或中斷觸發(fā)該事件產(chǎn)生,則 通過(guò)事件驅(qū)動(dòng)函數(shù)設(shè)置該事件狀態(tài)標(biāo)志為l,同時(shí)設(shè)置等待事件任務(wù)狀態(tài)為1, 同時(shí)設(shè)置相應(yīng)的事件值和長(zhǎng)度,然后調(diào)用調(diào)度函數(shù)進(jìn)行調(diào)度。等待事件任務(wù) 根據(jù)優(yōu)先級(jí)進(jìn)入運(yùn)行態(tài)后,通過(guò)事件獲取相應(yīng)的事件值,完成任務(wù)間的通信。
權(quán)利要求
1、一種微嵌入式實(shí)時(shí)任務(wù)調(diào)度器,包括,任務(wù)控制模塊、任務(wù)調(diào)度算法模塊、時(shí)鐘驅(qū)動(dòng)調(diào)度模塊、事件機(jī)制控制模塊,其特征在于,任務(wù)控制模塊用一個(gè)結(jié)構(gòu)體定義任務(wù)調(diào)度相關(guān)的堆棧指針、任務(wù)狀態(tài)、任務(wù)優(yōu)先級(jí)、任務(wù)入口地址和任務(wù)加鎖標(biāo)志,通過(guò)任務(wù)狀態(tài)字描述任務(wù)的就緒、掛起、延時(shí)節(jié)拍等狀態(tài)和任務(wù)就緒表;任務(wù)調(diào)度算法模塊規(guī)定任務(wù)各種狀態(tài)切換的條件及任務(wù)調(diào)度觸發(fā)方式,每個(gè)任務(wù)必須調(diào)用除中斷外的任何一個(gè)或一個(gè)以上的任務(wù)調(diào)度觸發(fā)方式;時(shí)鐘驅(qū)動(dòng)調(diào)度模塊采用時(shí)鐘定時(shí)中斷的方式實(shí)現(xiàn)任務(wù)的定時(shí)切換,根據(jù)任務(wù)優(yōu)先級(jí)分配每個(gè)任務(wù)執(zhí)行的先后順序,調(diào)度函數(shù)查找就緒表中優(yōu)先級(jí)最高的任務(wù)進(jìn)入運(yùn)行態(tài);事件機(jī)制控制模塊定義任務(wù)事件的結(jié)構(gòu)形式,實(shí)現(xiàn)任務(wù)事件在任務(wù)調(diào)度中的實(shí)現(xiàn)方式;根據(jù)任務(wù)就緒表中處于最高優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí)和當(dāng)前任務(wù)優(yōu)先級(jí)的高低來(lái)確定是否進(jìn)行任務(wù)調(diào)度切換。
2、 根據(jù)權(quán)利要求1所述的實(shí)時(shí)任務(wù)調(diào)度器,其特征在于,任務(wù)事件由包 括事件等待任務(wù)名稱(chēng)、事件狀態(tài)標(biāo)志、事件值指針、事件值長(zhǎng)度的一個(gè)結(jié)構(gòu) 體定義。
3、 根據(jù)權(quán)利要求1所述的實(shí)時(shí)任務(wù)調(diào)度器,其特征在于,如果當(dāng)前任務(wù) 的優(yōu)先級(jí)低于任務(wù)就緒表中的就緒態(tài)任務(wù)優(yōu)先級(jí)且加鎖標(biāo)志為無(wú)效,則進(jìn)行 調(diào)度,否則不進(jìn)行調(diào)度;如果每個(gè)任務(wù)處于除中斷外的任何一個(gè)或幾個(gè)觸發(fā) 方式,任務(wù)調(diào)度器才進(jìn)行調(diào)度。
4、根據(jù)權(quán)利要求1所述的實(shí)時(shí)任務(wù)調(diào)度器,其特征在于,在任務(wù)控制模 塊中設(shè)置一個(gè)全局任務(wù)控制塊數(shù)組來(lái)表示任務(wù)控制塊列表,在創(chuàng)建任務(wù)時(shí)復(fù)制一個(gè)對(duì)應(yīng)的任務(wù)控制塊來(lái)描述任務(wù)的屬性,調(diào)用任務(wù)創(chuàng)建函數(shù)把任務(wù)函數(shù)名賦給任務(wù)控制塊數(shù)組中任務(wù)入口地址;為任務(wù)開(kāi)辟堆??臻g;每個(gè)任務(wù)設(shè) 置一個(gè)優(yōu)先級(jí);任務(wù)初始狀態(tài)設(shè)置為就緒態(tài);加鎖標(biāo)志初始狀態(tài)為空。
5、根據(jù)權(quán)利要求1所述的實(shí)時(shí)任務(wù)調(diào)度器,其特征在于,所述任務(wù)調(diào)度 觸發(fā)方式包括任務(wù)延時(shí)、事件等待、任務(wù)掛起、事件觸發(fā)、任務(wù)激活、中斷六種方式。
6、 一種微嵌入式實(shí)時(shí)任務(wù)調(diào)度方法,其特征在于,初始化任務(wù)控制模塊, 創(chuàng)建任務(wù);就緒表中最高優(yōu)先級(jí)任務(wù)獲得運(yùn)行權(quán),等待時(shí)鐘中斷產(chǎn)生任務(wù)調(diào) 度;調(diào)度函數(shù)根據(jù)任務(wù)控制模塊中的任務(wù)入口地址進(jìn)入任務(wù)運(yùn)行狀態(tài);當(dāng)任 務(wù)調(diào)用系統(tǒng)延時(shí)、事件等待、掛起三個(gè)函數(shù)之一,事件機(jī)制控制模塊控制任 務(wù)讓出CPU控制權(quán)進(jìn)入掛起或等待狀態(tài),然后啟動(dòng)就緒表中優(yōu)先級(jí)最高的任 務(wù)運(yùn)行;當(dāng)任務(wù)出現(xiàn)中斷、事件觸發(fā)、任務(wù)激活三種情況之一時(shí),任務(wù)控制 模塊控制任務(wù)狀態(tài)從等待或掛起狀態(tài)變?yōu)榫途w態(tài);當(dāng)中斷服務(wù)程序結(jié)束,調(diào) 度函數(shù)先檢査被中斷任務(wù)是否加鎖;如果加鎖則直接返回任務(wù);如果未加鎖, 調(diào)度函數(shù)檢測(cè)就緒表中是否存在優(yōu)先級(jí)更高的任務(wù),如果有,調(diào)度函數(shù)將當(dāng) 前任務(wù)狀態(tài)進(jìn)行壓棧保護(hù),調(diào)用任務(wù)切換函數(shù)進(jìn)行任務(wù)調(diào)度;執(zhí)行完任務(wù)調(diào) 度后,繼續(xù)運(yùn)行被中斷任務(wù)。
7、 根據(jù)權(quán)利要求6所述的實(shí)時(shí)任務(wù)調(diào)度方法,其特征在于,所述系統(tǒng)延 時(shí)函數(shù)設(shè)置該任務(wù)的狀態(tài)標(biāo)志為延時(shí)節(jié)拍,任務(wù)進(jìn)入等待狀態(tài);所述事件等 待函數(shù)設(shè)置該任務(wù)的任務(wù)狀態(tài)標(biāo)志為掛起狀態(tài);所述掛起函數(shù)請(qǐng)求掛起時(shí), 設(shè)置該任務(wù)的任務(wù)狀態(tài)標(biāo)志為掛起狀態(tài)。
8、根據(jù)權(quán)利要求6所述的實(shí)時(shí)任務(wù)調(diào)度方法,其特征在于,任務(wù)狀態(tài)由掛起或等待狀態(tài)變?yōu)榫途w狀態(tài)的條件具體為滿足以下三種情況之一,① 當(dāng)時(shí)鐘中斷致使延時(shí)節(jié)拍減為1時(shí),表示任務(wù)延時(shí)結(jié)束,狀態(tài)標(biāo) 志進(jìn)入就緒態(tài);② 當(dāng)任務(wù)觸發(fā)某個(gè)事件產(chǎn)生時(shí),等待該事件的任務(wù)狀態(tài)設(shè)置為就緒 狀態(tài);③ 當(dāng)任務(wù)調(diào)用激活任務(wù)函數(shù)激活某個(gè)被掛起的任務(wù),該任務(wù)狀態(tài)標(biāo) 志就從掛起狀態(tài)設(shè)置為就緒狀態(tài)。
全文摘要
本發(fā)明請(qǐng)求保護(hù)一種微嵌入式實(shí)時(shí)任務(wù)調(diào)度器及調(diào)度方法,涉及工業(yè)控制及智能儀器儀表相關(guān)領(lǐng)域。本發(fā)明在調(diào)度過(guò)程中,通過(guò)對(duì)任務(wù)控制塊中任務(wù)狀態(tài)字的設(shè)置來(lái)標(biāo)志任務(wù)狀態(tài),調(diào)度器通過(guò)檢測(cè)任務(wù)狀態(tài)字來(lái)確定任務(wù)的調(diào)度,通過(guò)時(shí)鐘和事件來(lái)驅(qū)動(dòng)調(diào)度;采用精簡(jiǎn)內(nèi)核代碼、可剝奪式內(nèi)核和中斷相結(jié)合的方式來(lái)實(shí)現(xiàn)實(shí)時(shí)性要求;采用一個(gè)狀態(tài)字實(shí)現(xiàn)就緒、掛起和延時(shí)計(jì)數(shù)多用途的方式減少任務(wù)執(zhí)行代碼,精簡(jiǎn)調(diào)度算法減少內(nèi)核代碼;在任務(wù)控制塊中加入調(diào)度鎖標(biāo)志,用戶可以根據(jù)具體需要在任務(wù)中進(jìn)行加鎖或解鎖。解決了中低端智能儀器儀表傳統(tǒng)的編程方式存在的問(wèn)題以及對(duì)實(shí)時(shí)性、低功耗、小內(nèi)核的要求,提高了編程效率和代碼可移植性。
文檔編號(hào)G05B19/04GK101290588SQ200810069439
公開(kāi)日2008年10月22日 申請(qǐng)日期2008年3月7日 優(yōu)先權(quán)日2008年3月7日
發(fā)明者丘寶梅, 馮輝宗, 明 岑, 章亮飛, 敏 蘇, 蔣建春, 郭東進(jìn) 申請(qǐng)人:重慶郵電大學(xué)