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

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

關(guān)鍵詞: μC/OS;PowerPC;優(yōu)先級調(diào)度;前導(dǎo)零計(jì)算

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開發(fā)的實(shí)時多任務(wù)內(nèi)核,最初是為Motorola 8位處理器68HC11寫的。在后來的相關(guān)著作中,作者將代碼移植到了PC上,以便于更多的讀者學(xué)習(xí)。μC/OSII繼承了μC/OS的算法,有執(zhí)行效率高、占用空間小、實(shí)時性強(qiáng)和可擴(kuò)展性好等特點(diǎn),被移植到幾乎所有類型的CPU上,成為在嵌入式領(lǐng)域非常有影響力的RTOS。然而,由于該實(shí)時內(nèi)核是為8位CPU設(shè)計(jì)的,對于那些具有優(yōu)先級算法硬件指令的CPU,僅做移植是很不夠的。

1  基于優(yōu)先級的任務(wù)調(diào)度

  一個基于優(yōu)先級的實(shí)時多任務(wù)內(nèi)核的任務(wù)調(diào)度機(jī)制需要實(shí)現(xiàn)下面三個核心的處理功能:

◆ 將任務(wù)置于就緒態(tài);
◆ 將任務(wù)取消就緒態(tài);
◆ 找出最高優(yōu)先級的就緒態(tài)任務(wù)。

  在32位機(jī)上運(yùn)行64個任務(wù),可使用兩個32位的整型變量數(shù)組OSRdyTbl [2],建立一個64位的任務(wù)就緒態(tài)向量;每一位表示對應(yīng)優(yōu)先級的任務(wù)是否處于就緒態(tài),例如OSRdyTbl [0]的第4位為1表示優(yōu)先級為4的任務(wù)處于就緒態(tài)。構(gòu)造如下的三個函數(shù),用來完成設(shè)置任務(wù)就緒、取消任務(wù)就緒和尋找當(dāng)前最高優(yōu)先級的就緒任務(wù)。

void SetTaskRdyBit(INT8U Prio){/*設(shè)置任務(wù)就緒態(tài)*/
  if(Prio>32) OSRdyTbl [1] |= (1 << (63Prio) );
  else OSRdyTbl [0] |= (1 << (31Prio) );
}
void ClrTaskRdyBit(INT8U Prio){ /*取消任務(wù)就緒態(tài)*/
  if(Prio>32) OSRdyTbl[1] &= ~(1 << (63Prio) );
  else OSRdyTbl[0] &= ~(1 << (31Prio) );
}
INT8U FindHighestRdyTask(void){ /*尋找最高優(yōu)先級的就緒態(tài)任務(wù)*/
  INT32U temp;//中間變量
  INT8Uprio=0;
  if(OSRdyTbl[0] != 0){
    temp = OSRdyTbl[0];//就緒態(tài)任務(wù)中優(yōu)先級最高者在OSRdyTbl[0]中
  }
  else{
    temp = OSRdyTbl[1]; //就緒態(tài)任務(wù)中優(yōu)先級最高者在OSRdyTbl[1]中
    prio +=32;
  }
  while(temp <0x80000000){//逐位查找就緒態(tài)任務(wù)中優(yōu)先級最高者
    temp <<=1;
    prio ++;
  }
  return(prio);
}

  上述代碼可在任何處理器上實(shí)現(xiàn)所需的功能,沒有考慮任何的優(yōu)化和改進(jìn)。通過這樣的原理性函數(shù),可以更好地理解多任務(wù)內(nèi)核的任務(wù)調(diào)度。

  尋找最高優(yōu)先級就緒態(tài)任務(wù)的函數(shù)調(diào)用頻率高,其執(zhí)行時間直接影響內(nèi)核的任務(wù)切換延遲時間,影響系統(tǒng)實(shí)時性。上述尋找最高優(yōu)先級的就緒態(tài)任務(wù)的代碼,隨當(dāng)前就緒任務(wù)的優(yōu)先級不同,其循環(huán)次數(shù)也不同,導(dǎo)致其運(yùn)行時間不確定。

2  μC/OS的任務(wù)調(diào)度實(shí)現(xiàn)方法

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

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

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

① 設(shè)置任務(wù)進(jìn)入就緒態(tài)

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

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

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

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

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

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

