<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

          作者: 時間:2012-04-06 來源:網(wǎng)絡(luò) 收藏


          將任務(wù)放入

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



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

          將就緒任務(wù)放入就緒表的具體代碼可用如下方法實現(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)先級。

          從就緒表中刪除任務(wù)

          當任務(wù)脫離就緒態(tài)時,可以用下面的代碼對存放該任務(wù)優(yōu)先級的變量中的相應(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)先級就緒任務(wù)的方法

          使用以上方法建立就緒表之后,我們?nèi)匀豢梢岳迷械膬?yōu)先級判定表格OSUnMapTbl ( [256]) ,對最高優(yōu)先級就緒任務(wù)進行查找,并且不需要象第一種方法那樣增加變量。具體的查找算法如下:
          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)核可管理任務(wù)數(shù)目的兩種方法。下面從幾個方面討論兩種改進的調(diào)度算法的優(yōu)劣。首先,從代碼數(shù)量上看,第一種方法代碼數(shù)量要遠少于第二種方法,這也就意味著第一種方法的代碼平均執(zhí)行時間必然少于第二種方法的代碼執(zhí)行時間;其次,從把就緒任務(wù)放入就緒表的所用時間來看,第一種方法可以直接確定位置,將就緒任務(wù)放入就緒表,而第二種方法中,必須順序查找,然后才能確定就緒任務(wù)在就緒表中的位置,第一種方法所用時間明顯少于第二種方法;最后,從查找最高優(yōu)先級就緒任務(wù)所需的時間來看,第一種方法通過變量ox和oy直接確定所有就緒任務(wù)中的哪一個任務(wù)優(yōu)先級最高,而第二種方法必須從最高優(yōu)先級開始順序查找,直到找到第一個處于就緒狀態(tài)的任務(wù)才結(jié)束查找,這種方法花費的時間顯然要比第一種方法多。是否能夠快速判定最高優(yōu)先級就緒任務(wù)是整個調(diào)度算法的最關(guān)鍵問題,因此通過以上分析,可以看出第一種方法顯然要大大優(yōu)于第二種方法。

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


          上一頁 1 2 3 4 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();