任务调度的时机:
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。