任务的删除
发布日期:2021-07-01 04:26:06
浏览次数:3
分类:技术文章
本文共 3715 字,大约阅读时间需要 12 分钟。
文章目录
1 任务的删除
1.1 任务删除问题
删除任务需要做如下两项工作:
- 将任务从所在队列中删除。
- 释放关闭占用的资源。
1.2 安全删除原理
安全删除方式一:设置清理回调函数,在强制删除时调用。
安全删除方式之二:设置删除请求标志,由任务自己决定何时删除。 两种删除方式的比较:1.3 设计实现
添加删除清理和请求删除标志位函数:
请求删除函数: 检查是否请求删除函数: 删除自己函数: 强制删除函数: 关键代码实现如下:/************************************************************************************************************ Function name : tTaskSetCleanCallFunc** Descriptions : 设置任务被删除时调用的清理函数** parameters : task 待设置的任务** parameters : clean 清理函数入口地址** parameters : param 传递给清理函数的参数** Returned value : 无***********************************************************************************************************/void tTaskSetCleanCallFunc (tTask * task, void (*clean)(void * param), void * param) { task->clean = clean; task->cleanParam = param;}/************************************************************************************************************ Function name : tTaskForceDelete** Descriptions : 强制删除指定的任务** parameters : task 需要删除的任务** Returned value : 无***********************************************************************************************************/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); }/************************************************************************************************************ Function name : tTaskRequestDelete** Descriptions : 请求删除某个任务,由任务自己决定是否删除自己** parameters : task 需要删除的任务** Returned value : 无***********************************************************************************************************/void tTaskRequestDelete (tTask * task){ // 进入临界区 uint32_t status = tTaskEnterCritical(); // 设置清除删除标记 task->requestDeleteFlag = 1; // 退出临界区 tTaskExitCritical(status); }/************************************************************************************************************ Function name : tTaskIsRequestedDelete** Descriptions : 是否已经被请求删除自己** parameters : 无** Returned value : 非0表示请求删除,0表示无请求***********************************************************************************************************/uint8_t tTaskIsRequestedDelete (void){ uint8_t delete; // 进入临界区 uint32_t status = tTaskEnterCritical(); // 获取请求删除标记 delete = currentTask->requestDeleteFlag; // 退出临界区 tTaskExitCritical(status); return delete;}/************************************************************************************************************ Function name : tTaskDeleteSelf** Descriptions : 删除自己** parameters : 无** Returned value : 无***********************************************************************************************************/void tTaskDeleteSelf (void){ // 进入临界区 uint32_t status = tTaskEnterCritical(); // 任务在调用该函数时,必须是处于就绪状态,不可能处于延时或挂起等其它状态 // 所以,只需要从就绪队列中移除即可 tTaskSchedRemove(currentTask); // 删除时,如果有设置清理函数,则调用清理函数 if (currentTask->clean) { currentTask->clean(currentTask->cleanParam); } // 接下来,肯定是切换到其它任务去运行 tTaskSched(); // 退出临界区 tTaskExitCritical(status);}
参考资料:
转载地址:https://muzimin.blog.csdn.net/article/details/104993701 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年04月10日 08时18分44秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux Shell编程入门
2019-05-02
EMACS利用etags查阅大型工程代码
2019-05-02
C++名稱空間(Namespace)的介绍
2019-05-02
通过源码查看Android 版本
2019-05-02
getopts命令详解
2019-05-02
Java接口详解
2019-05-02
gprof使用
2019-05-02
详细解析Java中抽象类和接口的区别
2019-05-02
JAVA中extends 与implements区别
2019-05-02
高内聚、低耦合
2019-05-02
C++多态性,虚函数与纯虚函数
2019-05-02
虚函数的作用
2019-05-02
设计模式C++学习笔记之二(Proxy代理模式)
2019-05-02
设计模式C++学习笔记之三(Singleton单例模式)
2019-05-02
优先使用对象组合,而不是类继承
2019-05-02
Java 程序员应该了解的 10 个面向对象设计原则
2019-05-02
穿透代理服务器编程
2019-05-02
SOCKS/HTTP代理协议解析
2019-05-02
shell中$(( )) 与 $( ) 还有${ }的区别
2019-05-02