一步一步教你使用uCOS-II( 五 )


一步一步教你使用uCOS-II

文章插图
可以这么理解,UCOS-II的每一个任务都有一个CPU,任务在运行时占用CPU的全部资源,同时拥有自己的一套寄存器,当任务执行完毕后(时间片到),他把自己的CPU寄存器所有内容保存到自己的堆栈中,同时把CPU让给别的任务,那么得到CPU使用权的任务把自己的CPU寄存器从自己的堆栈中放到真正的CPU寄存器中开始运行,就这样周而复始 。
大家一定不要把任务的运行当成是函数的调用,这完全是两回事 。这个我们到后面的任务调度时在细说 。每个任务都是一个无限的循环 。每个任务都处在以下 5种状态之一的状态下,这5种状态是休眠态, 就绪态、 运行态、 挂起态(等待某一事件发生)和被中断态(参见下图) 休眠态相当于该任务驻留在内存中,但并不被多任务内核所调度 。就绪意味着该任务已经准备好, 可以运行了, 但由于该任务的优先级比正在运行的任务的优先级低, 还暂时不能运行 。运行态的任务是指该任务掌握了 CPU 的控制权,正在运行中 。挂起状态也可以叫做等待事件态,指该任务在等待,等待某一事件的发生, (例如等待某外设的 I/O 操作,等待某共享资源由暂不能使用变成能使用状态, 等待定时脉冲的到来或等待超时信号的到来以结束目前的等待,等等)。最后,发生中断时,CPU提供相应的中断服务,原来正在运行的任务暂不能运行,就进入了被中断状态 。如下图表示μC/OS-Ⅱ中一些函数提供的服务,这些函数使任务从一种状态变到另一种状态 。
一步一步教你使用uCOS-II

文章插图
简单的我们可以把每一次任务的切换当成一次中断,这个中断不同于我们在使用前后台模式时的中断,那个中断是硬件中断,中断时需要保存的CPU寄存器是由硬件实现的,而在UCOS中的任务切换是软中断,CPU保存了必要的寄存器后在切换时系统会在保存任务使用的寄存器 。
补充知识-可剥夺型内核和不可剥夺型内核
不可剥夺型内核
不可剥夺型内核要求每个任务自我放弃CPU 的所有权 。不可剥夺型调度法也称作合作型多任务,各个任务彼此合作共享一个 CPU 。异步事件还是由中断服务来处理 。中断服务可以使一个高优先级的任务由挂起状态变为就绪状态 。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃 CPU 的使用权时,那个高优先级的任务才能获得 CPU的使用权 。
不可剥夺型内核允许每个任务运行,直到该任务自愿放弃 CPU的控制权 。中断可以打入运行着的任务 。中断服务完成以后将 CPU 控制权还给被中断了的任务 。任务级响应时间要大大好于前后系统,但仍是不可知的,商业软件几乎没有不可剥夺型内核 。
不可剥夺型内核的工作过程见下图:
一步一步教你使用uCOS-II

文章插图
可剥夺型内核
当系统响应时间很重要时,要使用可剥夺型内核 。因此,μC/OS-Ⅱ以及绝大多数商业上销售的实时内核都是可剥夺型内核 。最高优先级的任务一旦就绪, 总能得到CPU 的控制权 。当一个运行着的任务使一个比它优先级高的任务进入了就绪态, 当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了 CPU的控制权 。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行 。使用可剥夺型内核,最高优先级的任务什么时候可以执行,可以得到 CPU的控制权是可知的 。使用可剥夺型内核使得任务级响应时间得以最优化 。