UCOS的任务创建和删除

一、任务创建和删除的API函数

1、任务创建和删除本质就是调用uC/OS的函数

API函数

描述

OSTaskCreate()

创建任务

OSTaskDel()

删除任务

注意:

1,使用OSTaskCreate() 创建任务,任务的任务控制块以及任务栈空间所需的内存,需要由用户手动分配并提供。当任务被创建好后,就会立马处于就绪态 。

2,使用OSTaskDel() 删除任务。当不再需要某一任务时,可以使用此函数来删除任务。删除任务并不会删除任务的代码或释放任务栈,仅代表该任务的代码和任务栈都不再由µC/OS-III 内核管理 。

2、任务创建函数

void  OSTaskCreate

(

  OS_TCB*  p_tcb,                                                        /* 指向任务控制块的指针 */ 
  CPU_CHAR*   p_name,                                              /* 指向任务的名字 */ 
  OS_TASK_PTR   p_task,                                            /* 指向任务函数的指针 */ 
  void*   p_arg,                                                               /* 传递给任务函数的参数 */ 
  OS_PRIO   prio,                                                           /* 任务的任务优先级,数字越小,优先级越高 */ 
  CPU_STK*   p_stk_base,                                             /* 指向任务栈的起始地址的指针 */ 
  CPU_STK_SIZE   stk_limit,                                          /* 任务栈的使用警戒线 */ 
  CPU_STK_SIZE   stk_size,                                          /* 任务栈大小 */ 
  OS_MSG_QTY   q_size,                                              /* 任务内嵌消息队列的大小 */ 
  OS_TICK   time_quanta,                                              /* 任务的时间片 */ 
  void*   p_ext,                                                                /* 指向用户扩展内存的指针 */ 
  OS_OPT   opt,                                                             /* 任务选项共有5 */ 
  OS_ERR*   p_err                                                         /* 指向接收错误代码变量指针 */ 

);

3、任务控制块结构体成员介绍 

注意:每个任务都有属于自己的任务控制块,类似于身份证

UCOS的任务创建和删除_第1张图片

任务栈栈顶,在任务切换时与任务的上下文保存、任务恢复息息相关

 二、任务创建函数的参数介绍

1、opt

OS_OPT                         opt,                                    /* 任务选项共有5 */ 

Opt(任务选项)

描述

OS_OPT_TASK_NONE

没有选项

OS_OPT_TASK_STK_CHK

是否允许对任务进行堆栈检查

OS_OPT_TASK_STK_CLR

是否需要清除任务堆栈

OS_OPT_TASK_SAVE_FP

是否保存浮点寄存器

OS_OPT_TASK_NO_TLS

不需要对正在创建的任务提供 TLS(线程本地存储)支持

 2、p_err

 OS_ERR*                       p_err                            /* 指向接收错误代码变量指针 */

p_err(错误代码)

描述

OS_ERR_NONE

任务创建成功

OS_ERR_ILLEGAL_CREATE_RUN_TIME

定义了 OS_SAFETY_CRITICAL_IEC61508,且
OSStart( )之后非法地创建内核对象

OS_ERR_PRIO_INVALID

非法的任务优先级数值

OS_ERR_STAT_STK_SIZE_INVALID

任务栈在初始化期间溢出

OS_ERR_STK_INVALID

指向任务栈起始地址的指针为空

OS_ERR_STK_SIZE_INVALID

任务栈小于配置项 OS_CFG_STK_SIZE_MIN

OS_ERR_STK_LIMIT_INVALID

任务栈警戒线大小,大于或等于任务栈大小

OS_ERR_TASK_CREATE_ISR

在中断中非法地创建任务

OS_ERR_TASK_INVALID

指向任务函数的指针为空

OS_ERR_TCB_INVALID

指向任务控制块的指针为空

 注意如果p_ tcb代入的参数为NULL,则代表删除任务自身(当前正在运行的任务)

三、UCOS的任务创建流程

1、创建任务的流程如下

UCOS的任务创建和删除_第2张图片

创建成功的任务会立刻进入就绪态,由任务调度器调度运行。

注意:

(1)、 在调用任何关于UCOSIII函数之前必须先初始化UCOSIII,仅初始化一次即可。调用函数:OSInit( )

(2)、任务在创建之后是不会直接运行的,需开启任务调度器,任务才能得以运行。调用函数: OSStart( )

四、任务创建和删除

1、寄存器xPSR被初始为0x01000000,其中bit24被置1,表示使用Thumb指令

 2、寄存器PC被初始化为任务函数指针vTask_A,这样当某次任务切换后,任务A获得CPU控制权,任务函数vTask_A被出栈到PC寄存器,之后会执行任务A的代码

 3LR寄存器初始化为函数指针OS_TaskReturn ,这是由移植层提供的一个出错处理函数。

 4、子函数的调用通过寄存器R0~R3传递参数,创建任务时,我们传入的参数被保存到R0中,用来向任务函数传递参数

 UCOS的任务创建和删除_第3张图片

 堆栈大小的设置:

必须考虑任务调用的所有函数的嵌套、任务调用的所有函数要分配的局部变量以及所有嵌套中断服务例程的堆栈要求。此外,如果处理器具有 FPU,堆栈必须能够存储所有 CPU 寄存器,包括浮点单元 (FPU) 寄存器

CPU_Init( )的作用:

(a) 初始化CPU时间戳

(b) 初始化CPU中断禁用的时间测量

(c) 初始化CPU主机名

你可能感兴趣的:(UCOS实时操作系统,笔记,实时操作系统,单片机)