FreeRTOS解析:任务的删除(TASK-2)

el/2023/10/1 4:17:51

任务的删除

受博客限制,如果您想获得更好的阅读体验,请前往https://github.com/Nrusher/FreeRTOS-Book或者https://gitee.com/nrush/FreeRTOS-Book下载PDF版本阅读,如果您觉得本文不错也可前往star,以示对作者的鼓励。如发现问题欢迎交流。

相关博客:
FreeRTOS解析:List
FreeRTOS解析:TCB_t结构体及重要变量说明(Task-1)
FreeRTOS解析:任务的创建(TASK-2)

FreeRTOS中的任务删除函数为vTaskDelete(),其原型和参数含义如下

void vTaskDelete( TaskHandle_t xTaskToDelete )
  • TaskHandle_t:待删除任务的句柄。

任务删除的调用场景主要可以分为两种,一种是调用vTaskDelete()的任务与待删除的任务xTaskToDelete不是同一个任务(当前任务删除其它任务),另外一种是调用vTaskDelete()的任务与待删除的任务xTaskToDelete是同一个任务(自己删除自己,xTaskToDelete = NULL)

当在当前任务中调vTaskDelete()删除其他任务时,所需要进行的工作步骤如下:

  1. 将待删除任务从相关的状态链表中删除,设置相关参数,保证被删除的任务不会再次获得处理器使用权。

  2. 将待删除任务从其相关的事件链表中删除,设置相关参数,保证被删除的任务不会再次获得处理器使用权。

  3. 更改当前任务数目。

  4. 直接释放内存空间。

  5. 重新计算下个任务解除阻塞的时间。

计算任务解除阻塞的时间的函数为prvResetNextTaskUnblockTime(),因为FreeRTOS系统中所有的阻塞都是由将任务按解除阻塞时间升序挂接到延时任务链表pxDelayedTaskList中实现的,因此prvResetNextTaskUnblockTime()实际上只是读取pxDelayedTaskList下的第一个任务解除阻塞的时间,将其赋值给xNextTaskUnblockTime而已,如果pxDelayedTaskList为空,那么xNextTaskUnblockTime将会被赋值为portMAX_DELAY。

当任务是自己删除自己时,上述步骤的第4步将有所变化。当前任务仍在运行中,此时直接释放其占用的内存可能导致运行错误,因此需要等待其退出运行状态时才能安全的对其占用的内存进行释放。此时上述的步骤4替换为以下两步

  • 将待删除任务挂接到待终止任务链表xTasksWaitingTermination中。

  • 增加删除待清理任务数uxDeletedTasksWaitingCleanUp。

在完成任务解除阻塞时间更新后,其还会调用一次任务切换,将处理器的使用权交接给其它的任务。FreeRTOS的空闲任务中会调用prvCheckTasksWaitingTermination()函数来检测uxDeletedTasksWaitingCleanUp变量,并依次释放掉挂接在xTasksWaitingTermination链表下的任务占用的内存,完成任务删除。

其具体的代码可以参照源码阅读,这里不进行过多的解释。


http://www.ngui.cc/el/1113885.html

相关文章

FreeRTOS解析:任务切换(TASK-3)

任务切换 受博客限制,如果您想获得更好的阅读体验,请前往https://github.com/Nrusher/FreeRTOS-Book或者https://gitee.com/nrush/FreeRTOS-Book下载PDF版本阅读,如果您觉得本文不错也可前往star,以示对作者的鼓励。如发现问题欢迎…

FreeRTOS解析:Mem - 内存管理

FreeRTOS解析:Mem - 内存管理 受博客限制,如果您想获得更好的阅读体验,请前往https://github.com/Nrusher/FreeRTOS-Book或者https://gitee.com/nrush/FreeRTOS-Book下载PDF版本阅读,如果您觉得本文不错也可前往star,以…

vim开箱即用配置---nr_vim

开箱即用,按readme操作即可。 仓库地址:https://gitee.com/nrush/nr_vim

wait_queue机制浅析

wait_queue机制浅析 在内核中,如果一个任务需要等待一个事件,如何实现当事件未发生时该任务睡眠节省CPU资源,当事件发生时任务及时被唤醒继续工作呢?wait_event/wake_up机制是一个不错的选择。下面这个场景展示了wait_queue的基本…

man命令使用指南

man命令是linux下查找shell命令、函数等使用方法的利器。最简单的使用方式是man <the thing you want>。掌握上面那条命令应该也可以满足80%的使用场景了。这里记录一些更加深入的man命令使用的方法&#xff0c;如果还不能满足查询需求&#xff0c;就只能man man再深挖了…

Vscode 搭建舒适的 Markdown 编辑环境

文章目录1. 显示风格2. 图片插入3. 表格处理4 其他1. 显示风格 使用 Markdown notebook(Microsoft)&#xff0c;这个插件可以实现markdown的预览和编辑在同一页面下&#xff0c;显示效果如下。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 KeyComma…

关于++,--的理解

package cn.nrsc.demo01; /** , -- : 增量语句, 用来对变量的自身进行操作的* 解释:* : 对变量的自身进行1操作* --: 对变量的自身进行-1操作* * 使用分为两种:* 单独使用:* ,--写在变量的前面或者是后面,最终的结果是一样的. * 单独使用: 就是变量自身单独成立一行, 没有…

JAVA 强制数据类型转换和隐式数据类型转换

package cn.nrsc.demo01; /** 变量的数据类型转换: (了解)* 强制数据类型转换:* 小的数据类型 变量名 (小的数据类型)大的数据类型的值或者变量* byte < short, char < int < long < float < double* * 占用字节: 1 2 2 …

逻辑运算符与()、或(|)、非(!)、异或(^)及双与()和双或(||)

1 、与(&), 或(|),非(!),异或(^) package cn.nrsc.demo02; /** 逻辑运算符: &, |, ^, !* &(与): 只要有一边为fale, 那么就是false* |(或): 只要有一边为true, 那么就是true* ^(异或): 只要是相同的boolean值, 那么就是false, 不相同才是true* 解释: 用来连接bo…

JAVA 基本数据类型(4大类8小种)

文章目录1、变量的定义及基本数据类型的介绍2、变量定义容易犯的错误1、变量的定义及基本数据类型的介绍 /* 变量的定义格式: 第一种初始化方式: 数据类型 变量名 赋值;第二种初始化方式: 数据类型 变量名; 变量名 赋值;如果变量不赋值,不能直接使用!java中一共有2大数据类型…