看了书,对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 C

本文深入探讨了uC/OS-II操作系统中的任务调度机制,包括任务级和中断级的调度器,重点解析了OSSched()如何找到并运行最高优先级任务,以及任务切换的过程。文中详细阐述了任务上下文的保存与恢复,强调了任务控制块在调度过程中的关键作用,并指出调度的触发时机。

2344

被折叠的 条评论
为什么被折叠?



