zoukankan      html  css  js  c++  java
  • 第二十一讲 任务的删除

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

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

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

  • 相关阅读:
    cuda、cudnn环境配置
    1.python的 a,b=b,a+b 和 a=b b=a+b 的区别
    例子:循环语句--打印一个菱形
    7.python基础语法--format()函数
    例子:循环语句--九九乘法表
    例子:循环语句--输入N个整数,判断最大值,最小值,和,平均值。
    例子:循环语句--素数问题
    例子:循环语句--打印一个边长为n的正方形。
    例子:循环语句--给定一个不超过5位的正整数,判断该数的位数,依次打印出个位、十位、百位、千位、万位的数字。
    6.python基础语法--循环结构
  • 原文地址:https://www.cnblogs.com/nasduc/p/8572635.html
Copyright © 2011-2022 走看看