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位