调度是内核的主要职责之一,调度就是决定该轮到哪个任务运行了。 多数实时内核是基于优先级调度法的,每个任务根据其重要程序的不同被赋予一定的优先级,基于优先级的调度法指CPU 总是让处在就绪态的优先级最高的任务先运行。 然而究竟何时让高优先级任务掌握CPU 的使用权,有两种不同的情况,这要看用的是什么类型的内核,是非占先式的还是占先式的内核。
μC/OS-Ⅱ是一个基于优先级的实时操作系统。 在μC/OS-Ⅱ中,一个任务就像其他C 语言函数一样,有返回值类型和参数,但任务函数是一个无限循环,所以它绝不会返回任何的数据,故返回类型应该定义为void。 每个任务必须赋予一定的优先级,而且各自的优先级必须不同,优先级数越高,优先级越低,因此“0”优先级的任务具有最高的优先级,通过在Os_cfg.h文件中定义宏Os_lowest_prio,可以决定系统中任务的个数。 系统目前占用的两个任务为空闲任务idle task 和统计任务stat task。 当没有其他任务进入就绪状态时,空闲任务投入运行,空闲任务什么也不做,只是简单地将计数器加“1”,这个计数器可以用来统计CPU 的利用率。
μC/OS-Ⅱ是占先式的实时多任务内核,优先级最高的任务一旦准备就绪,则就拥有CPU的所有权并开始投入运行。 μC/OS-Ⅱ中每个任务的优先级要求不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务,并进行上下文切换。 函数ossched(void)进行任务调度。 任务调度函数结构如下:(www.xing528.com)
上面这个函数称作任务调度的前导函数。 它先判断要进行任务切换的条件,如果条件允许进行任务调度,则调用OSCtxSw()。 函数OSCtxSw()是真正实现任务调度的函数。 由于在调用OSCtxSw()期间要对堆栈进行操作,所以OSCtxSw()一般用汇编语言写成。 本函数由OS_TASK_SW 宏调用,OS_TASK_SW 由OSSched 函数调用,OSSched 函数负责任务之间的调度;OSCtxSw 函数的工作是先将当前任务的CPU 现场保存到该任务的堆栈中,然后获得最高优先级任务的堆栈指针,并从该堆栈中恢复此任务的CPU 现场,使之继续执行,这时该函数完成了一次任务切换。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。