任务的删除
受博客限制,如果您想获得更好的阅读体验,请前往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()删除其他任务时,所需要进行的工作步骤如下:
-
将待删除任务从相关的状态链表中删除,设置相关参数,保证被删除的任务不会再次获得处理器使用权。
-
将待删除任务从其相关的事件链表中删除,设置相关参数,保证被删除的任务不会再次获得处理器使用权。
-
更改当前任务数目。
-
直接释放内存空间。
-
重新计算下个任务解除阻塞的时间。
计算任务解除阻塞的时间的函数为prvResetNextTaskUnblockTime(),因为FreeRTOS系统中所有的阻塞都是由将任务按解除阻塞时间升序挂接到延时任务链表pxDelayedTaskList中实现的,因此prvResetNextTaskUnblockTime()实际上只是读取pxDelayedTaskList下的第一个任务解除阻塞的时间,将其赋值给xNextTaskUnblockTime而已,如果pxDelayedTaskList为空,那么xNextTaskUnblockTime将会被赋值为portMAX_DELAY。
当任务是自己删除自己时,上述步骤的第4步将有所变化。当前任务仍在运行中,此时直接释放其占用的内存可能导致运行错误,因此需要等待其退出运行状态时才能安全的对其占用的内存进行释放。此时上述的步骤4替换为以下两步
-
将待删除任务挂接到待终止任务链表xTasksWaitingTermination中。
-
增加删除待清理任务数uxDeletedTasksWaitingCleanUp。
在完成任务解除阻塞时间更新后,其还会调用一次任务切换,将处理器的使用权交接给其它的任务。FreeRTOS的空闲任务中会调用prvCheckTasksWaitingTermination()函数来检测uxDeletedTasksWaitingCleanUp变量,并依次释放掉挂接在xTasksWaitingTermination链表下的任务占用的内存,完成任务删除。
其具体的代码可以参照源码阅读,这里不进行过多的解释。