《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > μC/OS優先級調度機制在PowerPC上的優化
μC/OS優先級調度機制在PowerPC上的優化
單片機與嵌入式系統
龔光華,車惠軍 清華大學
摘要: RTOS實時內核μC/OS和μC/OSII中,任務調度算法巧妙,性能優異,在嵌入式應用領域很有影響力,被移植到各種CPU上。然而由于是為8位CPU設計的,對于那些具有優先級硬件算法指令的16/32/64位CPU,μC/OSII的軟件算法就完全失去了優勢。應該利用這類CPU的特有指令,優化任務調度算法,使RTOS的實時性達到最佳。對于這類處理器,僅移植μC/OSII軟件算法是很不夠的,應該利用相關硬件算法指令。
Abstract:
Key words :

摘要: μC/OSII實時操作系統被移植到幾乎所有CPU上,在我國嵌入式領域頗具影響力。μC/OS和μC/OSII是為8位CPU設計的,對于具有優先級算法硬件指令的32位中高端CPU,則應該對其任務調度算法做進一步優化,以得到更好的系統實時響應。本文以一款PowerPC系列中的中低端單片機為例,說明如何使用優先級算法硬件指令改進任務調度算法。

關鍵詞: μC/OS;PowerPC;優先級調度;前導零計算

Optimization of μC/OS Task Switching Scheme in PowerPC Architecture
Gong Guanghua1,Che Huijun2
(1. Dept. of Engineering Physics, Tsinghua Univ.,Beijing 100084,China;2. Beijing National Railway Research&Design Institute of Signal&Communication)
Abstract: Realtime multitask kernel μC/OS and μC/OSII are ported to almost all popular processors and are widely used in China. As originally designed for 8 bit microcontroller, the kernel is not aware of nor utilizes the hardware priority calculation instruction that exists in some highperformance 32 bit microcontroller families. Based on MPC5554 from Freescale PowerPC embedded microcontroller, this article shows how the hardware priority calculation instruction is used to improve the system response latency.
Key words: μC/OS; PowerPC; task switching; count leading zero instruction

  μ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];
