VxWorks关于任务创建的几个函数的概述

来源:互联网 发布:北京软件开发公司 编辑:程序博客网 时间:2024/04/30 09:48

对于VxWorks 的任务创建可以通过调用 taskSpawn()或是taskInit()/taskActivate()两种方式,以下就对这两种方式进行说明。

  taskSpawn() 实现任务的创建分为两步:1、分配任务栈的空间,初始化WIND_TCB; 2、激活任务。taskSpawn()函数的定义,

int  taskSpawn (char *name,              /*任务名称必须惟一的标示*/

                          int priority,                /*任务优先级(0-255)越小标示优先级越高*/

                          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)

函数调用成功时,返回新任务的ID,或者返回ERROR。 

参数options任务选项,可以是以下的标志组合:

              VX_FP_TASK:标志浮点寄存器是否属于上下文,若函数中使用了浮点数,应带上此标记。

              VX_PRIVATE_ENV:支持任务私有环境变量。

              VX_NO_STACK_FILL:不进行初始任务栈的填充。

              VX_UNBREAKABLE:任务不允许断点调试(忽略断点)。

              VX_DSP_TASK:DSP 协处理器支持。

              VX_ALTIVEC_TASK:ALTIVEC 协处理器支持。

参数int型的10个,主要传入入口函数的参数,若不足10个,后面剩余的设为0。

   taskInit()实现创建任务,必须由taskActivate()来激活。以下就对这两个函数进行分解:

STATUS taskInit (WIND_TCB* Ptcb,     /*任务控制块WIND_TCB地址*/

                          char* name,             /*任务名称必须惟一的标示*/

                          int priority,               /*任务优先级(0-255)越小标示优先级越高*/

                          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)

与taskSpawn() 相比多了两个参数WIND_TCB*和char* pStackBase,任务控制块参数由调用者分配空间,并由其释放;而任务栈也也是由调试者分配与释放,特别留意的是任务栈的起始地址有两种可能,地段地址或高端地址,具体由BSP而定。

STATUS taskActivate (int tid) /*tid = (int )pTcb;*/

参数tid是表示惟一的任务ID。

   其实 taskSpawn() 内部调用taskInit()/taskActivate()来完成的。或者提供了更为细致的任务控制而已。而这两种的创建任务的差别:

    1、taskSpawn()自动在系统堆上分配任务栈空间,并在任务栈上创建TCB;而taskInit()由调用者分配与释放的,TCB不属于任务栈的空间。

    2、taskSpawn()生成任务后进入就绪队列;而taskInit()生成任务后处于挂起状态,不能被直接调用,直到taskActivate()激活。

原创粉丝点击