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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > μC/OS優(yōu)先級調度機制在PowerPC上的優(yōu)化

          μC/OS優(yōu)先級調度機制在PowerPC上的優(yōu)化

          作者: 時間:2010-11-25 來源:網絡 收藏

          2 μC/OS的任務調度實現方法

            μC/OS和μC/OSII是為8位寫的,采用8位機算法,支持64個任務。使用8個字節(jié)的OSRdyTbl全局數組,表示所有任務的就緒態(tài)信息:1為任務就緒,0為非就緒。數組第一個字節(jié)的b0位代表64個任務中優(yōu)先級最高的任務,最后一個字節(jié)的b7位代表優(yōu)先級最低的空閑任務,永遠為1。當OSRdyTbl 數組的數據不為0時(表示對應的8個任務中至少有1個進入就緒態(tài)),另一個單字節(jié)全局變量OSRdyGrp 中的相應位要置1。當任務狀態(tài)發(fā)生變化時,需更新OSRdyGrp和OSRdyTbl中對應的位。

            尋找最高優(yōu)先級的就緒任務時,μC/OS使用了預先固化的256字節(jié)的對照表OSUnMapTbl,給出特定字節(jié)值的最低位1所在位的信息。查表算法避免了逐位檢測各優(yōu)先級位引起的執(zhí)行時間的不確定性,程序簡單,執(zhí)行速度快,與就緒任務多少和優(yōu)先級無關。

            對于取值0~63的任務優(yōu)先級,μC/OS將其劃分成高3位的Y和低3位的X,并保存在其任務控制塊TCB的OSTCBX和OSTCBY中,其對應的OSUnMapTbl的值保存在OSTCBBitY和OSTCBBitX變量中,以提高運算速度。為了避免函數調用所帶來的額外開銷,μC/OS直接用語句實現如下的三部分功能。

          ① 設置任務進入就緒態(tài)

          OSRdyGrp |= ptcb>OSTCBBitY;
          OSRdyTbl[ptcb博OSTCBY] |= ptcb>OSTCBBitX;

          ② 設置任務退出就緒態(tài)。

          y = OSTCBCur>OSTCBY;
          OSRdyTbl[y] = ~OSTCBCur>OSTCBBitX;
          if (OSRdyTbl[y] == 0) {
            OSRdyGrp = ~OSTCBCur>OSTCBBitY;
          }

          ③ 尋找最高優(yōu)先級的就緒態(tài)任務。以OSRdyGrp的值做偏移量,查OSUnMapTbl表,得到1個0到7的數Y,作為優(yōu)先級高3位,再根據Y的值,找出OSRdyTbl中對應的字節(jié),并且再次查OSUnMapTbl表,得到1個0到7的數X,作為優(yōu)先級低3位的值,通過將Y左移3位再加上X的值,得到就緒任務中優(yōu)先級最高的那個。

          y = OSUnMapTbl[OSRdyGrp];
          OSPrioHighRdy = (INT8U)((y 3) + OSUnMapTbl[OSRdyTbl[y]]);

            μC/OS的任務調度算法采用了以空間換時間的策略,將特定字節(jié)值的最低位1所在位的信息預先計算并保存到表中,運行時通過查表快速得到;每個任務的TCB中除了保存優(yōu)先級信息本身外,還使用額外的4個字節(jié)保存優(yōu)先級的高低3位和對應的OSUnMapTbl值,以避免運行時實時計算這幾個值所帶來的延遲。這些措施增加了系統(tǒng)ROM和RAM的開銷。

          3 利用PowerPC“數出前導零數目”指令實現任務調度

            PowerPC是Motorola 、IBM和Apple三家公司于20世紀90年代初期聯合設計的32位。Freescale(其前身是Motorola半導體部)發(fā)展了針對汽車電子的MPC5xx系列單片機及后續(xù)基于e200內核的MPC5xxx系列單片機;更高端的e500、e600內核是用于通信領域的MPC6xxx、7xxx和8xxx系列。

            下面對μC/OS任務優(yōu)先級調度算法的改進和優(yōu)化是在MPC5554單片機上實現的。

            PowerPC處理器具有一條“數出前導零數目” 的指令cntlzw(count leading zero word),可以以硬件指令方式實現優(yōu)先級的多任務調度算法。這條指令也可用于圖像處理和算法加密的場合。該指令數出一個32位寄存器中前置零的數目,例如,返回0表示b0不為零,即沒有前導零;返回3表示b3不為零,b3位的前面從b0到b2共有3個零;返回32表示RS寄存器中所有的位都為零。(在PowerPC架構中,最高位MSB表示為b0,低位MSB根據位寬表示為b7、b15或b31。)

            利用這條指令,用匯編語言改寫尋找最高優(yōu)先級的就緒任務的函數,則不需要進行循環(huán)移位判斷,可以直接從64個任務中找出優(yōu)先級最高的那個任務。代碼如下:

          asm INT8U FindHighestRdyTask(void){
            lisr5,OSRdyTbl@ha//讓r5寄存器指向OSRdyTbl[]
            orir5,r5,OSRdyTbl@l
            lwzr3,0(r5)//將OSRdyTbl[0]的值載入r3寄存器
            cntlzwr3,r3//計算OSRdyTbl[0]中前導零數目
            cmpi0,0,r3,32//判斷前32個任務是否就緒
            bne __FindEnd//如果前導零數目為32,說明前32個任務均未就緒,需要從后32個任務中尋找
            lwzr4,4(r5)//將OSRdyTbl[1]的值載入r4寄存器
            cntlzwr4,r4//計算OSRdyTbl[1]的前導零數目
            addir3,r4,32//后32個任務需要加上偏移量
            __FindEnd:
            blr //返回值保存在r3寄存器中
          }

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


          關鍵詞: 嵌入式 CPU

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁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); })();