看了书,对uC/OS-II的任务调度又重新认识了,好书啊。
uC/OS-II有两种任务调度器:任务级的调度器OSSched(),中断级的调度器OSIntExt()。
OSSched()的任务调度部分
调度首先要做的就是找到当前最高优先级的任务并运行它,在uC/OS-II中,我们在任务就绪表中找到最高优先级任务标识(即它的优先级),进而获得该任务的依据——任务控制块。
因为找到最高优先级别并不难,所以调度器OSSched()的算法也简单。如下:
y = OSUnMapTbl[OSRdyGrp];
OSPrioHighRdy = (INT8U)((y<<3) + OSUnMapTbl[OSRdyTbl[y]]);
通过上面两行代码将当前最高优先级的任务的优先级存放在OSPrioHighRdy变量中。然后通过此变量从存放任务控制块指针的数组OSTCBPrioTbl[]中获得该任务的任务控制块指针,并存放在指针变量OSTCBHighRdy中。代码如下:
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
只要获得了最高就绪任务的任务控制块指针,再加上存放在指针变量OSTCBCur中的当前运行任务的任务控制块,就可以进行任务切换的工作了。
OSSched()代码如下:
void OS_Sched (void)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
I