鹰空独舞
迈着慵懒的步子,走在成长路上..... Dead
posts - 4,comments - 1,trackbacks - 0
     摘要: 在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义;  阅读全文
posted @ 2012-05-31 16:53 鹰空独舞 阅读(23882) | 评论 (1)编辑 收藏

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

}

posted @ 2012-05-31 16:23 鹰空独舞 阅读(488) | 评论 (0)编辑 收藏