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(;;)
{
...... //任务代码
}
}