UCOS-iii 任务调度

任务调度的时机:
1、当前任务给其他任务发信号,结束时调用。
    任务调用提交服务函数OS???Post(), 发送信号量或消息给其它任务时调度发生

2、任务调用OSTimeDly()或OSTimeDlyHMSM();

    如果延时参数不是0,调度发生。调度会在该任务被放入挂起队列后马上执行。

3、任务所等待的事件发生或超时。

4、任务取消挂起时调度发生。

5、新任务被创建时发生。

6、任务被删除时发生。

7、内核对象被删除时。

    任务所等待的内核对象被删除时(事件标志组、信号量、消息队列、 mutex都是内核对象), 这些任务就可能被就绪。 然后调度发生。

8、任务改变自身优先级或其它任务优先级时,调度发生。

9、任务调用OSTaskSuspend()停止自身时,调度发生。

10、任务调用OSTaskResume()恢复其它停止了的任务时,调度发生。

11、当退出中断服务程序时,调度发生。这种情况下,调度器调用OSIntExit()函数开始调度而不是OSSched()。

12、用OSSchedLock()锁调度器,调度发生。需要注意的是,锁调度器可以被嵌套,解锁次数必须等于加锁次数。

13、用OSSchedRoundRobinYield()任务放弃了分配给它的时间片时发生调度。

14、用户程序调用OSSched()时。


任务调度任务级:OSSched(),

任务调度中断级:OSIntExit(),

OS_SchedRoundRobin():时间片轮转调度时的相关函数,主要是把对应优先级的第一个TCB块,移动到最后一个。下次再找最高优先级的就绪任务时,就找到了相同优先级的的下一个任务的TCB。

猜你喜欢

转载自blog.csdn.net/register_k/article/details/80003577