任务的创建和删除本质就是调用uC/OS-III的API函数
注意:
- 使用OSTaskCreate() 创建任务,任务的任务控制块以及任务栈空间所需的内存,需要由用户手动分配并提供。当任务被创建好后,就会立马处于就绪态 。
- 使用OSTaskDel() 删除任务。当不再需要某一任务时,可以使用此函数来删除任务。删除任务并不会删除任务的代码或释放任务栈,仅代表该任务的代码和任务栈都不再由µC/OS-III 内核管理 。
任务创建函数
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 /* 指向接收错误代码变量指针 */
);
任务控制块结构体成员介绍
struct os_tcb
{
CPU_STK *StkPtr; /* 任务栈栈顶,必须为TCB的第一个成员 */
CPU_STK *StkLimitPtr; /* 指向任务栈警戒线指针 */
OS_TCB *NextPtr; /* 指向任务列表中下一个任务控制块指针 */
OS_TCB *PrevPtr; /* 指向任务列表中上一个任务控制块指针 */
OS_TCB *TickNextPtr; /* 指向 Tick任务列表中下一个任务控制块指针 */
OS_TCB *TickPrevPtr; /* 指向 Tick任务列表中上一个任务控制块指针 */
OS_PRIO Prio; /* 任务优先级,数值越小,优先级越大 */
OS_TICK TickRemain; /* 任务延时的剩余时钟节拍数 */
OS_TICK TimeQuanta; /* 任务时间片 */
OS_TICK TimeQuantaCtr; /* 任务剩余时间片 */
…
省略很多条件编译的成员
};
- 注意:每个任务都有属于自己的任务控制块,类似身份证
- 任务栈栈顶,在任务切换时与任务的上下文保存、任务恢复息息相关
任务创建函数—参数介绍
任务删除函数
void OSTaskDel
(
OS_TCB* p_ tcb, /* 指向任务控制块指针 */
OS_ERR* p_err /* 接收错误代码变量指针 */
)
注意:如果p_ tcb代入的参数为NULL,则代表删除任务自身(当前正在运行的任务)
UCOSIII任务创建流程
创建成功的任务会立刻进入就绪态,由任务调度器调度运行。
注意:
-
在调用任何关于UCOSIII函数之前必须先初始化UCOSIII,仅初始化一次即可。调用函数:OSInit( )
-
任务在创建之后是不会直接运行的,需开启任务调度器,任务才能得以运行。调用函数: OSStart( )
评论区