经过一段时间的学习,对系统的任务切换算是有了那么一点点的认识吧,只所以写这篇文章,是因为我想对自己的一些见解做一个备忘,如果看到这篇文章的人,觉得我说的有什么不对,那么请指正,我会感激不尽的。其实这也是为什么很多系统选择开源的原因吧,希望搜集广大共同学习者的意见,大家共同提升。
首先说一下这个任务调度函数OS_Sched (void)吧,任务调度函数的的主要任务是找出优先级最高的任务,然后触发PendSV中断。而真正的任务任务切换,进行偷梁换柱就是在PendSV的中断函数里面完成的,在这个中断函数里面,主要进行任务的进栈和出栈,把CPU里面的寄存器内容换掉,即把事发当场的现场改变成要切换任务的现场,在中断进行返回的时候好让另外一个任务运行。这就是所谓的任务切换。。。
然后OS_Sched (void)函数主要被那些函数进行调用呢?在任务要给任务调度器开锁的时候会调用OS_Sched (void),在时钟节拍中断服务函数中返回时也会调用OS_Sched (void),还有在某个任务的执行过程中创建一个任务,OS_Sched (void)也会被调用,删除任务的时候也会调用OS_Sched (void),改变任务优先级的时候,挂起任务,恢复任务等等,......,因为uCOS是一个实时的抢占式系统,总是执行最高优先级的任务,所以当要进行任务切换的时候,就会调用OS_Sched (void)。
还有一个问题是,在OSStart()中,启动多任务的时候,也触发了一个PendSV中断,那么这个是不是任务切换呢?在我的理解当中,我个人觉得,其实这也是一次任务切换。