μC/OS2Ⅱ中優(yōu)先級(jí)調(diào)度算法的改進(jìn)及實(shí)現(xiàn)
將任務(wù)放入就緒表
在這種方法中,用一個(gè)字節(jié)的最高兩位存放索引信息(對(duì)應(yīng)于圖5中的OSRdyXY),則意味著將就緒
表分為4個(gè)部分,因此,若要將任務(wù)放入就緒表,首先要通過(guò)索引信息確定任務(wù)優(yōu)先級(jí)在就緒表中的哪個(gè)部分,然后再通過(guò)行和列信息確定任務(wù)優(yōu)先級(jí)的具體位置。其中,變量OSRdyXY,OSRdyGrp[]以及OS2RdyTbl0[]~OSRdyTbl3[]的關(guān)系如圖5所示,圖中的數(shù)字0~255僅為清楚起見(jiàn)表示索引信息或任務(wù)優(yōu)先級(jí),并非實(shí)際存放的狀態(tài)信息。
將就緒任務(wù)放入就緒表的具體代碼可用如下方法實(shí)現(xiàn):
OSRdyXY=prio> > 6;
OSRdyGrp[OSRdyXY]| =OSMapTbl[prio> > 3];
if (OSRdyXY==0X00)
OSRdyTbl0[prio> > 3]| =OSMapTbl[prio 0X07];
if (OSRdyXY==0X01)
OSRdyTbl1[(prio> > 3) 0X07]| =OSMapTbl[prio 0X07];
if (OSRdyXY==0X02)
OSRdyTbl2[(prio> > 3) 0X07]| =OSMapTbl[prio 0X07];
if (OSRdyXY=0X03)
OSRdyTbl3[(prio> > 3) 0X07]| =OSMapTbl[prio 0X07];
其中,char OSMapTbl[]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80} ,prio表示任務(wù)的優(yōu)先級(jí)。
從就緒表中刪除任務(wù)
當(dāng)任務(wù)脫離就緒態(tài)時(shí),可以用下面的代碼對(duì)存放該任務(wù)優(yōu)先級(jí)的變量中的相應(yīng)位清零:
OSRdyXY=prio> > 6;
if (OSRdyXY==0X00)
if ( (OSRdyTbl0[prio> > 3] =~OSMapTbl[prio 0X07]) ==0)
OSRdyGrp[OSRdyXY] =~OSMapTbl[prio> > 3];
if (OSRdyXY==0X01)
if ( (OSRdyTbl1[(prio> > 3) 0X07] =~OSMapTbl[prio 0X07]) ==0)
OSRdyGrp[OSRdyXY] =~OSMapTbl[prio> > 3];
if (OSRdyXY==0X02)
if ( (OSRdyTbl2[(prio> > 3) 0X07] =~OSMapTbl[prio 0X07]) ==0)
OSRdyGrp[OSRdyXY] =~OSMapTbl[prio> > 3];
if (OSRdyXY==0X03)
if ( (OSRdyTbl3[(prio> > 3) 0X07] =~OSMapTbl[prio 0X07]) ==0)
OSRdyGrp[OSRdyXY] =~OSMapTbl[prio> > 3];
判定最高優(yōu)先級(jí)就緒任務(wù)的方法
使用以上方法建立就緒表之后,我們?nèi)匀豢梢岳迷械膬?yōu)先級(jí)判定表格OSUnMapTbl ( [256]) ,對(duì)最高優(yōu)先級(jí)就緒任務(wù)進(jìn)行查找,并且不需要象第一種方法那樣增加變量。具體的查找算法如下:
if ( (OSRdyGrp[0] 0XFF) ! =0) {
y=OSUnMapTbl[OSRdyGrp[0]];
x=OSUnMapTbl[OSRdyTbl0[y]];
prio=( y 3) + x;}
else if ( (OSRdyGrp[1] 0XFF) ! =0) {
y=OSUnMapTbl[OSRdyGrp[1]];
x=OSUnMapTbl[OSRdyTbl1[y]];
prio=( y 3) + x+ 64;}
else if ( (OSRdyGrp[2] 0XFF) ! =0) {
y=OSUnMapTbl[OSRdyGrp[2]];
x=OSUnMapTbl[OSRdyTbl2[y]];
prio=( y 3) + x+ 128;}
else{
y=OSUnMapTbl[OSRdyGrp[3]];
x=OSUnMapTbl[OSRdyTbl3[y]];
prio=( y 3) + x+ 192;}
兩種方法的比較
上面詳細(xì)介紹了擴(kuò)展μC/OS2Ⅱ內(nèi)核可管理任務(wù)數(shù)目的兩種方法。下面從幾個(gè)方面討論兩種改進(jìn)的調(diào)度算法的優(yōu)劣。首先,從代碼數(shù)量上看,第一種方法代碼數(shù)量要遠(yuǎn)少于第二種方法,這也就意味著第一種方法的代碼平均執(zhí)行時(shí)間必然少于第二種方法的代碼執(zhí)行時(shí)間;其次,從把就緒任務(wù)放入就緒表的所用時(shí)間來(lái)看,第一種方法可以直接確定位置,將就緒任務(wù)放入就緒表,而第二種方法中,必須順序查找,然后才能確定就緒任務(wù)在就緒表中的位置,第一種方法所用時(shí)間明顯少于第二種方法;最后,從查找最高優(yōu)先級(jí)就緒任務(wù)所需的時(shí)間來(lái)看,第一種方法通過(guò)變量ox和oy直接確定所有就緒任務(wù)中的哪一個(gè)任務(wù)優(yōu)先級(jí)最高,而第二種方法必須從最高優(yōu)先級(jí)開(kāi)始順序查找,直到找到第一個(gè)處于就緒狀態(tài)的任務(wù)才結(jié)束查找,這種方法花費(fèi)的時(shí)間顯然要比第一種方法多。是否能夠快速判定最高優(yōu)先級(jí)就緒任務(wù)是整個(gè)調(diào)度算法的最關(guān)鍵問(wèn)題,因此通過(guò)以上分析,可以看出第一種方法顯然要大大優(yōu)于第二種方法。
綜上所述,我們?cè)诶?μC/OS2Ⅱ源碼公開(kāi)的基礎(chǔ)上,對(duì)原有的內(nèi)核任務(wù)優(yōu)先級(jí)調(diào)度算法進(jìn)行修改,介紹了兩種不同的方法把可管理任務(wù)從原來(lái)的64個(gè)增加到256個(gè),使其可應(yīng)用于多于64個(gè)任務(wù)的復(fù)雜的工程項(xiàng)目開(kāi)發(fā)。并且通過(guò)比較得出結(jié)論,第一種算法要優(yōu)于第二種算法,第一種算法在理論上更簡(jiǎn)潔清楚,并且更加易于實(shí)現(xiàn),已經(jīng)在實(shí)際的開(kāi)發(fā)中得到應(yīng)用。
評(píng)論