VxWorks多任务功能

http://blog.chinaunix.net/uid-23741326-id-84935.html

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

 

原文地址:https://www.cnblogs.com/xiaobiexi/p/5016964.html