VxWorks的任务有优先级的概念,其任务调度也是基于优先级考虑的,是抢占式的,VxWorks的任务有256个等级,0—255,数目越小表示优先级越高。高优先级的任务可以打断低优先级的任务而抢先执行,只有在高优先级的任务执行完后,低优先级的任务才可以执行。其调度算法有两种:完全抢占式的和循环分配式的。完全抢占式的是除了高优先级任务可以打断低优先级任务外,在相同优先级的任务之间,不可以相互打断,并且同优先级任务不是同时执行的,只有等该任务执行完后,与其相同优先级的任务才可以执行;循环分配式除了具有抢占功能之外,相同优先级的任务是可以同时执行的,即系统时间片是在它们之间平均分配的,这样,相同优先级的任务可以同时执行。可以调用kernelTimeSlice()函数来设定该调度方式,并且参数是相同优先级任务执行的时间片。

VxWorks中任务具有很多种状态,如下表所示:

状态 描述
READY 此任务状态在等待执行
PEND 此任务状态是由于一些资源不可用而被阻塞
DELAY 此任务状态是休眠一段时间
SUSPEND 此任务状态是挂起
BREAK 此任务状态是停止(暂停),通常是在任务中设置了断点。
各种状态的组合 详细请见原文档

为了防止任务被误删除,VxWorks还提供了taskSafe()函数和taskUnsafe()函数,调用taskSafe()的任务不能被删除,应用在其它地方调用taskDelete()函数时会出错。只有该任务在调用了taskUnsafe()后,任务才能被删除。另外,VxWorks还可以对任务的优先级动态的修改,即可以在执行过程中,调用taskPrioritySet()函数对任务的优先级进行修改。对于任务的创建,VxWorks还提供了不同的方法,用户可以调用taskSpawn()函数在创建完任务后立即执行它,或者调用taskCreate()和taskActivate()函数把创建任务和执行任务分成两步来实行,即在调用taskCreate()后,任务只是被创建而没有执行,所以用户可以在需要的时候调用taskActivate()来恢复任务的执行。下面是VxWorks任务相关函数一览表:

函数名 功能
kernelTimeSlice( ) 控制轮询式调度程序
taskLock( ) 取消任务的再调度
taskUnlock( ) 允许任务的再调度
taskSpawn( ) 生成(创建和激活)一个新任务
taskCreate( ) 创建一个新任务,但不激活它。
taskActivate( ) 激活一个已经创建的任务
taskSuspend( ) 挂起一个任务
taskResume( ) 恢复挂起任务的执行
taskRestart( ) 重新开始一个任务的执行(即从头执行)
taskDelay( ) 延时任务,延时单位是时间片
taskIdSelf( ) 得到调用任务的id(正在运行的)
taskIdVerify( ) 验证一个指定任务是否存在
taskOptionsGet( ) 获得用户自定义任务参数
taskOptionsSet( ) 设置用户自定义任务参数
taskIdListGet( ) 将所有活动状态的任务id填写到个数组中
taskInfoGet( ) 得到一个任务的信息
taskPriorityGet( ) 获得任务的优先级
taskPrioritySet( ) 改变任务优先级
taskRegsSet( ) 设置一个任务的寄存器(但是不能被当前任务使用)
taskIsSuspended( ) 检查一个任务是否在悬挂状态(suspended.)
taskIsReady( ) 检查一个任务是否准备运行就绪
exit( ) 结束正在运行任务,释放内存*
taskDelete( ) 结束制定的任务,释放内存*
taskSafe() 保护当前任务,防止被删除
taskUnsafe( ) 取消taskSafe( )操作,即能够删除当前任务
nanosleep( ) 延时任务,延时单位是时间片
时间片

对于任务来讲,只有相同优先级任务下的循环分配式才存在时间片的概念:时间片就是系统分配给各任务的时间,如果该时间内某任务未完成,CPU将被剥夺并分配给另外一个任务。