《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > μC/OS的任務調度實現方法及其在PowerPC上的優化
μC/OS的任務調度實現方法及其在PowerPC上的優化
摘要: μC/OSII繼承了μC/OS的算法,有執行效率高、占用空間小、實時性強和可擴展性好等特點,被移植到幾乎所有類型的CPU上,成為在嵌入式領域非常有影響力的RTOS。
Abstract:
Key words :

 μC/OS是Jean J.Labrosse開發的實時多任務內核,最初是為Motorola 8位處理器68HC11寫的。在后來的相關著作中,作者將代碼移植到了PC上,以便于更多的讀者學習。μC/OSII繼承了μC/OS的算法,有執行效率高、占用空間小、實時性強和可擴展性好等特點,被移植到幾乎所有類型的CPU上,成為在嵌入式領域非常有影響力的RTOS。然而,由于該實時內核是為8位CPU設計的,對于那些具有優先級算法硬件指令的CPU,僅做移植是很不夠的。

  1 基于優先級的任務調度

  一個基于優先級的實時多任務內核的任務調度機制需要實現下面三個核心的處理功能:

  ◆ 將任務置于就緒態;

  ◆ 將任務取消就緒態;

  ◆ 找出最高優先級的就緒態任務。

  在32位機上運行64個任務,可使用兩個32位的整型變量數組OSRdyTbl [2],建立一個64位的任務就緒態向量;每一位表示對應優先級的任務是否處于就緒態,例如OSRdyTbl [0]的第4位為1表示優先級為4的任務處于就緒態。構造如下的三個函數,用來完成設置任務就緒、取消任務就緒和尋找當前最高優先級的就緒任務。

  void SetTaskRdyBit(INT8U Prio){/*設置任務就緒態*/

  if(Prio>32) OSRdyTbl [1] |= (1 << (63Prio) );

  else OSRdyTbl [0] |= (1 << (31Prio) );

  }

  void ClrTaskRdyBit(INT8U Prio){ /*取消任務就緒態*/

  if(Prio>32) OSRdyTbl[1] &= ~(1 << (63Prio) );

  else OSRdyTbl[0] &= ~(1 << (31Prio) );

  }

  INT8U FindHigheSTRdyTask(void){ /*尋找最高優先級的就緒態任務*/

  INT32U temp;//中間變量

  INT8Uprio=0;

  if(OSRdyTbl[0] != 0){

  temp = OSRdyTbl[0];//就緒態任務中優先級最高者在OSRdyTbl[0]中

  }

  else{

  temp = OSRdyTbl[1]; //就緒態任務中優先級最高者在OSRdyTbl[1]中

  prio +=32;

  }

  while(temp <0x80000000){//逐位查找就緒態任務中優先級最高者

  temp <<=1;

  prio ++;

  }

  return(prio);

  }

  上述代碼可在任何處理器上實現所需的功能,沒有考慮任何的優化和改進。通過這樣的原理性函數,可以更好地理解多任務內核的任務調度。

  尋找最高優先級就緒態任務的函數調用頻率高,其執行時間直接影響內核的任務切換延遲時間,影響系統實時性。上述尋找最高優先級的就緒態任務的代碼,隨當前就緒任務的優先級不同,其循環次數也不同,導致其運行時間不確定。

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

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

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

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

  ① 設置任務進入就緒態

  OSRdyGrp |= ptcb>OSTCBBitY;

  OSRdyTbl[ptcb﹥OSTCBY] |= ptcb>OSTCBBitX;

 ?、?設置任務退出就緒態。

  y = OSTCBCur>OSTCBY;

  OSRdyTbl[y] &= ~OSTCBCur>OSTCBBitX;

  if (OSRdyTbl[y] == 0) {

  OSRdyGrp &= ~OSTCBCur>OSTCBBitY;

  }

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

  y = OSUnMapTbl[OSRdyGrp];

  SPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);

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

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

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

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

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

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

  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寄存器中

  }

  在這段代碼中,首先判斷前32個任務是否有處于就緒態的,如果沒有的話,再對后32個任務進行判斷。由于優先級最低的空閑任務總是處于就緒態,所以后32個任務總能返回一個有效值。該代碼在前32個任務有就緒態時運行7條指令,在前32個任務均沒有就緒時需要執行10條指令;而μC/OS原有的代碼編譯出來的匯編程序,則需要運行15條指令。

  使用這個方法的另一個好處是不再需要使用256字節的OSUnMapTbl表,任務控制塊TCB也不需要使用OSTCBX、OSTCBY和OSTCBBitY、OSTCBBitX變量,每個ECB中也不再需要OSRdyGrp,這也減少了對ROM和RAM的占用。

  4 改進擴展任務數的優先級調度性能

  當對μC/OSII支持的任務數進行擴展時,按照μC/OSII原有的做法,需要按照高低字節分別查找OSUnMapTbl對照表。任務數為256時,尋找最高優先級就緒任務的函數將需要運行約35條指令。數出前導零數目的指令在這種情況下的作用將更加顯著,對于32位PowerPC處理器,精心設計的代碼可以做到僅需10條指令就將任務數擴展到1024個。

  此時OSRdyGrp擴展為32位,OSrdyTbl擴展成32個32位的數組。從OSRdyGrp得到的前導零數目,就是任務優先級高5位的值,乘以4可以得到該字的相對偏移地址;在OSRdyTbl中,定義高位對應高優先級任務,低位對應低優先級任務,則其前導零數目就是任務優先級低5位的值,和高5位的值移位相加就得到完整的任務優先級。通過將OSRdyGrp和OSRdyTbl定義成結構體,利用結構體首地址的相對尋址來分別讀取其數值,可以減少一次取地址的操作。

  尋找最高優先級就緒態的最終代碼如下:

  typedef struct {//定義結構體

  INT32U Tbl[32];

  INT32U Grp;

  } OSTaskRdyBlock;

  OSTaskRdyBlock OSRdy;//定義全局變量OSRdy

  asm INT16U FindHighestRdyTask(void){

  lisr5,OSRdy@ha//將OSRdy結構體指針載入r5寄存器

  orir5,r5,OSRdy@l

  lwzr3,128(r5)//OSRdy.Grp在結構體中具有固定偏移量

  cntlzwr3,r3//數出OSRdyGrp的前導零數目

  slwir6,r3,2//得到OSRdyTbl的地址偏移量

  lwzxr4,r6,r5//通過結構體指針,讀取OSRdy.Tbl的對應字

  cntlzwr4,r4//計算OSRdyTbl對應字的前導零數目

  slwir3,r3,5//任務優先級高5位移位

  addr3,r4,r3//和優先級低5位相加,得到完整優先級

  blr//返回

  }

  在64位的PowerPC 更有cntlzd(Count Leading Zero Double word)指令,一次就可以找出64個任務中優先級最高的那個,就更沒有必要使用μC/OSII中的算法了。

  5 總結

  RTOS實時內核μC/OS和μC/OSII中,任務調度算法巧妙,性能優異,在嵌入式應用領域很有影響力,被移植到各種CPU上。然而由于是為8位CPU設計的,對于那些具有優先級硬件算法指令的16/32/64位CPU,μC/OSII的軟件算法就完全失去了優勢。應該利用這類CPU的特有指令,優化任務調度算法,使RTOS的實時性達到最佳。對于這類處理器,僅移植μC/OSII軟件算法是很不夠的,應該利用相關硬件算法指令。

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          亚洲欧美成人精品| 99精品视频网| 亚洲欧美一区二区三区极速播放| 亚洲精品免费在线播放| 亚洲中字黄色| 亚洲永久在线观看| 亚洲精品免费看| 欧美精品一区二区三区蜜臀| 国产精品一区一区三区| 精久久久久久久久久久| 国产欧美日韩视频在线观看| 久久久午夜精品| 亚洲美女在线视频| 欧美理论电影网| 亚洲欧洲久久| 亚洲日本在线视频观看| 亚洲人成精品久久久久| 国产精品久久久久久亚洲毛片| 国产欧美日本在线| 欧美在线视频观看| 在线亚洲免费视频| 午夜精品久久久久久久99热浪潮| 91久久久亚洲精品| 国产精品久久久久久久久久妞妞| 国产精品视频一| 亚洲黄一区二区三区| 欧美日韩美女一区二区| 久久全球大尺度高清视频| 欧美aaa级| 免费观看久久久4p| 极品少妇一区二区三区| 亚洲一区精品在线| 国产午夜精品理论片a级大结局| 欧美三级黄美女| 亚洲片国产一区一级在线观看| 亚洲一区区二区| 国产精品视频大全| 久久精品一区二区三区中文字幕| 国产一区二区三区四区在线观看| 国产精品爽黄69| 一区二区三区高清视频在线观看| 欧美在线高清| 亚洲欧洲精品一区| 午夜精彩国产免费不卡不顿大片| 久久精品视频在线免费观看| 久久99在线观看| 国产午夜一区二区三区| 免费日韩av片| 久热精品在线| 久久琪琪电影院| 中文欧美日韩| 激情视频一区| 欧美精品久久久久久久久老牛影院| 日韩午夜视频在线观看| 欧美日韩视频在线观看一区二区三区| 欧美一区二区在线免费观看| 亚洲一级二级| 日韩系列在线| 在线亚洲精品| 亚洲国产成人在线视频| 麻豆精品精华液| 午夜精品视频网站| 性做久久久久久免费观看欧美| 日韩视频永久免费观看| 欧美成年人视频网站| 欧美一区二区日韩一区二区| 国产一区 二区 三区一级| 国产午夜精品全部视频播放| 黄色成人小视频| 亚洲午夜精品视频| 国产乱码精品一区二区三区忘忧草| 国产午夜一区二区三区| 亚洲日本欧美日韩高观看| 亚洲深夜影院| 国产主播精品在线| 一区二区日韩伦理片| 日韩亚洲国产欧美| 国产一区在线免费观看| 欧美区国产区| 国产乱码精品| 亚洲大片精品永久免费| 欧美日韩一二三区| 欧美一区二区三区的| 久久视频一区| 亚洲大胆视频| 亚洲精品美女久久7777777| 欧美一级视频一区二区| 精品不卡在线| 亚洲欧洲精品成人久久奇米网| 99精品国产在热久久婷婷| 日韩视频国产视频| 久久人人97超碰国产公开结果| 国产亚洲永久域名| 免费日韩成人| 免费成人av资源网| 欧美日韩视频在线一区二区| 欧美日韩亚洲高清| 亚洲高清资源综合久久精品| 日韩视频欧美视频| 亚洲国产欧美一区| 欧美日韩一区二区三区视频| 久久女同互慰一区二区三区| 亚洲精品无人区| 国产精品一区二区视频| 亚洲精品小视频在线观看| 国产一区日韩一区| 欧美国产三级| 亚洲一区影音先锋| 欧美日韩亚洲一区二区| 久久免费高清| 一本色道精品久久一区二区三区| 美女精品视频一区| 久久精品日韩一区二区三区| 免费成人毛片| 欧美 日韩 国产 一区| 亚洲欧美偷拍卡通变态| 亚洲欧美电影院| 国产精品日本精品| 欧美激情第4页| 亚洲国产日韩一区二区| 国产精一区二区三区| 国产精品成人免费精品自在线观看| 国产精品久久久久久久第一福利| 在线免费精品视频| 欧美精品一区三区| 99精品福利视频| 国产精品免费看片| 亚洲国产一区二区在线| 亚洲精品乱码久久久久久| 免费一级欧美片在线观看| aa日韩免费精品视频一| 黄色工厂这里只有精品| 亚洲精品网址在线观看| 亚洲综合色自拍一区| 欧美激情导航| 1000部国产精品成人观看| 欧美天堂亚洲电影院在线观看| 美女黄色成人网| 欧美久久久久久久| 一区二区三区在线观看欧美| 六十路精品视频| 国产精品久久久久影院色老大| 国产精品红桃| 夜夜嗨av一区二区三区四区| 国产精品免费观看在线| 美女999久久久精品视频| 国产精品爽爽ⅴa在线观看| 欧美一区二区三区四区在线观看地址| 久久综合影视| 欧美一区精品| 国产精品永久免费观看| 亚洲国产精品久久久久婷婷884| 亚洲国产精品久久久久婷婷884| 国产精品日韩在线| 欧美性片在线观看| 美日韩免费视频| 亚洲午夜电影在线观看| 久久久精品一区二区三区| 99国产成+人+综合+亚洲欧美| 亚洲理论电影网| 亚洲国产美国国产综合一区二区| 精品电影一区| 日韩午夜中文字幕| 国产精品三级视频| 尤物在线观看一区| 国产亚洲欧美aaaa| 欧美日韩一区二区三| 亚洲精选视频在线| 国产九九精品视频| 久久久99久久精品女同性| 欧美深夜影院| 国产精品免费区二区三区观看| 久久先锋资源| 亚洲无吗在线| 国产麻豆精品theporn| 国产精品婷婷午夜在线观看| 亚洲视屏一区| 久久久www成人免费无遮挡大片| 牛夜精品久久久久久久99黑人| 国产精品午夜av在线| 国产精品爽爽爽| 国产欧美日韩视频一区二区三区| 国产精品丝袜xxxxxxx| 欧美视频中文字幕| 亚洲国产精品一区二区第一页| 亚洲人成在线观看一区二区| 欧美丝袜第一区| 一区二区在线免费观看| 在线成人性视频| 国产精品日韩欧美大师| 亚洲视频欧美视频| 久久在线播放| 美女999久久久精品视频| 欧美激情性爽国产精品17p| 欧美午夜宅男影院| 香蕉久久夜色精品国产使用方法| 欧美日韩成人在线| 久久久噜噜噜久久狠狠50岁| 亚洲伊人久久综合| 欧美精品三级日韩久久| 欧美一区二区成人6969| 亚洲精品国产精品乱码不99按摩| 亚洲欧美高清| 一区二区亚洲欧洲国产日韩| 在线国产日韩| 久久久亚洲影院你懂的| 亚洲精选中文字幕| 午夜国产精品影院在线观看| 久久久综合网站| 韩国av一区二区三区四区| 韩日欧美一区二区三区| 激情综合激情| 欧美成人免费在线| 老鸭窝亚洲一区二区三区| 国产亚洲欧美另类一区二区三区| 国产精品一二三四| 亚洲精品一级| 欧美久久久久久久| 国产三级欧美三级日产三级99| 国产精品亚洲成人| 欧美日韩国产免费| 在线播放国产一区中文字幕剧情欧美| 狠狠色综合网| 最新日韩精品| 欧美日韩专区| 国产综合视频在线观看| 亚洲欧美一区二区原创| 欧美在线视频一区| 亚洲电影有码| 亚洲人成人一区二区三区| 亚洲国产欧美不卡在线观看| 亚洲伦理自拍| 狠狠色狠狠色综合日日tαg| 久久在线精品| 亚洲精品在线看| 在线观看欧美日本| 久久精品视频在线播放| 免费观看30秒视频久久| 欧美久久一区| 久久香蕉国产线看观看av| 国产精品成人v| 在线观看成人一级片| 久久婷婷国产综合精品青草| 鲁大师影院一区二区三区| 99热精品在线观看| 久久资源av| 亚洲国产精品va| 欧美成人有码| 欧美日韩精品在线视频| 日韩亚洲在线观看| 欧美mv日韩mv国产网站app| 国产精品专区h在线观看| 亚欧成人在线| 一区二区三区日韩欧美| 国产精品福利影院| 亚洲黄色在线视频| 亚洲免费av观看| 亚洲六月丁香色婷婷综合久久| 欧美精选一区| 亚洲精品一区二区三区av| 国产精品乱码人人做人人爱| 国内综合精品午夜久久资源| 亚洲人体影院| 亚洲国产美女久久久久| 亚洲精品国产精品久久清纯直播| 久久久视频精品| 亚洲嫩草精品久久| 免费在线视频一区| 韩国女主播一区二区三区| 国产主播精品在线| 国产精品久久77777| 日韩午夜三级在线| 国产美女精品在线| 久久综合国产精品| 久久久91精品国产一区二区精品| 亚洲欧洲精品成人久久奇米网| 久久精品视频免费播放| 欧美精品福利| 欧美日韩精品免费观看视频完整| 国产日韩欧美制服另类| 国产精品视频一区二区高潮| 欧美视频在线观看一区| 一本久久综合亚洲鲁鲁五月天| 亚洲欧美在线x视频| 好吊妞**欧美| 欧美三区不卡| 亚洲免费视频观看| 久久精品国内一区二区三区| 国产精品久久99| 午夜精品久久| 国产自产精品| 国产日产精品一区二区三区四区的观看方式| 国产麻豆精品theporn| 国产精品区一区| 一区二区在线视频播放| 亚洲精品欧美极品| 国精品一区二区三区| 欧美日韩国产免费观看| 娇妻被交换粗又大又硬视频欧美| 激情成人综合| 欧美色播在线播放| 亚洲一区二区欧美| 伊人久久亚洲热| 欧美日韩在线综合| 亚洲在线一区| 国产精品日韩一区二区| 欧美三区免费完整视频在线观看| 亚洲精品国产品国语在线app| 91久久精品日日躁夜夜躁欧美| 99这里有精品| 久久国产精品久久久| 亚洲狼人综合| 国产精品美女久久久久av超清| 狠狠做深爱婷婷久久综合一区| 日韩午夜av电影| 在线欧美一区| 久久天堂av综合合色| 红杏aⅴ成人免费视频| 有码中文亚洲精品| 久久久久久久综合狠狠综合| 嫩草伊人久久精品少妇av杨幂| 亚洲在线观看免费视频| 亚洲欧美制服中文字幕| 国产乱码精品一区二区三区av| 欧美日韩亚洲一区在线观看| 欧美日韩一区二区三区在线看| 一本色道婷婷久久欧美| 亚洲欧美在线一区|