一文读懂FreeRTOS的内存管理方法
FreeRTOS 的内存管理机制是指 FreeRTOS 如何分配和释放内存,以及如何避免内存碎片和内存泄漏的问题。
- FreeRTOS 提供了两种内存申请的方法:静态和动态。静态方法是由用户自行定义所需的 RAM,动态方法是由 FreeRTOS 从堆中申请和释放 RAM1。
- FreeRTOS 提供了五种动态内存管理方法,分别对应 heap_1.c、heap_2.c、heap_3.c、heap_4.c 和 heap_5.c 这五个文件。每种方法都有自己的特点和适用场景。
- heap_1.c 只实现了 pvPortMalloc,没有实现 vPortFree。它适用于创建好任务、信号量和队列就不会删除的应用,具有可确定性,不会导致内存碎片,代码实现和内存分配过程简单。
- heap_2.c 实现了 pvPortMalloc 和 vPortFree,使用最佳匹配算法来分配内存。它适用于频繁地创建、删除任务,但是任务的栈大小都是相同的场景。它不会合并相邻的空闲内存,所以会导致严重的内存碎片问题。
- heap_3.c 使用标准 C 库里的 malloc 和 free 函数,所以堆大小由链接器的配置决定,配置项 configTOTAL_HEAP_SIZE 不再起作用。它先暂停 FreeRTOS 的调度器,再去调用这些函数,使用这种方法实现了线程安全。它具有不确定性,效率不高,可能产生内存碎片。
- heap_4.c 使用大数组来分配内存,使用首次适应算法来分配内存。它还会把相邻的空闲内存合并为一个更大的空闲内存,这有助于减少内存碎片问题。它适用于频繁地分配、释放不同大小的内存场景。
- heap_5.c 在 heap_4.c 的基础上增加了对多区域堆的支持,可以把多个不连续的内存区域作为堆来使用。它适用于有多个 RAM 区域或者有外部 RAM 的场景