10.2-uC/OS-III内部任务管理(任务状态)

1.任务状态
从用户的观点来看,任务可以是有 5种状态,见图 5-6。展示了任务状态间的转换关系。
{休眠状态,就绪状态,运行状态,挂起状态,中断状态}
这里写图片描述
(1).处于休眠状态的任务驻留于内存但未被uC/OS-III使能。通过调用OSTaskCreate()函数uC/OS-III创建任务。 任务代码是存在于ROM的。但需要用OSTaskCreate()函数通知uC/OS-III关于任务的相关信息。如果任务的使命完成了,就要调用 OSTaskDel()删除该任务。OSTaskDel()实际上不是删除任务的代码,只是让任务不再具有使用CPU的资格而已。
(2).就绪状态的任务根据优先级有序地排列于就绪列表中。就绪列表中对就绪任务的个数没有限制。
(3). 正在运行的任务被置为运行状态。 在单CPU中, 任何时刻只能有一个任务被运行。当应用程序调用 OSStart()或者调用 OSIntExit()或者调用OS_TASK_SW()时 uC/OS-III从就绪队列中选择优先级最高的任务去运行。正如前面所提到的,有些时候任务必须等待某些事件发生,若事件还未发生时,任务就会被设置为挂起状态。
(4).挂起状态的任务被放置在挂起列表中以表明任务在等待某些事件的发生。 等待的时候, 任务是不会占用CPU的。 事件发生时,该任务会被放到就绪队列中。 在这种情况下, 正在运行的任务可能会被抢占 ( 被放回就绪列表), 并由uC/OS-III选择优先级最高的任务去运行。换句话说,如果新的任务优先级最高,那么它就会被立即运行。
请注意, 调用OSTaskSuspend()会任务无条件地停止运行。 有些时候调用 OSTaskSuspend()不是为了等待某个事件的发生,而是等待另一个任务调用OSTaskResume()函数恢复这个任务。
(5).若中断发生, 中断会挂起正在执行的任务并去处理ISR。ISR中可能有某些任务等待的事件。 一般来说, 中断用来通知任务某些事件的发生,并让在任务级处理实际的响应操作。 ISR程序越短越好,实际响应中断的操作应该被设置在任务级以便能让 uC/OS-III管理这些操作。 ISR中只允许调用一些提交函数(OSFlagPost(),OSQPost(),OSSemPost() , OSTaskQPost() , OSTaskSemPost()) ,除 了OSMutexPost()。因为mutex只允许在任务级被修改。
2.任务追踪
uC/OS-III一直追踪着任务的状态如图 5-7。事实上,这些都是以
一个变量的形式保存在每个任务的 TCB中。图小括号中的数值表示
着任务的状态,每个任务都可以有 8 种状态。(详见 OS.H,
OS_TASK_STATE_???)
图中不包括休眠态, 因为uC/OS-III不支持休眠态。 在这里, 中断
以及中断的嵌套会有更深的讲解。
这里写图片描述
(0).状态 0表示任务已经就绪。每个任务在被运行之前都必须处于就绪状态。
(1).任务可以通过调用 OSTimeDly()或者 OSTimeDlyHMSM()等待期满。 当期满或者延时删除时 ( 通过调用OSTimeDlyResume()),任务会转为就绪状态。
(2).任务可以通过调用挂起函数 ( OSFlagPend(),OSMutexPend(),OSQPend, OSSemPend, OSTaskQPend(), OSTaskSemPend())等待某事件的发生。 当事件发生时、 该任务被删除、 或者被另一个任务取消等待时,等待停止。
(3).如前面所说,任务可以等待事件发生。但任务也可以被设等待多少时间。 如果在这段时间内事件没有发生, 任务也会被设为就绪状态,并通知这个任务是等待超时而被挂起的。{挂起函数都有一个关于函数执行结果错误代号,可以查看这个代号知道任务是因何被就绪的}
(4).任务暂停自己或者被其他任务暂停(通过调用OSTaskSuspend())。暂停中的任务只能通过调用OSTaskResume()被恢复。
(5).一个延时中的任务也可以被其它任务设置为停止。在这种情况下, 效果会被叠加。 换句话说, 延时需被执行、 停止状态需被解除。该任务才会被执行。
(6).一个挂起状态中的任务也可能被其它任务设置为停止。同样的, 效果会被叠加。 事件发生且停止状态被移除后, 任务才会被执行。
(7).任务可以等待事件的发生,但可以给它设定一个期限。同样的, 它也可能被设为停止, 效果是叠加的。 除非移除停止状态并事件发生或等待事件超时,任务才会被执行。

 

posted @ 2018-07-21 20:08  西贡小傻  Views(683)  Comments(0Edit  收藏  举报