任务的删除
发布日期:2021-07-01 04:26:06
浏览次数:2
分类:技术文章
本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年04月10日 07时15分58秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
mysql JDBC URL参数解析
2019-05-02
数据库复习(4)
2019-05-02
C# TextBox输入密码显示星号(*)
2019-05-02
1小时点击量破千万!阿里巴巴首发:MySQL高级调优笔记!全是技术重点
2019-05-02
这个GItHub上的Java项目开源了 2021最全的Java架构面试复习指南
2019-05-02
Proftpd MySQL [Step by Step]
2019-05-02
EFI Shell 命令参考
2019-05-02
HP-UX oracle RAC 双机实践
2019-05-02
解决SHELL脚本中的export无法生效的问题【转】
2019-05-02
linux中的sh脚本语法【转】
2019-05-02
Linux 内核通用链表学习小结【转】
2019-05-02
区别数据结构中的堆栈与内存中的堆栈的个人总结【转】
2019-05-02
六、判断两个单向链表是否相交
2019-05-02
七、两个有序链表合并(递归方式)
2019-05-02
C++拷贝构造函数(深拷贝,浅拷贝)【转】
2019-05-02
C++ 内联函数 (讲解的TM真好)【转】
2019-05-02
什么时候需要定义拷贝构造函数【转】
2019-05-02
c++类的构造函数详解【转】
2019-05-02