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以后也要通过串口打印提示信息。


2.1、UCOSIII任务挂起

当我们想暂停某个任务,但是又不想删除掉这个任务的时候就可以使用函数 OSTaskSuspend() 来将这个任务挂起,函数原型如下:

void	OSTaskSuspend ( OS_TCB	*p_tcb,
						OS_ERR	*p_err)

2.2、任务恢复

当我们想要恢复某个被挂起的任务的时候可以调用函数 OSTaskResume(),函数原型如下:

void	OSTaskResume (OS_TCB	*p_tcb,
					  OS_ERR	*p_err)

3.3、任务挂起与恢复实验:

本实验是在上一个实验的基础上完成的,本实验同样设计了3个任务,任务A用于创建其他任务,创建完成以后就删除自身,任务B和任务C在LCD上有各自的运行区域,每隔一秒他们就会切换一次各自运行区域的背景颜色,而且显示各自的运行次数,任务B运行5次以后挂起任务C,当任务B运行10次以后重新恢复任务C,两个任务运行的过程还要通过串口打印各自的运行次数,当任务B挂起和恢复任务C以后也要通过串口打印提示信息。

猜你喜欢

转载自blog.csdn.net/xuexiwd/article/details/120878511