博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第二十一讲 任务的删除
阅读量:6373 次
发布时间:2019-06-23

本文共 1899 字,大约阅读时间需要 6 分钟。

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

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

你可能感兴趣的文章
China Unicom and Chunghwa Telecom work together&nb
查看>>
Java图片上查找图片算法
查看>>
Python fabric实现远程操作和部署
查看>>
详解Java中staitc关键字
查看>>
前中情局局长:FBI目的是从根本上改善iPhone
查看>>
大隐隐于市,你身边的那些安全隐患你都知道么?
查看>>
物联网市场迅猛发展 “中国芯”如何把握机会?
查看>>
aws 上使用elb 的多域名问题
查看>>
环球花木网的目标就是致力于打造成为“园林相关行业的专业性门户网站
查看>>
《编写高质量代码:改善c程序代码的125个建议》—— 建议14-1:尽量避免对未知的有符号数执行位操作...
查看>>
《C语言编程魔法书:基于C11标准》——2.2 整数在计算机中的表示
查看>>
全球程序员编程水平排行榜TOP50,中国排名第一
查看>>
HDFS 进化,Hadoop 即将拥抱对象存储?
查看>>
Edge 浏览器奇葩 bug:“123456”打印成“114447”
查看>>
Sirius —— 开源版的 Siri ,由 Google 支持
查看>>
《OpenGL ES应用开发实践指南:Android卷》—— 2.7 小结
查看>>
《Windows Server 2012活动目录管理实践》——第 2 章 部署第一台域控制器2.1 案例任务...
查看>>
Java Date Time 教程-时间测量
查看>>
Selector.wakeup实现注记
查看>>
《Java EE 7精粹》—— 第1章 Java EE 1.1 简介
查看>>