任务切换分为两种,一是任务级的切换,而是中断级的切换;
1,任务级的切换是利用OSTimeDly()函数进行,这个函数首先给本任务赋予一个延时的节拍数,即是将本任务挂起多少个节拍,然后调用OS_Sched()进行任务切换,任务切换首先看是否有已经就绪的任务,如果没有,则运行空闲任务OS_TaskIdle();
2、此时,时钟节拍中断函数,将会调用OSTimeTick()对每个任务的延时节拍进行自减,若有自减为0的任务,则将该任务就绪,也有多个就绪的可能,然后在时钟节拍中断函数退出之前,调用OSIntExit()对就绪的最高优先级的任务进行堆栈弹出,中断退出后即是最高级的任务在运行;
3,除时钟节拍中断函数,在普通用户的自定义中断里面,也是可以调用OSIntExit()进行任务切换,此时的切换,主要是一些因信号量、邮箱等挂起的任务,在此中断里,可以对那些挂起的任务进行信号量邮箱的消息的发送,以致于在调用OSIntExit()时更新高优先级任务就绪状态并运行。
|