第二十一讲 任务的删除

任务删除主要完成的事情:

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);
}

 这个例子还没涉及到堆栈的释放等等。

posted on 2018-03-15 11:34  nasduc  阅读(306)  评论(0编辑  收藏  举报

导航