任务挂起函数: INT8U OSTaskSuspend (INT8U prio);将优先级别为prio的任务挂起,挂起任务就是停止任务的运行,并触发一次调度。
任务恢复函数: INT8U OSTaskResume (INT8U prio);将优先级为prio的任务恢复,恢复任务就是让挂起的任务进入就绪状态,并触发一次调度。
任务请求删除函数:INT8U OSTaskDelReq (INT8U prio);请求删除优先级别prio的任务。
任务删除函数: INT8U OSTaskDel (INT8U prio);删除优先级为prio的任务,删除任务之后,任务身份吊销了,没法再运行了。
在任务TaskKey中,我们循环扫描键值,如果KEY0按下,那么调用
OSTaskSuspend(LED_TASK_Prio);
OSTaskSuspend(LCD_TASK_Prio);
将任务TaskLed和任务TaskLCD挂起,这个时候,任务将不在执行(LED0停止闪烁,LCD停止循环显示),处于等待状态直到在其他任务中调用解挂函数OSTaskResume()将任务解挂。
如果KEY1按键,将调用函数:
OSTaskResume(LED_TASK_Prio);
OSTaskResume(LCD_TASK_Prio);
将任务TaskLed和任务TaskLCD恢复,这个时候,任务将重新开始进入就绪状态,并引发一次任务调度。我们便可以看到LED0恢复闪烁,LCD恢复循环显示。
如果KEY2按键按下,那么将调用函数:
OSTaskDelReq(LED_TASK_Prio);
OSTaskDelReq(LCD_TASK_Prio);
请求将任务TaskLed和TaskLCD删除,记住,这里只是请求而不是删除。那么在任务TaskLed和TaskLCD执行的时候,将同时调用这个方法判断是否有任务删除请求,如果有那么将执行删除操作:
if(OSTaskDelReq(OS_PRIO_SELF)==OS_TASK_DEL_REQ)
OSTaskDel(OS_PRIO_SELF);
也就是说,删除任务是分两步来执行,第一步为请求删除任务,第二步才是删除任务。这样做的好处是在系统设计的时候避免直接删除导致任务有些资源没有释放而导致系统运行不正常。
删除任务之后,任务TaskLed和TaskLCD将处于睡眠状态,将不会被系统调度。这个时候可以看到LED0不再闪烁,LCD也不会循环显示。