ucos 最高任務優先級 OS_SchedNew () 最高256個優先級 源碼分析

ucos任務最高支持256個,可是大部分的只是說64個,因此如今給出256的分析,與64的同樣,只是8*8變爲16*16spa

OSRdyGrp和OSRdyTbl是16位的圖片

static  void  OS_SchedNew (void)it

{io

#if OS_LOWEST_PRIO <= 63u      /* See if we support up to 64 tasks                   */程序

    INT8U   y;方法

    y    = OSUnMapTbl[OSRdyGrp];im

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

#else                                            /* We support up to 256 tasks                         */img

    INT8U     y;di

    OS_PRIO  *ptbl;

    //這是優先級超過64時,計算任務最高優先級方法

    //OSRdyGrp爲16位,y值越小,它的優先級越高,因此若是低8位有了須要調度的程序,那麼沒有必要再去考慮        高8位狀況  

    if ((OSRdyGrp & 0xFFu) != 0u) {

        y = OSUnMapTbl[OSRdyGrp & 0xFFu];

    } else {

    //高8位  8*16部分

        y = OSUnMapTbl[(OS_PRIO)(OSRdyGrp >> 8u) & 0xFFu] + 8u;

    }

    ptbl = &OSRdyTbl[y];

    if ((*ptbl & 0xFFu) != 0u) {

        OSPrioHighRdy = (INT8U)((y << 4u) + OSUnMapTbl[(*ptbl & 0xFFu)]);  //16因此須要左移4位

    } else {

        OSPrioHighRdy = (INT8U)((y << 4u) + OSUnMapTbl[(OS_PRIO)(*ptbl >> 8u) & 0xFFu] + 8u);

    }

#endif

}

這是OSRdyGrp和OSRdyTbl爲8位時的圖片,256時就便X、Y爲4位,OSRdyGrp和OSRdyTbl爲16位

相關文章
相關標籤/搜索