μC/OS2Ⅱ中優(yōu)先級(jí)調(diào)度算法的改進(jìn)及實(shí)現(xiàn)
該算法在擴(kuò)展了系統(tǒng)可管理任務(wù)數(shù)目的同時(shí),考慮了如何在任務(wù)數(shù)目增大時(shí),還能夠快速進(jìn)行最高優(yōu)先級(jí)就緒任務(wù)判定的問(wèn)題,并給出了一種快速的判定方法。在介紹判定最高優(yōu)先級(jí)就緒任務(wù)的方法之前,先描述μC/OS2Ⅱ中原有的優(yōu)先級(jí)判定表格OSUnMapTbl ( [256]),該表格為16×16的數(shù)組,每個(gè)數(shù)組元素的值是固定的。當(dāng)使用該表格時(shí),數(shù)組下標(biāo)轉(zhuǎn)換為相應(yīng)的八位二進(jìn)制,其中高四位對(duì)應(yīng)數(shù)組的行,低四位對(duì)應(yīng)數(shù)組的列(假設(shè)最右邊的一位是第0位bit0) ,由此就可查表判斷一組任務(wù)就緒態(tài)任務(wù)中優(yōu)先級(jí)最高的那個(gè)任務(wù)所在的位置(查表后返回的值在0到7之間) ,再經(jīng)過(guò)計(jì)算,就可得到最高優(yōu)先級(jí)就緒任務(wù)的優(yōu)先級(jí)。
為了減少不必要的工作,在判定最高優(yōu)先級(jí)就緒任務(wù)的方法中,利用了上面介紹的優(yōu)先級(jí)判定表格OSUnMapTbl ( [256]) ,把改進(jìn)后的優(yōu)先級(jí)就緒表看作一個(gè)類似二維坐標(biāo)的平面(如圖3所示) ,使256個(gè)
任務(wù)優(yōu)先級(jí)平均分布在4個(gè)象限中(圖中的數(shù)字0~255表示256個(gè)任務(wù)優(yōu)先級(jí),每個(gè)位置實(shí)際存放的是任務(wù)優(yōu)先級(jí)的狀態(tài)信息) ,同時(shí)使用了兩個(gè)變量ox和oy來(lái)共同確定任務(wù)的優(yōu)先級(jí)所在象限,并由此進(jìn)一步查找最高優(yōu)先級(jí)的就緒任務(wù)。
變量ox和oy的取值情況如圖3所示,下面的查找最高優(yōu)先級(jí)算法首先從判斷優(yōu)先級(jí)所在的象限開始進(jìn)行查找。具體代碼如下:
oy=OSRdyGrp 0X00FF ;
if ( oy==0)
y=OSUnMapTbl[OSRdyGrp> > 8]+ 8;
else
y=OSUnMapTbl[oy];
ox=OSRdyTbl[y] 0X00FF ;
if ( ox==0)
x=OSUnMapTbl[OSRdyTbl[y]> > 8]+ 8;
else
x=OSUnMapTbl[ox];
prio=( y 4) + x;
例如,如果OSRdyGrp的值為0X0068,則利用上面的代碼,首先可以判斷oy! =0,則查優(yōu)先級(jí)判定表格得到OSUnMapTbl[oy]的值為3,假設(shè)OSRdyTbl[3]的值為0X00E4,則可判斷ox! =0,再查優(yōu)先級(jí)判定表格得到OSUnMapTbl[ox]的值為2,最后計(jì)算得到任務(wù)的優(yōu)先級(jí)prio為50。
μC/OS2Ⅱ中優(yōu)先級(jí)調(diào)度算法的第二種改進(jìn)方法
在μC/OS2Ⅱ中,原來(lái)的優(yōu)先級(jí)調(diào)度算法只使用了一個(gè)字節(jié)中的6位,剩余兩位空閑。在第一種改進(jìn)方法中,我們是直接擴(kuò)展了定位就緒任務(wù)優(yōu)先級(jí)在就緒表中位置的行和列信息的比特位。現(xiàn)在介紹的第二種方法是利用原來(lái)存放優(yōu)先級(jí)的字節(jié)中剩余的兩位作為索引,重建就緒表,使任務(wù)優(yōu)先級(jí)擴(kuò)展到256個(gè)。這里需要增加一個(gè)變量OSRdyXY,用于存放索引信息,另外還要使用變量OSRdyGrp[]存放任務(wù)優(yōu)先級(jí)的行信息,OSRdyTbl0[ ],OSRdyTbl1[ ],OSRdyTbl2[ ]和OSRdyTbl3[ ]4個(gè)8位數(shù)組用于存放每個(gè)優(yōu)先級(jí)的任務(wù)是否就緒的信息。這種方法的任務(wù)優(yōu)先級(jí)字節(jié)的定義如圖4所示。
評(píng)論