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将被剥夺并分配给另外一个任务。