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

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

第二十一讲 任务的删除相关推荐

  1. 【第二十一讲】参数解析器

    [第二十一讲]参数解析器 文章目录 [第二十一讲]参数解析器 1-常见参数解析器 2-组合模式在 Spring 中的体现 总结 常见参数解析器 组合模式在 Spring 中的体现 ${} #{} 小技 ...

  2. 织梦仿站系列教程第二十一讲——封面页制作(四)

    织梦搜索提示关键词不少于2个字节 织梦仿站系列教程第二十一讲--封面页制作(四) 看拳击在线的代码,晕,最新新闻和热门新闻竟然是JS调用,我们只好找到这个JS文件,转换成HTML,然后修改. 将如下代 ...

  3. 工具教程第二十一讲:比特儿交易平台APP的使用(一)

    这里是王团长区块链学院,与最优秀的区块链人一起成长!今天给大家具体讲讲火币网交易平台APP如何使用. 点击观看视频教程:工具教程第二十一讲:比特儿交易平台APP的使用(一) 一.客户端下载: 登录比特 ...

  4. 第十九讲:爱情:如何让爱情天长地久 第二十讲:幽默 第二十一讲:爱情自尊

    (注:此为课程第十九课,更新于2017年7月16日) 大家好! 今天我们继续谈论爱情,讲之前先说一下,一位叫Nadia的同学,你的钥匙链落在这教室了,就在我这里,课后请来我这里取. 那我们来讲讲爱情吧 ...

  5. 第二十一讲 特征值和特征向量

    我个人认为麻省理工线性代数这门课,到二十一讲才真正进入有用的部分,因此从这一讲开始做笔记. 一,概念 满足条件:Ax=λx 解释:当向量x经过矩阵A变换后,效果等于向量x乘上任意常数λ 则:x是矩阵A ...

  6. 李宏毅机器学习2016 第二十一讲 隐马尔可夫模型和条件随机场

    视频链接:李宏毅机器学习(2016)_演讲•公开课_科技_bilibili_哔哩哔哩 课程资源:Hung-yi Lee 课程相关PPT已经打包命名好了:链接:https://pan.baidu.com ...

  7. 深聊全链路压测之:第二十一讲 | 如何搭建GoReplay压测平台。

    搭建GoReplay压测平台 1.引言 2.GoReplay 2.1 什么是GoReplay 2.1.1 定义 2.1.2 原理 2.2 环境安装 2.2.1 Golang安装 2.2.2 GoRep ...

  8. 第二十一讲 卷积公式

    一,卷积公式: 已知:, 设: 求: 因为拉氏变换是由幂级数变过来的,所以上面的问题可以转换为下面的问题方便计算: 已知:, 设: 求:,(求解过程省略) 解得卷积公式: 文字解读:两个函数的乘积,等 ...

  9. Python实战从入门到精通第二十一讲——构建一个模块的层级包

    想将你的代码组织成由很多分层模块构成的包. 封装成包是很简单的.在文件系统上组织你的代码,并确保每个目录都定义了一个__init__.py文件. 例如: graphics/__init__.pypri ...

最新文章

  1. 利用Conda尝鲜Python 3.10
  2. java号段_JAVA手机号正则(多号段)
  3. pyhon量化数据处理小细节3---日期格式转换
  4. 服务器放行6in4协议,最简单的接入IPv6网络的方法 – 6in4隧道
  5. git pull rebase
  6. c# mysql存储过程 输出参数值_MySQL 存储过程参数用法 in, out, inout
  7. Mybatis源码解析:sql参数处理(1)
  8. python代码雨_pygame实现烟雨蒙蒙下彩虹雨
  9. Matlab之程序的暂停与中止
  10. candence的图纸大小设置_标准制图图纸尺寸大小
  11. R语言与多元线性回归方程及各种检验
  12. 跳表在Java中的实现
  13. 计算机专业专硕,2018厦门大学计算机专硕考研经验贴(专业课干货!!)
  14. HDU - 2014 青年歌手大奖赛_评委会打分
  15. 为设计指定输入端口驱动强度:set_driving_cell、set_drive 和set_input_transition
  16. OCI runtime create failed: runc create failed: unable to start container process: --docker加载镜像
  17. socket.py line224 in meth return getattr(self._sock, name)(*args) error:[Error 2] No such file or di
  18. 探索ESP8285(2)搭建Windows版MQTT服务器
  19. 计算机二级数据库mysql题库_全国计算机二级mysql数据库模拟试题
  20. bt客户端linux,Ubuntu 16.04安装BT客户端Transmission 2.84

热门文章

  1. 分布式系统和集群的区别
  2. 哲学家就餐问题--信号量和互斥量预防死锁
  3. 理解模板引擎Razor 的原理
  4. 熬之滴水穿石:JSP--HTML中的JAVA代码(6)
  5. 汇编语言随笔(7)-访问内存的寻址方式和实验7(不同寻址方式的使用)
  6. Skynet通讯遇到的奇怪问题
  7. windows server backup
  8. reflow 和 repaint
  9. 我的Android进阶之旅------解决Android Studio编译后安装apk报错:The APK file does not exist on disk...
  10. Cisco交换机中的flash,Rom,RAM,nvram的区别