新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > μC/OS2Ⅱ中優(yōu)先級調度算法的改進及實現(xiàn)

μC/OS2Ⅱ中優(yōu)先級調度算法的改進及實現(xiàn)

作者: 時間:2012-04-06 來源:網絡 收藏


將任務放入

在這種方法中,用一個字節(jié)的最高兩位存放索引信息(對應于圖5中的OSRdyXY),則意味著將就緒



表分為4個部分,因此,若要將任務放入,首先要通過索引信息確定任務中的哪個部分,然后再通過行和列信息確定任務的具體位置。其中,變量OSRdyXY,OSRdyGrp[]以及OS2RdyTbl0[]~OSRdyTbl3[]的關系如圖5所示,圖中的數(shù)字0~255僅為清楚起見表示索引信息或任務,并非實際存放的狀態(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)先級就緒任務的方法

使用以上方法建立就緒表之后,我們仍然可以利用原有的優(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Ⅱ內核可管理任務數(shù)目的兩種方法。下面從幾個方面討論兩種改進的調度算法的優(yōu)劣。首先,從代碼數(shù)量上看,第一種方法代碼數(shù)量要遠少于第二種方法,這也就意味著第一種方法的代碼平均執(zhí)行時間必然少于第二種方法的代碼執(zhí)行時間;其次,從把就緒任務放入就緒表的所用時間來看,第一種方法可以直接確定位置,將就緒任務放入就緒表,而第二種方法中,必須順序查找,然后才能確定就緒任務在就緒表中的位置,第一種方法所用時間明顯少于第二種方法;最后,從查找最高優(yōu)先級就緒任務所需的時間來看,第一種方法通過變量ox和oy直接確定所有就緒任務中的哪一個任務優(yōu)先級最高,而第二種方法必須從最高優(yōu)先級開始順序查找,直到找到第一個處于就緒狀態(tài)的任務才結束查找,這種方法花費的時間顯然要比第一種方法多。是否能夠快速判定最高優(yōu)先級就緒任務是整個調度算法的最關鍵問題,因此通過以上分析,可以看出第一種方法顯然要大大優(yōu)于第二種方法。

綜上所述,我們在利用 μC/OS2Ⅱ源碼公開的基礎上,對原有的內核任務優(yōu)先級調度算法進行修改,介紹了兩種不同的方法把可管理任務從原來的64個增加到256個,使其可應用于多于64個任務的復雜的工程項目開發(fā)。并且通過比較得出結論,第一種算法要優(yōu)于第二種算法,第一種算法在理論上更簡潔清楚,并且更加易于實現(xiàn),已經在實際的開發(fā)中得到應用。


上一頁 1 2 3 4 下一頁

評論


相關推薦

技術專區(qū)

關閉