在VxWorks中,任务的基本状态分为5种:就绪态、休眠态、延迟态、悬置态、运行态。 就绪态是指,任务已经获得除了CPU之外的所有其他资源,所等待的只是CPU的运行,一旦其他任务释放了CPU资源,该任务就可以开始运行。 休眠态表示任务正在等待除CPU之外的其他资源,即使当前CPU资源可以使用该任务也无法运行,通常也叫作阻塞状态。 处于延迟态的任务表示在其执行期间主动放弃了CPU资源并处于一种等待延迟时间的状态,这种任务不需要获取任何资源,所需要等待的仅仅是一段时间。 悬置态是一种用于调试的状态,处于这种状态的任务不会因为其不运行而导致状态的转换。 整个系统中处于运行态的任务只能有一个(单核心系统),这样的任务不缺少任何资源,也不需要等待时间延迟,通常其是由最高优先级的就绪态任务转换而来的。如果所有用户任务都不能处于就绪状态,系统将会运行一个IDLE任务。
除了这些基本状态之外,根据不同的组合还可以列出下面的状态:延迟态+S、悬置态+S、悬置态+T、悬置态+S+T以及带有继承优先级处于任何状态的任务(也就是延迟态、休眠态、悬置态三者之间的组合)。 表1.1中列出了VxWorks中任务可能出现的状态,每个状态的后面都有一个简要地说明。图1.1给出的任务基本状态转换图中描绘了任务基本状态的转换以及状态之间的关系。
表1.1 状 态 | 描 述 | 就绪态 | 任务正在等待CPU资源 | 休眠态 | 任务正在等待除CPU资源之外的其他资源 | 延迟态 | 任务正在等待一定时间的延时 | 悬置态 | 任务无法执行,主要是用于调试的一种状态。这种状态仅影响任务的执行而不影响任务状态的转换。处于阻塞挂起状态的任务仍然可以被解锁,处于睡眠挂起的任务仍然可以被唤醒 | 延迟态+ S | 处于睡眠挂起的任务状态 | 悬置态+ S | 处于阻塞挂起的任务状态 | 悬置态+ T | 带有超时值的处于阻塞的任务状态 | 悬置态+ S + T | 带有超时值的处于阻塞且挂起的任务状态 | state + I | 带有继承优先级处于state状态的任务 |
任务状态的转换主要原因有两个:等待资源和放弃CPU资源。放弃CPU资源将使任务处于延迟态,等待CPU资源将使任务处于就绪态,等待其他资源的任务则处于休眠态。这里所指的其他资源包括信号量、外部设备、消息队列等,凡是程序运行所需要用到的都可以归结到这个范围。 表1.2列出了任务状态转换以及可能引发这些转换的函数。这些函数中大多是系统提供的操作API,任务状态的转换可以通过这些函数完成但并不局限于这些方法。
表1.2 状 态 转 换 | 函 数 | 就绪态→悬置态 | semTake( )/msgQReceive( ) | 就绪态→延迟态 | taskDelay( ) | 就绪态→休眠态 | taskSuspend( ) | 悬置态→就绪态 | semGive( )/msgQSend( ) | 悬置态→休眠态 | taskSuspend( ) | 延迟态→就绪态 | expired delay | 延迟态→休眠态 | taskSuspend( ) | 休眠态→就绪态 | taskResume( )/taskActivate( ) | 休眠态→悬置态 | taskResume( ) | 休眠态→延迟态 | taskResume( ) |
|