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位

相关文章
相关标签/搜索