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

108 篇文章 10 订阅

  对于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()激活。
————————————————
版权声明:本文为CSDN博主「理发师」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/javachenxi/article/details/5650431

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值