uCOS-II OSTaskCreate函数分析

ucos版本:V2.91

函数名:OSTaskCreate

函数原型位置:os_task.c:206行

首先看形参列表及返回值:


返回值类型为INT8U,用于保存错误标志。

第一个参数为:void (*task)(void *p_arg),此处为一函数指针,用于指定任务执行的函数。

第二个参数为:void *p_arg,用于指定任务执行函数的参数。

第三个参数为:OS_STK *ptos,类型为OS_STK ,OS_STK为unsigned int类型,用于指定栈顶指针。

第四个参数为:INT8U prio,用于指定优先级(优先级是唯一的)

首先定义几个变量,psp用来保存堆栈指针。err用来保存错误标志,cpu_sr用来出入临界区。

接下来做优先级参数检查,这里可以通过OS_ARG_CHK_EN宏来开启或关闭检查,如果当前设定优先级大于OS_LOWEST_PRIO,返回优先级不可用错误(OS_ERR_PRIO_INVALID)


进入临界区,


这里介绍一下什么是所谓的临界区,观察函数定义,os_cpu.h:71


继续观察OS_CPU_SR_Save()函数定义

os_cpu_a.asm(行数不一定)代码如下:

可以看到,进入临界区就是关闭中断。

接下来确保创建任务不在中断中进行,这里涉及到一个全局变量OSIntNesting,这个变量用来记录中断嵌套层数,发生中断时,这个变量自加1,如果当前有中断发生,退出临界区,返回中断中创建任务的错误(OS_ERR_TASK_CREATE_ISR)

接下来准备占坑:先判断该优先级是否存在,如果存在,退出临界区,返回优先级已存在错误(OS_ERR_PRIO_EXIST),如果该优先级不存在,则占坑,然后退出临界区。


接下来初始化任务堆栈和任务控制块。

初始化任务堆栈,

传入参数为:task(任务处理函数指针),p_arg(函数参数),ptos(堆栈指针), opt(无用)

然后初始化任务控制块

传入参数有prio(优先级),psp(堆栈指针),其余暂时不管

该函数中,会从TCB池中获取一个空的TCB块,然后进行初始化。初始化优先级,堆栈指针,设置运行标志位,清除挂起标志位。

uCOS-II OSTaskCreate函数分析_第1张图片

一系列初始化完成后,更新OSTCBPrioTbl,并加入到任务链表。

最后设置任务就绪表。


至此,任务创建完成。对于任务就绪表的设置及如何查找最高优先级任务,请看下篇文章。

你可能感兴趣的:(RTOS)