任务的删除
发布日期:2021-07-01 04:26:06 浏览次数:3 分类:技术文章

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

文章目录

1 任务的删除

1.1 任务删除问题

删除任务需要做如下两项工作:

  1. 将任务从所在队列中删除。
    在这里插入图片描述
  2. 释放关闭占用的资源。

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秒