ucos 最高任务优先级 OS_SchedNew () 最高256个优先级 源码分析

ucos任务最高支持256个,但是大部分的只是说64个,所以现在给出256的分析,与64的一样,只是8*8变为16*16

OSRdyGrp和OSRdyTbl是16位的

static  void  OS_SchedNew (void)

{

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

    INT8U   y;

    y    = OSUnMapTbl[OSRdyGrp];

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

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

    INT8U     y;

    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

}

ucos 最高任务优先级 OS_SchedNew () 最高256个优先级 源码分析

这是OSRdyGrp和OSRdyTbl为8位时的图片,256时就便X、Y为4位,OSRdyGrp和OSRdyTbl为16位

你可能感兴趣的:((),ucos,OS_SchedNew,最高256个优先级,最高任务优先级)