UCOSIII任务挂起和恢复
有时候在某个时间段内我们不需要某个任务继续运行,这时,我们可以将它挂起,但是,过了这个时间段后又需要它继续运行,这时,我们可以将它恢复;
小理解点:理论上不需要时将任务删除,需要时再重新创建,这样也行,但是太麻烦。。。。
UCOSIII任务挂起函数:
void OSTaskSuspend (OS_TCB *p_tcb,OS_ERR *p_err);
参数一 “*p_tcb”:被挂起任务的任务控制块;
参数二 “*p_err”:错误码,不同错误码有不同的含义,具体见UCOSIII源代码中这个函数原型那里,那里有详细注释;
函数原型所在位置:UCOSIII源码中,“os_task.c”的大概第1737行;
小知识点:空闲任务不能挂起,如果试图挂起一个空闲任务,这个函数返回值会为:“OS_ERR_TASK_SUSPEND_INT_HANDLER”,这一点在上面说的函数原型所在位置中关于函数返回值的说明那里有详细说明;再有,....同上....,系统任务也不能挂起,比如系统中断服务任务也不能挂起;
UCOSIII任务恢复函数:
void OSTaskResume(OS_TCB *p_tcb,OS_ERR *p_err);
参数一:“*p_tcb”:被挂起任务的任务控制块;
参数二:“*p_err”:错误码,.........同上.........同上...........
函数原型所在位置:UCOSIII源码中,“os_task.c”的大概第1175行;
小知识点:基本同上........同上.........同上.......同上.........没事多看看源码就知道了
例程:这个例程和前面那篇《UCOSIII任务创建》中的例程基本一样,下面给出不一样的地方:
1 //"Led0_task"任务: 2 void Led0_task(void *p_arg) 3 { 4 OS_ERR err; 5 static char i=0; 6 p_arg = p_arg; //故意使用一下这个参数,否则编译器会警告说此参数没有使用 7 while(1) 8 { 9 LED0=~LED0; 10 OSTimeDlyHMSM(0,0,0,300,OS_OPT_TIME_HMSM_STRICT,&err); 11 i++; 12 if(i==15)//上面定义了一个静态变量,当i加到15就将“Led1_task”任务挂起 13 { 14 OSTaskSuspend((OS_TCB*)&Led1TaskTCB,&err);//任务挂起函数 15 printf("挂起了"Led1_task"任务 "); 16 } 17 if(i==25)//当i加到25,再将“Led1_task”任务恢复,这样,任务的挂起和恢复就测试完了 18 { 19 OSTaskResume((OS_TCB*)&Led1TaskTCB,&err);//任务恢复函数 20 printf("恢复了"Led1_task"任务 "); 21 } 22 } 23 }
在上边我们可以看出,任务的挂起和恢复就是在“Led0_task”这个任务中完成的,通过定义一个变量“i”,任务一每次将“i”加1,在 i 等于15和25处分别将“Led1_task”任务挂起和恢复,那么任务现象自然就是,“Led1_task”任务本来是正常执行的,当“i”等于15时,暂停执行了,当“i”等于25时恢复执行了。