花生漫画

ADI公司ADuC系列单片机内核任务的状态分析

0
阅读(2543)

ADI公司ADuC系列单片机采用Uc/OSⅡ内核,它的每个任务都处在下图所示的5种状态之一,这5种状态是休眠态,就绪态、运行态、挂起态(等待某一事件发生)和被中断态。

任务的状态

休眠态相当于该任务驻留在内存中,但并不被多任务内核所调度。把任务交给uC/OC是通过调用下述两个函数之一:OSTaskCreate()或OSTaskCreateExt()。这些调用只是将任务的起始地址、优先级、要求的堆栈空间告诉uC/OC。

就绪态意味着该任务已经准备好,可以运行了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行。当任务一旦建立,这个任务就进入就绪态准备运行。任务的建立可以是在多任务运行开始之前,也可以是动态地被一个运行着的任务建立。如果一个任务是被另一个任务建立的,而这个任务的优先级高于建立它的那个任务,则这个刚刚建立的任务将立即得到CPU的控制权。一个任务可以通过调用OSTaskDel()返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。

运行态的任务是指该任务掌握了CPU的控制权,正在运行中。调用OSStart()可以启动多任务。OSStart()函数运行进入就绪态的优先级最高的任务。就绪的任务只有当所有优先级高于这个任务的任务转为等待状态,或者是被删除了,才能进入运行态。

挂起状态也可以叫做等待事件态WAITING,指该任务在等待,等待延时时间的到来或某一事件的发生。

正在运行的任务可以通过调用函数OSTimeDly()或OSTimeDlyHMSM()将自身延迟一段时间,这个任务于是进入等待状态,等待这段时间过去。下一个优先级最高的、并进入了就绪态的任务立刻被赋予了CPU的控制权。等待的时间过去以后,系统服务函数OSTimeTick()使延迟了的任务进入就绪态。

正在运行的任务期待某一事件的发生时也要等待,这是通过调用OSSemPend(),OSMboxPend(),或OSQPend()实现的。调用后任务进入了等待状态(WAITING)。当任务因等待事件被挂起(Pend),下一个优先级最高的任务立即得到了CPU的控制权。当事件发生了,被挂起的任务进入就绪态。事件发生的报告可能来自另一个任务,也可能来自中断服务子程序。

最后,发生中断时,除非该任务将中断关了,或者uC/OC将中断关了,正在执行的任务被挂起,响应中断。CPU开始执行中断服务例程(ISR)。中断服务子程序可能会报告一个或多个事件的发生,而使一个或多个任务进入就绪态。在这种情况下,从中断服务子程序返回之前,uC/OC要判定,被中断的任务是否还是就绪态任务中优先级最高的。如果中断服务子程序使一个优先级更高的任务进入了就绪态,则新进入就绪态的这个优先级更高的任务将得以运行,否则原来被中断了的任务才能继续运行。

当所有的任务都在等待事件发生或等待延迟时间结束,Uc/OSⅡ执行空闲任务(idle task),执行OSTaskIdle()函数。