久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

ucos OS_SchedNew

作者:佚名   來源:本站原創   點擊數:  更新時間:2014年04月27日   【字體:

  說明:這個函數由ucos的其他服務調用,用來決定即將運行的優先級最高的任務。它改變全局變量OSPrioHighRdy。

 
  參數:無
 
  返回值:無
 
  注意:    這個函數是內部函數,外部應用無法調用。
            這個函數被調用時,中斷被假定為關閉。
 
//新版本提供了對256個任務的支持,由 OS_SchedNew函數計算出優先級再交給OS_Sched使用。
//書上的版本是沒有這個函數的。
static  void  OS_SchedNew (void)                 
{
#if OS_LOWEST_PRIO <= 63u                //根據任務數是否大于64采取不同的計算方案
    INT8U   y;                            
    y  = OSUnMapTbl[OSRdyGrp];           // OSUnMapTbl可以理解為一個解碼表
    OSPrioHighRdy = (INT8U)((y << 3u) + OSUnMapTbl[OSRdyTbl[y]]);
                                         //OSReadyTbl的大小為【OS_LOWEST_PRIO/8+1】
 
 
#else                                    //任務數大于64時計算優先級的方法                              INT8U     y;
    OS_PRIO  *ptbl;                      //任務數大于64時 *ptbl是指向16位數的指針                      if ((OSRdyGrp & 0xFFu) != 0u)   
    //有任務優先級低于64的函數就緒時那高于64的就不要計算了,算了最高優先級也不是它   
    {   
        y = OSUnMapTbl[OSRdyGrp & 0xFFu];//數字后面加u表示無符號整形 
   
else 
{
        y = OSUnMapTbl[(OS_PRIO)(OSRdyGrp >> 8u) & 0xFFu] + 8u;
    }
    ptbl = &OSRdyTbl[y]; //OSReadyTbl的大小為【OS_LOWEST_PRIO/16+1】與任務數小于64時不同
    if ((*ptbl & 0xFFu) != 0u) 
    {
        OSPrioHighRdy = (INT8U)((y << 4u) + OSUnMapTbl[(*ptbl & 0xFFu)]);
   
    else 
    {
        OSPrioHighRdy = (INT8U)((y << 4u) + OSUnMapTbl[(OS_PRIO)(*ptbl >> 8u) & 0xFFu] + 8u);
    }
#endif
}
補上詳細的計算方法:
                           1.任務數小于64的情況
    先明確幾個變量的作用
    1.(u8)OSRdyGrp:每一個bit代表一個組,一共8組,每組管理8個任務(具體哪一個記錄在OSRdyTbl中)。
    2.(u8)OSPrioHighRdy:格式與OS_PRIO相同,記錄當前最高優先級任務的優先級。
    3.(u8)OS_PRIO:來自 EVENT CONTROL BLOCK(事件控制塊)用來記錄任務優先級,與優先級一對一關系。
    4.(u8)OSReadyTbl:就緒表啦!按bit排就是下面的樣子。
    

      當一個任務就緒時,必須在0SRdyGrp和OSRdyTbl中標記,標記方法如下。

      
      OSRdyGrp|=OSMapTbl[OS_PRIO>>3] //記錄組就緒標志   
      //OS_PRIO的yyy有2^3種取法,記錄組號TBL[yyy](就緒表第幾行)
      OSRdyTbl[prio>>3]|= OSMapTbl[OS_PRIO&0x07] //在TBL[yyy]上記錄列就緒標志(在就緒表中寫就緒標志)  
      //OS_PRIO&0x07就是XXX。OSMapTbl[OS_PRIO&0x07]把XXX轉換為位掩碼
      OSMapTbl數組如下 
      OSMapTbl[8]={00000001,00000010,00000100,00001000,00010000,00100000,01000000,10000000}
      這個數組就是把XXX或YYY轉換為上面格式,用來給OSRdyGrp,TBL[yyy]特定bit置1。
      
      OS_SchedNew的作用就是依靠0SRdyGrp和OSRdyTbl計算出就緒任務的最高優先級,解碼方法如下。
      
      y  = OSUnMapTbl[OSRdyGrp];           
      OSPrioHighRdy = (INT8U)((y << 3u) + OSUnMapTbl[OSRdyTbl[y]]);
      
       OSUnMapTbl[OSRdyGrp]確定最高就緒組YOSRdyGrp 比如最高就緒組是0組,那么OSRdyGrp的可能是00000001,00000011,00000101,00001001......11111111.一共2^7種。我們通過判斷置1的最小就緒位是0位就可以知道最高就緒組為0組。計算機(人視覺的并行處理比計算機強多了)也要一位一位判斷。先看第零位是不是1,是就是第零組,不是判斷第2位。那前幾位還好說,后面幾位的計算量是相當大的。不想算干脆用個已經算好的答案來映射吧。OSUnMapTbl就是這樣一個對答案數組(有效減少計算量)。

       OSUnMapTbl[OSRdyGrp]的值計算好后保存在Y中,OSRdyTbl[y]記錄的就是最高就緒組中的就緒情況。OSUnMapTbl[OSRdyTbl[y]]用答案表算出這組中最高就緒任務X(y << 3u)這個就是他在第幾組,一組8個任務,Y<<3相當于Y*8 OSPrioHighRdy就等于Y*8+X
      
                                2.任務數大于64的情況

     任務數大于64時任務就緒表就是16*16=256(OSRdyGrp和OSRdyTbl是16位的),可以管理256個任務了。
     if ((OSRdyGrp & 0xFFu) != 0u)       //判斷優先級前64位的任務是否就緒。
     {y = OSUnMapTbl[OSRdyGrp & 0xFFu];} //前128(8*16)個任務最高就緒級的計算方法和情況一是一樣的但是OSPrioHighRdy格式不是00YYYXXX 而是YYYYXXXX 2^4*2^4=256
     else
     {y = OSUnMapTbl[(OS_PRIO)(OSRdyGrp >> 8u) & 0xFFu] + 8u;}
     //OSUnMapTbl[(OS_PRIO)(OSRdyGrp >> 8u) & 0xFFu] 計算后八組加8就是表示前八組都沒有就緒。(一共16組)因為還是八組一起判斷的所以OSUnMapTbl可以通用。
     ptbl = &OSRdyTbl[y];                //這里用個指針來代替OSRdyTbl[y]應該有助于提高計算速度 
     if ((*ptbl & 0xFFu) != 0u) 
     {OSPrioHighRdy = (INT8U)((y << 4u) + OSUnMapTbl[(*ptbl & 0xFFu)]);
     else 
     {OSPrioHighRdy = (INT8U)((y << 4u) + OSUnMapTbl[(OS_PRIO)(*ptbl >> 8u) & 0xFFu] + 8u);}
     
     OSUnMapTbl[(*ptbl & 0xFFu)])X的前8位就緒
     OSUnMapTbl[(OS_PRIO)(*ptbl >> 8u) & 0xFFu] + 8u)X的后八位就緒要加8
     (y << 4u) 就是Y*16OSPrioHighRdy就等于Y*16+X
 
關閉窗口

相關文章

主站蜘蛛池模板: 欧美日韩一 | 色黄爽 | 午夜一区 | 日韩国产专区 | 日日夜精品视频 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 亚洲欧美在线观看 | 国产精品成人久久久久a级 久久蜜桃av一区二区天堂 | 一区二区三区在线观看免费视频 | 久久精品亚洲精品国产欧美 | 黄色欧美在线 | 人人爽日日躁夜夜躁尤物 | 91影院在线观看 | 黑人精品xxx一区一二区 | 激情网站在线观看 | 亚洲成人av在线播放 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 久久久久国产一区二区三区 | 亚洲精品乱| 久久久久一区二区 | 日本黄色大片免费 | 日韩1区2区| 国产91一区二区三区 | 日本亚洲精品成人欧美一区 | 欧美久久久久久 | 午夜91 | 成人精品一区二区三区中文字幕 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 久热9| 国产成人短视频在线观看 | 亚洲香蕉 | 欧美精品在线一区二区三区 | 日日操夜夜操天天操 | 东京av男人的天堂 | 精品视频在线观看 | 麻豆久久久久久久久久 | 亚洲精品专区 | 一区二区播放 | 亚洲国产精品成人综合久久久 | 观看毛片 | 91亚洲国产成人久久精品网站 |