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