|
內(nèi)核在進(jìn)行任務(wù)調(diào)度時(shí),必須知道哪個(gè)任務(wù)在運(yùn)行、哪個(gè)任務(wù)是就緒的最高優(yōu)先級(jí)的任務(wù)。實(shí)時(shí)任務(wù)調(diào)度的關(guān)鍵在于速度,要求無(wú)論系統(tǒng)的運(yùn)行情況如何,調(diào)度的時(shí)間是確定的,不能把時(shí)間都用在調(diào)度上。因此就需要設(shè)計(jì)高效的多任務(wù)調(diào)度方法。查找高優(yōu)先級(jí)的任務(wù),與正在運(yùn)行的任務(wù)的優(yōu)先級(jí)進(jìn)行比較以確定是否進(jìn)行任務(wù)切換是內(nèi)核在每個(gè)時(shí)鐘中斷都需要做的事情。為滿(mǎn)足這樣的需要,uC/OS-II的開(kāi)發(fā)者采用了就緒表和就緒組這樣的數(shù)據(jù)結(jié)構(gòu),圍繞它們又定義了兩張查找表。
就緒組和就緒表的相關(guān)定義如下所示:
041448df4tpd7kxpok7h4q.png (5.16 KB, 下載次數(shù): 109)
下載附件
2013-7-14 16:10 上傳
041412pl57p75b5z3iibli.png (13.36 KB, 下載次數(shù): 136)
下載附件
2013-7-14 16:10 上傳
041413ejppqd7yb5m0jm6d.png (3.6 KB, 下載次數(shù): 96)
下載附件
2013-7-14 16:10 上傳
已經(jīng)知道,OS_LOWEST_PRIO是最低優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí),因?yàn)閡C/OS-II最多可以同時(shí)有64個(gè)就緒任務(wù),而優(yōu)先級(jí)是從0開(kāi)始,因此最大可以設(shè)置為63.如果設(shè)置為63,則OS_RDY_TBL_SIZE就為8,那么OSRdyTbl最多有8個(gè)元素。
OSRdyGrp是就緒組,類(lèi)型是INT8U,INT8U等同于無(wú)符號(hào)的字符型,也就是8位無(wú)符號(hào)數(shù)。OSRdyTbl就是每個(gè)元素都為8位無(wú)符號(hào)數(shù)的數(shù)組,數(shù)組中元素的個(gè)數(shù)是OS_RDY_TBL_SIZE。
如果把OSRdyTbl直接定義為INT8U OSRdyTbl[8]是不是也可以呢?答案是肯定的,但是如果任務(wù)數(shù)沒(méi)有那么多,沒(méi)有必要把OS_LOWEST_PRIO設(shè)置為63,假設(shè)是3,那么只要定義為INT8U OSRdy[1]就可以了,這樣做可以節(jié)約內(nèi)存空間。
uC/OS-II規(guī)定,每個(gè)就緒的任務(wù)在就緒表中的對(duì)應(yīng)位置為1,反之為0。只要就緒表OSRdyTbl[n]所有的位都為0,OSRdyGrp的第n位才為0。
在操作系統(tǒng)還沒(méi)有創(chuàng)建任務(wù)的時(shí)候,就緒表和就緒組如下圖所示:
041414x0j4t3dd4djdd3iz.png (18.72 KB, 下載次數(shù): 93)
下載附件
2013-7-14 16:10 上傳
在上圖中,因?yàn)闆](méi)有就緒任務(wù),所以就緒表中所有位都是0,即從OSRdyTbl[0]到OSRdyTbl[7]都是0,所以O(shè)SRdyGrp也是0。當(dāng)創(chuàng)建了空閑任務(wù)和統(tǒng)計(jì)任務(wù)后,就緒表和就緒組如下圖所示:
041415mphtgrzibeb1tlbp.png (17.49 KB, 下載次數(shù): 102)
下載附件
2013-7-14 16:10 上傳
在上圖中,創(chuàng)建了優(yōu)先級(jí)最小的兩個(gè)任務(wù)——空閑任務(wù)和統(tǒng)計(jì)任務(wù)。空閑任務(wù)的優(yōu)先級(jí)是63,空閑任務(wù)就緒,那么OSRdyTbl[7]的最高位為1.統(tǒng)計(jì)任務(wù)的優(yōu)先級(jí)是62,統(tǒng)計(jì)任務(wù)也就緒,那么OSRdyTbl[7]的次高位為1。OSRdyTbl[7]不是0,所以O(shè)SRdyGrp的第7位為1。如果我們?cè)賱?chuàng)建一個(gè)優(yōu)先級(jí)是11的任務(wù),創(chuàng)建后就緒表和就緒組就應(yīng)該如下圖所示。
041415zr6xo01ri0t51ozf.png (13.15 KB, 下載次數(shù): 91)
下載附件
2013-7-14 16:10 上傳
通過(guò)上面3個(gè)任務(wù)的創(chuàng)建過(guò)程可以看出,如果有新的就緒任務(wù),就需要將就緒表中與該任務(wù)優(yōu)先級(jí)對(duì)應(yīng)的項(xiàng)置1.如果該就緒任務(wù)在第n行,就將OSRdyGrp的第n位置1。
于是,如果有一個(gè)優(yōu)先級(jí)為prio的任務(wù)就緒,應(yīng)執(zhí)行如下的代碼:
041416ghu9dmugy5j93x9a.png (11.41 KB, 下載次數(shù): 103)
下載附件
2013-7-14 16:10 上傳
在任務(wù)調(diào)度的時(shí)候,要查找優(yōu)先級(jí)最高的任務(wù)。采用分組管理的方法就是為了使查找的時(shí)候時(shí)間是確定的,速度是最快的。如果不采用分組管理的方法,那么就要從OSRdyTbl[0]開(kāi)始查找,如果一直找不到,就要查找到OSRdyTbl[7],所以時(shí)間比較長(zhǎng),且不能確定。采用就緒組后,查找程序代碼如下所示:
041417qtu10e6hzv1etv17.png (26.57 KB, 下載次數(shù): 102)
下載附件
2013-7-14 16:10 上傳
可見(jiàn),獲取就緒任務(wù)中的最高優(yōu)先級(jí)的方法是以O(shè)SRdyGrp的值為依據(jù)查優(yōu)先級(jí)判定表OSUnMapTbl獲得最高優(yōu)先級(jí)任務(wù)的高5位,然后將其賦值給y。然后,以O(shè)SRdyTbl[y]的值再一次查表,得到低3位,再將高5位左移3位與低3位相或,得到優(yōu)先級(jí)。這樣的查找方法是迅速的,查找時(shí)間也是恒定的。但是這樣做的依據(jù)是什么呢?
如果我們要找到優(yōu)先級(jí)最高的任務(wù),那么應(yīng)該先分析OSRdyGrp。假設(shè)OSRdyGrp中最低的為1的位為y號(hào)位,決定了我們?cè)诰途w表中的哪一行來(lái)查找優(yōu)先級(jí)最高的任務(wù)。也就是說(shuō),先查找到就緒表中的行號(hào)。有了行號(hào),接下來(lái)再找是哪一列,這樣就知道最低優(yōu)先級(jí)的任務(wù)是多少了。OSUnMapTbl這張表就是為了達(dá)到這樣的目的而設(shè)計(jì)的!
OSUnMapTbl的定義如下所示:
041417cp5p5zp8tb8wfgfa.png (9.48 KB, 下載次數(shù): 111)
下載附件
2013-7-14 16:10 上傳
首先根據(jù)OSRdyGrp查找優(yōu)先級(jí)判定表,原理是根據(jù)優(yōu)先級(jí)立即查找到OSRdyTbl[]中對(duì)應(yīng)元素,即OSRdyGrp中從低位到高位第一個(gè)為1的位的位置(從0到7)。例如,如果OSRdyGrp為11001000B,那么最低的為1的位是3號(hào)位,于是查表得到3,就是說(shuō)最高優(yōu)先級(jí)在OSRdyTbl[3]中。如果是01001000B,同樣查找到3,這就是程序中為什么有那么多列是相同的原因。
假設(shè)OSRdyGrp為0,那么沒(méi)有任務(wù)就緒,但是在多任務(wù)啟動(dòng)后沒(méi)有任務(wù)就緒是不可能的,因?yàn)橹辽倏臻e任務(wù)是就緒的,所以我們添一個(gè)0占一個(gè)位置。假設(shè)OSRdyGrp的最低位為1,那么就緒表中的0行有任務(wù)就緒,也就是優(yōu)先級(jí)為0~7的任務(wù)有就緒的,我們應(yīng)該去查看OSRdyTbl[0]中是哪一位為1了。OSRdyGrp的最低位為1的情況有很多,但是所有這些情況下查找得到的值都是0.
優(yōu)先級(jí)判定表OSUnMapTbl就是根據(jù)一個(gè)8位的無(wú)符號(hào)數(shù)的數(shù)值來(lái)確定最低的為1的位的位置的,OSUnMapTbl[n]就是n的最低的為1的位的位號(hào)。
y=OSUnMapTbl[OSRdyGrp]是將就緒組中最低為1的位的位號(hào)取出來(lái)放在y中,是就緒表中的行號(hào)。OSRdyTbl[y]是取得就緒表中對(duì)應(yīng)行的值,OSUnMapTbl[OSRdyTbl[y]]是該行中最低的為1的位的位號(hào),也就是就緒表中的列號(hào)。然后(y<<3)是將y左移3位,再加上行號(hào),正好就是最高優(yōu)先級(jí)的任務(wù)的優(yōu)先級(jí)。
查找最高優(yōu)先級(jí)的任務(wù)也是用了兩條語(yǔ)句,時(shí)間快且確定。
最后舉例驗(yàn)證一下,就緒表和就緒組如下所示:
041418ihvnn77zmz7otk2z.png (17.42 KB, 下載次數(shù): 113)
下載附件
2013-7-14 16:10 上傳
由圖可知,OSRdyGrp為10000010B(十進(jìn)制130),應(yīng)對(duì)應(yīng)OSRdyTbl[1],而OSRdyTbl[1]為00001000,故最高優(yōu)先級(jí)任務(wù)為8+3=11。用程序代碼計(jì)算,OSUnMapTbl[130]為1,y值為1,表示對(duì)應(yīng)1號(hào)行,OSRdyTbl[1]的值為00001000B,OSUnMapTbl[OSRdyTbl[y]]的值為3,于是OSPrioHighRdy=1<<8+3=11,驗(yàn)證成功。
|
|