创建一个任务。它接收三个参数,分别是任务的入口地址,任务堆栈的首地址和任务的优先级。调用本函数后,系统会根据用户给出的参数初始化任务栈,并把栈顶指针保存到任务控制块中,在任务就绪表标记该任务为就绪状态。最后返回,这样一个任务就创建成功了。
当一个任务将要运行时,便通过取得它的堆栈指针(保存在任务控制块中)将这些寄存器出栈装入CPU 相应的位置即可。
6.4 如何实现抢占式调度?
基于任务优先级的抢占式调度,也就是最高优先级的任务一旦处于就绪状态,则立即抢占正在运行的低优先级任务的处理器资源。为了保证CPU 总是执行处于就绪条件下优先级最高的任务,每当任务状态改变后,即判断当前运行的任务是否是就绪任务中优先级最高的,否则进行任务切换。
任务状态会在什么时候发生改变呢?有下面两种情况:
1、高优先级的任务因为需要某种资源或延时,主动请求挂起,让出处理器,此时将调度就绪状态的低优先级任务获得执行,这种调度称为任务级的切换。如任务执行OSTimeDly或OSTaskSuspend把自身挂起就属于这种。
2、高优先级的任务因为时钟节拍到来,或在中断处理结束后,内核发现更高优先级任务获得了执行条件(如延时的时钟到时)则在中断后直接切换到更高优先级任务执行。这种调度也称为中断级的切换。
6.5 挂起/恢复任务
1挂起任务
通过 OSTaskSuspend可以主动挂起一个任务。OSTaskSuspend会把任务从任务就绪表中移出,最后重新启动系统调度。这个函数可以挂起任务本身也可以挂起其他任务。