嵌入式学习笔记 - freeRTOS 动态创建任务跟静态创建任务的区别,以及内存回收问题
FreeRTOS动态创建任务和静态创建任务各有优缺点,选择哪种方式取决于具体的应用场景和需求。
一 动态创建任务
优点:
- 灵活性高:动态任务在运行时通过
pvPortMalloc()
动态分配内存,系统自动管理栈和任务控制块(TCB)。这使得任务可以随时创建和删除,适合需要频繁创建/删除任务的场景。 - 内存管理方便:动态任务不需要用户手动分配内存,系统会自动管理内存的分配和释放,减少了内存管理的复杂性。
缺点:
- 性能开销:动态内存分配和管理会增加一定的性能开销,尤其是在高频创建和销毁任务时,可能会影响系统的实时性。
- 内存碎片:动态内存分配可能导致内存碎片问题,尤其是在长期运行的应用中。
二 静态创建任务
优点:
- 性能优越:静态任务在编译时分配内存,内存使用可预测,没有动态内存分配的开销,适合对实时性要求高的场景。
- 减少碎片:由于内存是在编译时分配的,避免了动态内存分配带来的碎片问题。
缺点:
- 灵活性差:静态任务需要用户手动分配内存,不适合需要频繁创建和删除任务的场景。一旦任务数量确定,难以动态调整。
- 内存管理复杂:用户需要手动管理任务控制块和栈空间的分配,增加了开发的复杂度
三 内存回收问题
静态创建的任务在任务删除后,其任务栈空间和任务控制块空间仍然存在
在FreeRTOS中,静态创建的任务被删除后,其任务栈空间仍然存在,不会被自动释放。原因如下:
-
静态创建任务时,栈空间由用户显式分配
静态创建任务需要开发者预先定义并分配任务栈空间(通常是全局数组或静态变量)和任务控制块(TCB)所需的内存。这些内存不由FreeRTOS堆管理器管理 。 -
任务删除操作仅移除任务调度相关结构,不释放用户分配的栈内存
当调用vTaskDelete()
删除任务时,FreeRTOS完成的操作包括:- 将任务从就绪列表、阻塞列表、挂起列表和事件列表中移除。
- 释放由内核动态分配的资源(如链表节点)。
- 对于动态创建的任务,空闲任务会回收其栈和TCB占用的堆内存。
- 对于静态创建的任务,内核不会回收用户预先分配的栈空间和TCB结构体所占用的内存 。
-
静态内存的回收责任在用户
静态创建方式的内存管理责任完全在开发者。任务删除后,原先用于该任务的栈数组和TCB结构体所占用的内存空间依然保留在系统中。开发者可根据需要:- 复用该内存空间创建新任务。
- 重新分配作其他用途。
- 在程序生命周期内不再使用(但需注意内存占用问题)。
总结:
FreeRTOS静态创建任务的栈空间在任务删除后依然存在且不会被内核自动回收。开发者需自行管理这些预分配内存的生命周期和后续使用,避免内存浪费或泄漏。