3  利用PowerPC“數(shù)出前導(dǎo)零數(shù)目”指令實(shí)現(xiàn)任務(wù)調(diào)度

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

  下面對μC/OS任務(wù)優(yōu)先級調(diào)度算法的改進(jìn)和優(yōu)化是在MPC5554單片機(jī)上實(shí)現(xiàn)的。

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

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

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

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

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

4  改進(jìn)擴(kuò)展任務(wù)數(shù)的優(yōu)先級調(diào)度性能

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

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

  尋找最高優(yōu)先級就緒態(tài)的最終代碼如下:

typedef struct {//定義結(jié)構(gòu)體
  INT32U Tbl[32];
  INT32U Grp;
} OSTaskRdyBlock;
OSTaskRdyBlock  OSRdy;//定義全局變量OSRdy
asm INT16U FindHighestRdyTask(void){
  lisr5,OSRdy@ha//將OSRdy結(jié)構(gòu)體指針載入r5寄存器
  orir5,r5,OSRdy@l
  lwzr3,128(r5)//OSRdy.Grp在結(jié)構(gòu)體中具有固定偏移量
  cntlzwr3,r3//數(shù)出OSRdyGrp的前導(dǎo)零數(shù)目
  slwir6,r3,2//得到OSRdyTbl的地址偏移量
  lwzxr4,r6,r5//通過結(jié)構(gòu)體指針,讀取OSRdy.Tbl的對應(yīng)字
  cntlzwr4,r4//計(jì)算OSRdyTbl對應(yīng)字的前導(dǎo)零數(shù)目
  slwir3,r3,5//任務(wù)優(yōu)先級高5位移位
  addr3,r4,r3//和優(yōu)先級低5位相加,得到完整優(yōu)先級
  blr//返回
}

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

