对于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()激活。