一、任务创建和删除的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、任务控制块结构体成员介绍
注意:每个任务都有属于自己的任务控制块,类似于身份证
任务栈栈顶,在任务切换时与任务的上下文保存、任务恢复息息相关
二、任务创建函数的参数介绍
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,且 |
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、创建任务的流程如下
创建成功的任务会立刻进入就绪态,由任务调度器调度运行。
注意:
(1)、 在调用任何关于UCOSIII函数之前必须先初始化UCOSIII,仅初始化一次即可。调用函数:OSInit( )
(2)、任务在创建之后是不会直接运行的,需开启任务调度器,任务才能得以运行。调用函数: OSStart( )
四、任务创建和删除
1、寄存器xPSR被初始为0x01000000,其中bit24被置1,表示使用Thumb指令
2、寄存器PC被初始化为任务函数指针vTask_A,这样当某次任务切换后,任务A获得CPU控制权,任务函数vTask_A被出栈到PC寄存器,之后会执行任务A的代码
3、LR寄存器初始化为函数指针OS_TaskReturn ,这是由移植层提供的一个出错处理函数。
4、子函数的调用通过寄存器R0~R3传递参数,创建任务时,我们传入的参数被保存到R0中,用来向任务函数传递参数
堆栈大小的设置:
必须考虑任务调用的所有函数的嵌套、任务调用的所有函数要分配的局部变量以及所有嵌套中断服务例程的堆栈要求。此外,如果处理器具有 FPU,堆栈必须能够存储所有 CPU 寄存器,包括浮点单元 (FPU) 寄存器
CPU_Init( )的作用:
(a) 初始化CPU时间戳
(b) 初始化CPU中断禁用的时间测量
(c) 初始化CPU主机名