OSTaskCreate()

函数原型:INT8U OSTaskCreate(void(*task)(void *pd),void *pdata,OS_STK *ptos,INT8U prio)


调用者:任务或者是初始化代码。


作用:建立一个新任务,任务的建立可以在多个任务环境启动之前,也可以在正在运行的任务中建立,中断处理程序中不能建立任务,一个任务必须为无限循环结构,且不能有返回点。
无论用户程序中是否产生中断,在初始化任务堆栈时,堆栈的结构必须与处理器中断后寄存器入栈的顺序结构相同(这句话也就是说:任务的堆栈只是用来存放寄存器里面的数据;恍然大悟,才发现任务堆栈的用处)

该函数返回一个8位的×××数,调用该函数需要四个参数:

a 第一个参数:task是一个指向任务代码的指针,也就是用户代码的首地址,平常使用中我们把自己创建的任务的名
字作为这个参数即可。

b 第二个参数:pdata指向一个数据结构,该结构用来在建立任务时向任务传递参数。

c 第三个参数:ptos是指向任务堆栈栈顶的指针,一般把创建的任务的堆栈数组首地址赋给它。


任务堆栈用来保存局部变量,函数参数,返回地址以及任务被中断时处理器寄存器的内容,任务堆
栈的大小决定于任务的需要以及预计的中断嵌套层数。计算堆栈的大小需要知道任务的局部变量所
占的空间,可能产生嵌套调用的函数,及中断嵌套所需的空间,如果初始化常量OS_STK_GROWTH
设为1,堆栈被设为从内存高地址向低地址增长,此时ptos应该指向任务堆栈空间的最高地址,反
之,如果OS_STK_GROWTH设为0,堆栈将从内存的低地址向高地址增长。

d 第四个参数:prio是任务的优先级。每个任务必须有一个唯一的优先级作为标识,数字越小,优先级越高。

返回值:

OSTaskCreate()的返回值为下述之一:

# OS_NO_ERR: 函数调用成功。

# OS_PRIO_EXIST:具有该优先级的任务已经存在。

# OS_PRIO_INVALID: 参数指定的优先级大于OS_LOWEST_PRIO

# OS_NO_MORE_TCB: 系统中没有OS_TCB可以分配给任务了。


注意:


1 :任何堆栈必须声明为OS_STK类型。


2 :在任务中必须调用uCOS提供的下述过程之一:延时等待,任务挂起,等待事件发生(等待信号量,消息邮箱, 消息队列),以便其他任务能得到cpu。


3 :程序中不能使用优先级0,1,2,3,以及OS_LOWEST_PRIO-3,OS_LOWEST_PRIO-2,OS_LOWEST_PRIO- 1,
OS_LOWEST_PRIO,这些优先级系统保留,其余的56个优先级提供给应用程序。


范例:

本例中,传递给任务Task1()的参数pdata不使用,所以指针pdata被设为NULLL,注意到程序中设定堆栈向低地址增长,传递的栈顶指针为高地址&Task1[1023],如果在你的程序中设定堆栈向高地址增长,则传递的栈顶指针应该为&Task1Stk[0]。

OS_STK Task1Stk[1024];

void main(void)

{


NT8U err;

  



OSInit();//初始化uCOS-II


….


OSTaskCreate(Task1,(void *)0,&Task1Stk[1023],25);





OSStart();//启动多任务环境

}
void Task1(void *pdata)

{


pdata=pdata;


for(;;)


{


……   //任务代码


}
}