OSPrioHighRdy = (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>
          亚洲午夜在线观看视频在线| 久久日韩粉嫩一区二区三区| 国产精品一区久久| 国产精品成人免费视频| 欧美性猛片xxxx免费看久爱| 久久高清一区| 国产在线观看精品一区二区三区| 国产小视频国产精品| 欧美夫妇交换俱乐部在线观看| 国产精品第三页| 香港久久久电影| 国产精品黄色在线观看| 精品99视频| 欧美电影在线免费观看网站| 亚洲视频在线播放| 久久成人久久爱| 欧美成人69av| 国产精品日韩二区| 亚洲黄色有码视频| 久久综合伊人77777尤物| 欧美成人影音| 狠狠综合久久av一区二区老牛| 91久久综合亚洲鲁鲁五月天| 久久综合亚州| 亚洲国产高清视频| 欧美伊人精品成人久久综合97| 亚洲另类春色国产| 一区二区亚洲欧洲国产日韩| 国产色婷婷国产综合在线理论片a| 国产精品久久久久久久久动漫| 国产日产欧美一区| 99亚洲精品| 国产精品免费网站在线观看| 久久不射电影网| 亚洲欧洲综合另类| 亚洲一线二线三线久久久| 亚洲最黄网站| 国内成+人亚洲| 国产在线乱码一区二区三区| 性感少妇一区| 国产精品日韩一区| 欧美性理论片在线观看片免费| 欧美高清在线| 黄网站免费久久| 亚洲综合色丁香婷婷六月图片| 亚洲国产婷婷| 亚洲一区日本| 最近中文字幕mv在线一区二区三区四区| 欧美三级日韩三级国产三级| 国产精品日韩欧美一区二区三区| 欧美涩涩网站| 韩国精品在线观看| 狠狠色综合日日| 欧美三级资源在线| 国产精品美女| 欧美日韩国产电影| 国产精品日韩精品欧美在线| 欧美另类一区二区三区| 99热精品在线| 亚洲欧美亚洲| 亚洲午夜电影在线观看| 久久综合导航| 久久精品视频免费| 午夜精彩视频在线观看不卡| 欧美一区二区三区在线| 国产一区二区三区黄| 久久精品国产一区二区电影| 午夜宅男欧美| 亚洲精品日韩精品| 午夜国产精品影院在线观看| 欧美福利网址| 米奇777超碰欧美日韩亚洲| 亚洲无限乱码一二三四麻| 在线成人激情黄色| 国产视频一区欧美| 久久夜色精品国产欧美乱极品| 欧美日韩一级黄| 亚洲美女视频在线免费观看| 久久成人18免费观看| 欧美一级久久久久久久大片| 99在线热播精品免费99热| 在线观看日韩av先锋影音电影院| 老司机一区二区三区| 亚洲美女啪啪| 欧美不卡一区| 一区二区三区不卡视频在线观看| 欧美日韩aaaaa| 亚洲精美视频| 黄色成人小视频| 一区二区三区在线视频免费观看| 欧美日韩三级电影在线| 久久综合电影一区| 欧美精品一区在线发布| 国产欧美在线观看| 久久福利视频导航| 亚洲在线网站| 久久久精品国产免费观看同学| 亚洲午夜久久久久久尤物| 亚洲欧美日韩一区二区三区在线| 玉米视频成人免费看| 亚洲第一页自拍| 亚洲高清视频在线| 亚洲午夜激情网站| 国产区精品在线观看| 午夜精品福利一区二区三区av| 欧美电影电视剧在线观看| 午夜精品99久久免费| 欧美国产精品劲爆| 国产日韩高清一区二区三区在线| 国产欧美精品一区二区三区介绍| 国产精品久久久久久av下载红粉| 国产一区二区精品在线观看| 国产精品麻豆欧美日韩ww| 欧美日韩免费观看一区=区三区| 怡红院av一区二区三区| 欧美激情在线观看| 欧美在线观看视频一区二区三区| 亚洲免费视频中文字幕| 欧美高清在线| 国产一区二区三区黄视频| 亚洲永久字幕| 美日韩丰满少妇在线观看| 亚洲视频一区二区免费在线观看| 国产视频欧美视频| 欧美日韩国产bt| 亚洲午夜电影在线观看| 亚洲欧洲一区二区在线播放| 亚洲男人av电影| 一本色道久久综合亚洲91| 韩国一区二区三区在线观看| 欧美一区二区在线播放| 国产伦精品一区二区三区高清| 久久综合九色九九| 久久av一区二区三区亚洲| 国产精品免费观看在线| 久久久亚洲欧洲日产国码αv| 亚洲一区自拍| 国产日韩精品视频一区| 国产亚洲成av人片在线观看桃| 国产精品国产三级国产普通话蜜臀| 亚洲免费av电影| 亚洲日产国产精品| 国产精品免费网站| 久久在精品线影院精品国产| 鲁鲁狠狠狠7777一区二区| 欧美日韩精品| 你懂的视频一区二区| 亚洲精品综合在线| 99精品热6080yy久久| 国产精品久久777777毛茸茸| 亚洲人成在线观看| 国产精品日韩在线播放| 久久精品中文字幕免费mv| 久久在线免费视频| 亚洲国产专区| 国产精品久久久久久久久免费樱桃| 亚洲午夜精品一区二区三区他趣| 国产亚洲成人一区| 欧美主播一区二区三区| 欧美日韩精品国产| 美国十次了思思久久精品导航| 国产精品欧美一区二区三区奶水| 欧美一区二区在线免费播放| 欧美成人在线免费视频| 欧美精品在线观看| 在线观看91久久久久久| 狠狠色狠狠色综合日日小说| 中文在线资源观看视频网站免费不卡| 一区二区三区四区五区精品视频| 日韩午夜免费视频| 在线一区日本视频| 亚洲成在人线av| 欧美α欧美αv大片| 国产精品99久久久久久人| 一二美女精品欧洲| 国产日韩精品综合网站| 亚洲午夜av在线| 宅男在线国产精品| 国产一区二区成人| 1000精品久久久久久久久| 国产精品国产三级国产普通话三级| 欧美日韩在线综合| 亚洲高清视频在线| 久久精品一区二区三区四区| 欧美一激情一区二区三区| 国产精品一区二区久激情瑜伽| 中国女人久久久| 欧美成人精品一区| 午夜精品久久久久久久白皮肤| 国产精品乱码久久久久久| 亚洲人成网站精品片在线观看| 久久午夜色播影院免费高清| 最新中文字幕一区二区三区| 国产午夜久久| 一区二区激情视频| 国产一区二区三区奇米久涩| 亚洲欧美日韩一区在线| 欧美在线观看视频| 午夜精品久久久久久久男人的天堂| 麻豆成人av| 狠狠综合久久av一区二区老牛| 亚洲精品国久久99热| 国产欧美日韩麻豆91| 一本色道久久精品| 久久久久国产精品一区二区| 国产精品美女久久久| 国产日韩在线看| 久久亚洲视频| 亚洲精品久久| 免费欧美在线| 国产精品久久久久9999| 欧美性猛片xxxx免费看久爱| 最新亚洲视频| 欧美欧美在线| 国产精品久线观看视频| 亚洲深夜影院| 在线日韩欧美视频| 欧美jizz19hd性欧美| 国产欧美精品一区二区色综合| 欧美www视频在线观看| 久久国产黑丝| 国产精品无码专区在线观看| 亚洲主播在线观看| 欧美精品午夜视频| 国产亚洲一区二区三区在线播放| 欧美福利视频网站| 亚洲国产精品成人久久综合一区| 欧美三级在线| 欧美人牲a欧美精品| 噜噜噜在线观看免费视频日韩| 国产精品久久综合| 欧美女激情福利| 国产在线拍偷自揄拍精品| 久久露脸国产精品| 亚洲人成网站777色婷婷| 国产精品日韩精品欧美精品| 国产一区二区三区视频在线观看| 欧美日韩一区二区在线| 国产综合久久久久影院| 国产午夜精品全部视频播放| 欧美国产一区二区| 亚洲精品视频在线观看网站| 欧美日韩亚洲不卡| 久久蜜桃香蕉精品一区二区三区| 欧美成人精品在线| 久久国产精品电影| 久久精品亚洲热| 国产精品区一区二区三区| 国产精品人人爽人人做我的可爱| 美女视频一区免费观看| 久久久一区二区| 国产日韩精品电影| 欧美日本国产在线| 久久久久国内| 欧美成人有码| 国产精品久久久久久久第一福利| 久久亚洲一区二区| 狠狠爱成人网| 久久国产福利国产秒拍| 亚洲国产成人精品久久久国产成人一区| 韩国视频理论视频久久| 免费久久99精品国产自| 欧美a级一区二区| 有坂深雪在线一区| 宅男噜噜噜66一区二区66| 久久久国产精品亚洲一区| 国产一区二区三区四区三区四| 蜜桃av一区| 欧美—级a级欧美特级ar全黄| 亚洲激情视频在线| 亚洲精品视频啊美女在线直播| 尤物视频一区二区| 国产精品一区二区在线观看| 日韩网站免费观看| 西瓜成人精品人成网站| **性色生活片久久毛片| 亚洲精品一区二区三区四区高清| 国模叶桐国产精品一区| 久久精品视频导航| 欧美精品免费在线观看| 欧美日韩综合视频网址| 国内精品**久久毛片app| 国产主播精品在线| 欧美日韩视频第一区| 亚洲日韩中文字幕在线播放| 久久久免费观看视频| 在线色欧美三级视频| 欧美日韩综合网| 欧美日韩免费一区二区三区视频| 午夜久久久久久久久久一区二区| 亚洲第一天堂无码专区| 欧美chengren| 亚洲啪啪91| 亚洲精品国产精品国自产观看| 国产一区二区精品久久| 欧美日韩一区二区视频在线观看| 一区二区三区精品久久久| 欧美成人综合网站| 亚洲欧洲日本在线| 国产亚洲人成网站在线观看| 国产精品国产精品国产专区不蜜| 久久久久久网| 一区二区三区精密机械公司| 日韩一级免费观看| 亚洲性av在线| 亚洲日本无吗高清不卡| 欧美一区激情视频在线观看| 国模套图日韩精品一区二区| 亚洲六月丁香色婷婷综合久久| 亚洲午夜精品一区二区| 久久精品在线观看| 在线不卡亚洲| 亚洲国产一区二区a毛片| 欧美不卡高清| 亚洲高清视频在线| 国产精品qvod| 韩日精品视频一区| 亚洲国产精品999| 99精品福利视频| 欧美人与禽猛交乱配| 精久久久久久久久久久| 亚洲视频国产视频| 欧美三日本三级少妇三2023| 欧美日韩高清在线观看| 国产精品视频精品| 欧美精品aa| 欧美伊人精品成人久久综合97| 国产精品日韩欧美一区二区三区|