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位