VxWorks任务控制API

来源:互联网 发布:创意文字设计软件 编辑:程序博客网 时间:2024/05/30 02:25

VxWorks中与任务控制有关的API有两个:taskSpawn()和taskInit()。前者将创建的任务置于就绪状态,可以直接运行。后者将创建的任务置于休眠状态,需要使用taskActivate将其激活以后才能转为就绪状态。两个API的原型为:

 int  taskSpawn (                 char *name,       /*新任务的名称*/                 int priority,     /*新任务的优先级*/                 int options,      /*任务选项*/                 int stackSize,    /*任务堆栈字节数*/ FUNCPTR entryPt,  /*任务函数的入口*/                 int arg1, int arg2, int arg3,  /*任务函数的十个参数*/ int arg4, int arg5, int arg6,                  int arg7,int arg8, int arg9,                  int arg10);

 STATUS  taskInit (                WIND_TCB *pTcb,      /*新任务的TCB地址*/                char *name,          /*新任务的名称*/                int priority,        /*新任务的优先级*/                int options,         /*任务选项*/                char *pStackBase,    /*任务堆栈基地址*/                int stackSize,       /*任务堆栈字节数*/                FUNCPTR entryPt,     /*任务函数的入口*/        int arg1, int arg2, int arg3,   /*任务函数的十个参数*/                int arg4, int arg5, int arg6,                int arg7, int arg8, int arg9,                 int arg10);
使用taskInit生成的任务必须经过taskActivate才能运行,taskActivate的声明如下: 

                              STATUS taskActivate (int tid);
这里的tid指任务ID。对于由taskInit生成的任务来讲,pTcb的地址就是其对应的任务ID。也就是说,任务的ID指向了任务控制块。

删除任务的API:taskDelete和taskDeleteForce。声明如下:

                         STATUS taskDelete (int tid);                         STATUS taskDeleteForce (int tid);
区别就是,taskDeleteForce可以删除那些出于保护中的任务,即使某个任务使用taskSafe也可以被该函数删除。然而,这样的删除可能会使任务所保护的资源不能正确地释放。因此,最好的方式还是等待被删除任务用taskUnsafe解除保护之后,在使用taskDelete删除任务。

这里讲到的taskSafe和taskUnsafe是任务在访问资源时用来保护自身的手段,用于资源保护。两者必须一一对应,每一个taskSafe都会使任务的保护计数器加1,只有调用相同次数的taskUnsafe才会使保护计数器处于0的状态。删除保护计数器处于非0状态的任务时,调用删除函数的任务将会被阻塞,直到被删除任务处于非保护状态时才可以继续执行删除动作。


控制任务状态切换的API:

STATUS taskDelay (int ticks);该函数可以将任务由执行态转换为延迟态,延迟时间由ticks决定。通常是为了让出CPU资源,或者等待一个固定的时间。一般情况下,使用sysClkRateGet配合taskDelay以延迟真实时间长度。sysClkRateGet获取系统中1秒所对应的时间片个数,例如,使任务延迟半秒:taskDelay(sysClkRateGet () >>1);

taskLock和taskUnlock是一对阻止任务被调度的函数,同样用于保护关键区域,属于任务保护。两者也需要一一对应来使用。

taskSuspend和taskResume分别将任务挂起和恢复,都是用任务ID为参数。如果任务ID为0,taskSuspend会将调用它的函数挂起。

taskPrioritySet用于改变任务的优先级,声明为:

STATUS taskPrioritySet (int tid, int newPriority);






0 0
原创粉丝点击