5  總結(jié)

  RTOS實(shí)時內(nèi)核μC/OS和μC/OSII中,任務(wù)調(diào)度算法巧妙,性能優(yōu)異,在嵌入式應(yīng)用領(lǐng)域很有影響力,被移植到各種CPU上。然而由于是為8位CPU設(shè)計(jì)的,對于那些具有優(yōu)先級硬件算法指令的16/32/64位CPU,μC/OSII的軟件算法就完全失去了優(yōu)勢。應(yīng)該利用這類CPU的特有指令,優(yōu)化任務(wù)調(diào)度算法,使RTOS的實(shí)時性達(dá)到最佳。對于這類處理器,僅移植μC/OSII軟件算法是很不夠的,應(yīng)該利用相關(guān)硬件算法指令。

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲视频久久| 亚洲国产欧美日韩另类综合| 在线观看成人av电影| 国产欧美在线看| 国产精品户外野外| 欧美四级电影网站| 欧美日韩国产精品一区| 欧美高清在线一区| 欧美3dxxxxhd| 欧美国产激情| 欧美精品情趣视频| 欧美国产精品| 欧美精品啪啪| 欧美日韩色综合| 欧美午夜电影完整版| 欧美日韩色婷婷| 欧美视频免费在线观看| 欧美日韩精品免费观看视频完整| 欧美成人一区二区三区在线观看| 欧美成人亚洲| 欧美激情按摩在线| 欧美日韩高清在线观看| 欧美日韩精品一区二区| 欧美日韩亚洲一区三区| 欧美午夜欧美| 国产精品欧美经典| 国产三区精品| 激情欧美日韩| 亚洲欧洲一区二区三区| 日韩午夜一区| 亚洲一区二区在线播放| 欧美一乱一性一交一视频| 欧美在线999| 91久久精品美女高潮| 日韩一级精品视频在线观看| 亚洲午夜性刺激影院| 午夜视频久久久久久| 欧美在线中文字幕| 久久综合久久综合九色| 欧美激情第三页| 欧美三级在线视频| 国产日产欧美a一级在线| 国产一区日韩一区| 亚洲国产综合在线看不卡| 99视频精品全国免费| 亚洲男同1069视频| 亚洲高清不卡一区| 中文精品一区二区三区 | 亚洲国产欧美国产综合一区| 亚洲精品在线二区| 亚洲一区尤物| 久久久国产一区二区三区| 欧美国产日韩在线| 国产精品女同互慰在线看| 精品88久久久久88久久久| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲国产婷婷香蕉久久久久久| 亚洲九九精品| 欧美一区二区在线免费观看| 免费观看一级特黄欧美大片| 欧美日韩一区二区在线播放| 国产一区999| 亚洲毛片av| 欧美亚洲免费电影| 在线午夜精品自拍| 久久亚洲精品伦理| 国产精品v亚洲精品v日韩精品| 国产一区二区三区日韩欧美| 亚洲黄色成人网| 午夜精品视频| 亚洲无毛电影| 蜜桃久久av| 国产麻豆成人精品| 亚洲九九爱视频| 伊人色综合久久天天五月婷| 一区二区三区国产盗摄| 亚洲国产天堂久久综合网| 亚洲欧美中文日韩v在线观看| 欧美freesex8一10精品| 国产精品网站在线| 日韩视频免费在线| 亚洲国产日韩欧美在线99| 午夜精品视频网站| 欧美日韩高清在线| 在线播放日韩欧美| 性久久久久久久久| 亚洲影视在线播放| 欧美日本韩国一区| 一区二区在线看| 欧美一区二区精品在线| 亚洲欧美精品在线| 欧美日韩一区自拍| 91久久精品一区| 久久精品女人天堂| 久久精品国产亚洲aⅴ| 国产精品久久久久久妇女6080| 91久久久久久久久| 久久精品欧美日韩精品| 欧美在线视频全部完| 国产精品久久77777| 日韩视频在线观看国产| 亚洲精品无人区| 美女日韩欧美| 国产一区二区三区av电影| 亚洲视频一二| 亚洲伊人第一页| 欧美日韩另类国产亚洲欧美一级| 亚洲国产欧美另类丝袜| 亚洲国产成人在线视频| 久久久夜精品| 国产一区二区三区视频在线观看 | 亚洲欧美日韩在线| 欧美午夜a级限制福利片| 亚洲日本成人在线观看| 91久久综合亚洲鲁鲁五月天| 久久亚洲精品一区二区| 国外成人在线| 欧美专区福利在线| 久久久www成人免费毛片麻豆| 国产酒店精品激情| 亚洲欧美日韩在线高清直播| 午夜久久久久| 国产伦精品一区二区三区在线观看 | 中文网丁香综合网| 欧美日韩一区二区三区四区在线观看 | 欧美一级片在线播放| 久久se精品一区精品二区| 国产欧美大片| 欧美一区日本一区韩国一区| 欧美专区在线播放| 国产永久精品大片wwwapp| 久久国产欧美日韩精品| 久久久综合精品| 精品福利电影| 亚洲三级视频| 欧美日韩三级一区二区| 一区二区免费在线观看| 亚洲欧美一区二区精品久久久| 国产精品户外野外| 午夜精品久久久久久| 久久国产精品久久w女人spa| 国产曰批免费观看久久久| 亚洲国产精品电影在线观看| 欧美高清在线一区| 亚洲最新色图| 欧美一区三区三区高中清蜜桃| 国内精品视频在线观看| 亚洲精品免费观看| 欧美日韩精品一区| 亚洲欧美激情视频在线观看一区二区三区| 久久高清免费观看| 在线观看欧美精品| 一区二区三区欧美亚洲| 国产精品电影观看| 欧美在线视频一区二区三区| 欧美电影专区| 在线视频免费在线观看一区二区| 久久精品国产亚洲高清剧情介绍| 在线国产欧美| 亚洲一区二区三区成人在线视频精品| 国产欧美激情| 亚洲精品一区二| 国产精品男女猛烈高潮激情| 久久99伊人| 欧美绝品在线观看成人午夜影视| 亚洲午夜一级| 裸体歌舞表演一区二区| 99热精品在线| 久久青青草原一区二区| 亚洲三级影院| 久久精品视频在线免费观看| 亚洲国产一区二区三区在线播| 亚洲欧美制服中文字幕| 136国产福利精品导航| 亚洲一区二三| 在线观看不卡| 亚洲欧美日韩视频二区| 亚洲成人在线免费| 性欧美大战久久久久久久久| 91久久精品日日躁夜夜躁欧美| 性8sex亚洲区入口| 亚洲级视频在线观看免费1级| 欧美一级在线视频| 亚洲精品国精品久久99热一| 久久精品亚洲精品国产欧美kt∨| 日韩视频免费在线观看| 久久一区二区三区国产精品| 99视频精品| 免费欧美在线视频| 午夜电影亚洲| 欧美日韩国产一区精品一区 | 久久精品国产久精国产思思| 国产精品高潮呻吟久久av无限| 91久久精品国产91久久性色| 国产精品日本欧美一区二区三区| 亚洲精品午夜| 精品成人一区二区| 欧美中文字幕在线观看| 中文成人激情娱乐网| 欧美大片网址|