uCOS+ii+任务调度

uc/os在很多情况下会发生任务切换 每个中断发生后，对应一个保护寄存器的过程，然后判断又没有更高优先级的任务，有则任务切换，无则弹出保存的寄存器 每个阻塞函数的使用都有可能产生任务切换，例如ostaskdly ossempend... 至于延时数，uc/os采用的递减方式，就是等待时间每次时钟节拍-1，直到满足条件 还有直接调用ostaskshedule也会产生任务切换 总之，它有两种切换方式，一种中断切换，一种任务切换

ucos-II是基于任务优先级抢占式任务调度法的，就是内核在管理调度时，调用任务切换函数（一般为 SSched（）），在该函数中将此时已处于就绪状态（条件一）并且为最高优先级（条件二）的任务的保存于其栈中的相应信息压入cpu寄存器中（软中断完 成），然后cpu开始运行该任务的代码. 内核是何时进行任务调度的呢？虽然uC/OS-II是可被剥夺资源的内核（高优先级可强行占有低优先级正在使用的资源），但此事发生的前提是内核实时"检测"到了更高就绪的优先级了，那么内核是怎样来实时检测的呢？ 带着这个问题让我们再来看看任务的结构——里边有函数OSTimeDly(OS_TICKS_PER_SEC)，一看就知道这是个延时函数，除了延时外它还会有其他用途呢？经查看其源码了解到里边有一条代码：OSSched（），对，函数OSTimeDly的作用就是将此时正在运行的 函数挂起（保存任务控制块OS_TCB中的相应信息）（任务控制块OS_TCB是系统分配给每个任务的信息存储单元），然后调用函数OSSched（）进行任务切换，进而执行就绪的最高优先级任务. 此刻，我们了解到uCOS-II的任务切换是在执行的任务中调用延时函数OSTimeDly进行的. 现在，我们来理一下思路：任务调用函数OSTimeDly，挂起任务和调用切换函数并设置延时时间 ——>周期性调用时钟节拍中断服务函数OSTickISR进行任务延时计数（OSTimTick完成），延时到时调用任务切换函数 OSSched,进行任务切换. 综上，任务切换有两种途径——时钟节拍中断服务函数OSTickISR进行切换，任务中调用时间延迟函数OSTimeDly进行切换. 从先后顺序来说，应该是OSTimeDly先发生（设置OSTCBDly），才会有时钟节拍中断函数OSTickISR进行切换的动作发生.