为了提高查找任务就绪表的速度,建立了一个常量数组和任务就绪表,如图:
图1
图2
图1是从rt-thread中截取的,没错rt-thread的任务调度就是模仿ucosii的。如果没有常量表,在不用前导0命令CLZ的情况下,只能通过循环的形式搜索就绪表中的最高任务优先级。所以个人认为搜索任务的实时性受到微小干扰,是否影响实时性还有待继续深究。Freertos是实时跟踪最高优先级就绪任务,搜索最高优先级就绪任务时只判断该优先级列表是否为空(几乎不可能出现),为空就往下一级,所以freertos不用这些位图。这个常量数组是美国的科学家研究得出的。
图2是任务就绪表示意图,来自ucosii入门教程(任哲).ppt,ucosii搜索任务用的原理大概就是这个图所表现的,详情请翻阅ppt 37页。
关键函数:
OS_Sched():任务级调度器;查找最高级就绪任务,如果就绪任务表有比当前任务高级的就触发中断(由汇编函数OS_TASK_SW()触发),然后在PendSV中断里进行切换任务;
OS_SchedNew():实现查找最高级就绪任务算法,供OS_Sched()调用;
OSCtxSw:触发PendSV中断,供OS_Sched()调用。
OSPendSV:中断函数,由汇编代码实现任务的切换