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