002_UCOSIII任务创建于删除
(一)先创建一个启动任务来进行创建其它任务,创建任务的宏定义
#define START_TASK_PRIO 3 //任务优先级 #define START_STK_SIZE 128 //任务堆栈大小 OS_TCB StartTaskTCB; //任务控制块 CPU_STK START_TASK_STK[START_STK_SIZE]; //任务堆栈 void start_task(void *p_arg); //任务函数
(一) 创建main函数,用于创建启动任务
int main(void) { OS_ERR err; /*初始化时候错误保存*/ CPU_SR_ALLOC(); /*声明变量,这个是进入临界区那个代码用到*/ /*硬件相关初始化*/ delay_init(168); //时钟初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置 uart_init(115200); //串口初始化 OSInit(&err); //初始化UCOSIII OS_CRITICAL_ENTER(); //进入临界区 //创建开始任务 OSTaskCreate((OS_TCB * )&StartTaskTCB, //任务控制块 (CPU_CHAR * )"start task", //任务名字 (OS_TASK_PTR )start_task, //任务函数 (void * )0, //传递给任务函数的参数 (OS_PRIO )START_TASK_PRIO, //任务优先级 (CPU_STK * )&START_TASK_STK[0], //任务堆栈基地址 (CPU_STK_SIZE)START_STK_SIZE/10, //任务堆栈深度限位 (CPU_STK_SIZE)START_STK_SIZE, //任务堆栈大小 (OS_MSG_QTY )0, //内部消息队列能够接收最大消息数目,为0时禁止接收 (OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认 (void * )0, //用户补充的存储区 (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项 (OS_ERR * )&err); //存放该函数错误时的返回值 OS_CRITICAL_EXIT(); //退出临界区 OSStart(&err); //开启UCOSIII }
(一) 创建任务一宏定义
注意:在没有开启时间轮转调度时候优先级不要相同
#define TASK1_TASK_PRIO 4 //任务优先级 #define TASK1_STK_SIZE 128 //任务堆栈大小 OS_TCB Task1_TaskTCB; //任务控制块 CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE]; //任务堆栈 void task1_task(void *p_arg); //任务函数
(一) 在启动任务函数中创建任务一
//开始任务任务函数 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); //创建任务二执行第三点然后复制上面创建任务一的函数,修改红色字体部分。 OS_CRITICAL_EXIT(); //退出临界区 OSTaskDel((OS_TCB*)0,&err); //删除start_task任务自身 }
(一) 创建任务一的任务函数
//task1任务函数 void task1_task(void *p_arg) { u8 task1_num=0; OS_ERR err; CPU_SR_ALLOC(); p_arg = p_arg; /*初始化硬件相关进入临界区*/ OS_CRITICAL_ENTER(); //硬件相关初始化在这里 OS_CRITICAL_EXIT(); while(1) { task1_num++; //任务执1行次数加1 注意task1_num1加到255的时候会清零!! printf("任务1已经执行:%d次\r\n",task1_num); if(task1_num==5) { OSTaskDel((OS_TCB*)&Task2_TaskTCB,&err); //任务1执行5此后删除掉任务2 printf("任务1删除了任务2!\r\n"); } /*时,分,秒,毫秒*/ OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s } }
(六)添加任务按点三四五点添加,上面程序不完整,只是示例,具体看历程创建任务与删除