第二十一讲 任务的删除

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

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

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

转载于:https://www.cnblogs.com/nasduc/p/8572635.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值