ucos与鸿蒙,OSTaskCreate()函数(UCOSII与UCOSIII的对比)

本文详细介绍了uCOS-II的OSTaskCreate()函数用于创建任务的参数、工作原理和注意事项,并提供了示例代码。内容包括任务参数传递、堆栈配置、优先级设置以及错误返回值的解释。同时提到了uCOS-III的使用,强调了任务必须无限循环且不能有返回点,以及堆栈增长方向的设定。示例展示了如何创建并启动任务,以及任务堆栈的初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UCOSII的用法

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(;;)

{

......   //任务代码

}

}

实例:

OSTaskCreate((void*)Rs485_Task,(void *)0,(void *)&TaskStk[RS485_Prio][TASK_STK_SIZE-1], RS485_Prio);

其中TASK_STK_SIZE=2048

void Rs485_Task()

{

do

{

printd("Task 485.\r\n");

RS485_PreProcess();

OSTimeDly(100);

}  while(1);

}

UCOSIII的用法

2fbb6aa0e6255c69da28862f208db2ec.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值