第二十一讲 任务的删除
任务删除主要完成的事情:
1、从就绪列表,延时列表等里面删除。 2、任务释放占用的资源。
任务删除的方式有两种:
1、其他任务强制删除他。2、其他任务请求一个标志位,然后这个这个任务判断这个标志位是否有效,然后删除自己。
删除的时候通常会设置一个删除回调函数,具体的资源释放都工作会放在回调函数中。
task结构体中增加: { task->clean = (void(*)(void *))0; // 设置清理函数 task->cleanParam = (void *)0; // 设置传递给清理函数的参数 task->requestDeleteFlag = 0; // 请求删除标记 }
连接回调函数
tTaskSetCleanCallFunc(tTask * task,void(*clean)deleteCallBack(void *para),void *para) { task->clran=deleteCallBack; task->clranParam=para; }
强制删除指定的任务
void tTaskForceDelete (tTask * task) { uint32_t status = tTaskEnterCritical(); if (task->state & TINYOS_TASK_STATE_DELAYED) { tTimeTaskRemove(task); } else if (!(task->state & TINYOS_TASK_STATE_SUSPEND)) { tTaskSchedRemove(task); } // 删除时,如果有设置清理回调函数,则调用清理函数 if (task->clean) { task->clean(task->cleanParam); //调用回调函数 } if (currentTask == task) { tTaskSched(); } // 退出临界区 tTaskExitCritical(status); }
请求删除和检查请求比较简单,就是设置删除标志位和检查删除标志位。
void tTaskRequestDelete (tTask * task) { uint32_t status = tTaskEnterCritical(); task->requestDeleteFlag = 1; tTaskExitCritical(status); } uint8_t tTaskIsRequestedDelete (void) { uint8_t delete; uint32_t status = tTaskEnterCritical(); delete = currentTask->requestDeleteFlag; tTaskExitCritical(status); return delete; }
task运行tTaskIsRequestedDelete 后,发现有其他task删除自己,那就会调用函数删除自己。可以和强制删除函数对比看,还是比较类似的。
void tTaskDeleteSelf (void) { uint32_t status = tTaskEnterCritical(); // 任务在调用该函数时,必须是处于就绪状态,不可能处于延时或挂起等其它状态 // 所以,只需要从就绪队列中移除即可 tTaskSchedRemove(currentTask); // 删除时,如果有设置清理函数,则调用清理函数 if (currentTask->clean) { currentTask->clean(currentTask->cleanParam); } // 接下来,肯定是切换到其它任务去运行 tTaskSched(); tTaskExitCritical(status); }
这个例子还没涉及到堆栈的释放等等。