UCOSIII任务创建与删除
Posted 想成为大师啊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UCOSIII任务创建与删除相关的知识,希望对你有一定的参考价值。
1.1、任务的创建
UCOSIII 中要想使用任务,第一件事就是创建一个任务,创建任务使用函数 OSTaskCreate()
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,
OS_ERR *p_err)
任务控制块
OSTaskCreate((OS_TCB * )&StartTaskTCB,
任务名字
(CPU_CHAR * )"start task",
任务函数:(OS_TASK_PTR )start_task,
//开始任务任务函数
void start_task(void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg;
CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0u
OSStatTaskCPUUsageInit(&err); //统计任务
#endif
#ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了测量中断关闭时间
CPU_IntDisMeasMaxCurReset();
#endif
#if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候
//使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms
OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
#endif
OS_CRITICAL_ENTER(); //进入临界区
//创建TASK1任务
OSTaskCreate((OS_TCB * )&Task1_TaskTCB,
(CPU_CHAR * )"Task1 task",
(OS_TASK_PTR )task1_task,
(void * )0,
(OS_PRIO )TASK1_TASK_PRIO,
(CPU_STK * )&TASK1_TASK_STK[0],
(CPU_STK_SIZE)TASK1_STK_SIZE/10,
(CPU_STK_SIZE)TASK1_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
//创建TASK2任务
OSTaskCreate((OS_TCB * )&Task2_TaskTCB,
(CPU_CHAR * )"task2 task",
(OS_TASK_PTR )task2_task,
(void * )0,
(OS_PRIO )TASK2_TASK_PRIO,
(CPU_STK * )&TASK2_TASK_STK[0],
(CPU_STK_SIZE)TASK2_STK_SIZE/10,
(CPU_STK_SIZE)TASK2_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
OS_CRITICAL_EXIT(); //退出临界区
OSTaskDel((OS_TCB*)0,&err); //删除start_task任务自身
}
传递给任务函数的参数:void *p_arg,
(void * )0,
任务优先级:OS_PRIO prio,
(OS_PRIO )START_TASK_PRIO,
任务堆栈的基地址:CPU_STK *p_stk_base,
(CPU_STK * )&START_TASK_STK[0],
任务堆栈深度限位:CPU_STK_SIZE stk_limit,
(CPU_STK_SIZE)START_STK_SIZE/10,
任务堆栈大小:CPU_STK_SIZE stk_size,
(CPU_STK_SIZE)START_STK_SIZE,
任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息:OS_MSG_QTY q_size,
(OS_MSG_QTY )0,
当使能时间片轮转时的时间片长度,为0时为默认长度:OS_TICK time_quanta,
(OS_TICK )0,
用户补充的存储区:void *p_ext,
(void * )0,
任务选项:OS_OPT opt,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
存放该函数错误时的返回值:OS_ERR *p_err
(OS_ERR * )&err);
1.2、任务的删除:
如果我们不想使用某个任务了就可将其删除,删除任务使用函数 OSTaskDel(),函数原型如下:
void OSTaskDel (OS_TCB *p_tcb,
OS_ERR *p_err)
- 1、删除某个任务以后,它占用的OS_TCB和堆栈就可以再次利用来创建其他的任务。
- 2、尽管 UCOSIII 允许在系统运行中删除任务,但是应该尽量避免这种操作,如果这个任务可能占有与其他任务共享的资源,在删除此任务之前这个被占有的资源没有被释放就有可能导致奇怪的结果。
1.3、任务创建与删除实验:
设计3个任务,任务A用于创建其他任务,创建完成以后就删除掉自身,任务B和任务C在LCD上有各自的运行区域,每隔1s他们就会切换一个各自运行区域的背景颜色,而且显示各自的运行次数,任务B运行5次以后删除掉任务C,两个任务运行的过程中还要通过串口打印各自的运行次数,当任务B删除掉任务C以后也要通过串口打印提示信息。
以上是关于UCOSIII任务创建与删除的主要内容,如果未能解决你的问题,请参考以下文章