没志青年
发布于 2025-06-16 / 25 阅读
0

FreeRTOS 内存管理

FreeRTOS 并不直接使用C语言中的 malloc 和 free,它有自己的、依赖度低、移植性高的库。

FreeRTOS 在 portable/MemMang 目录下提供了5种可选的内存管理方案,分别对应不同的堆管理策略:

名称

描述

优缺点

适用场景

heap_1.c

简单的堆实现,只支持静态分配,无释放。

实现简单,内存泄漏风险小

需要静态分配,无释放需求的场景

heap_2.c

支持分配和释放,使用链表维护空闲内存块。

允许释放,但无合并空闲块

允许释放,内存碎片不多的场景

heap_3.c

封装标准C库 malloc/free,依赖平台实现。

使用方便,但平台相关

移植方便,对内存要求低

heap_4.c

支持分配和释放,且空闲块合并以减少碎片。

支持内存合并,效率较高

需要频繁分配释放,减少碎片的场景

heap_5.c

支持多内存区域合并管理(多个堆区)。

支持复杂内存布局,灵活

多内存区域管理或非连续内存系统

通常,使用的是 heap_4.c

heap1:只支持 malloc,不支持 free,没有 free 也就没有碎片。

heap2:比较完备,但是碎片问题严重。

heap3:对标准的 malloc 和 free 进行了封装,加入了保护。

heap4:对 heap2 的改进,加入相邻内存块合并机制

heap5:支持跨区多个内存块

内存相关函数

申请内存

void *pvPortMalloc(size_t xSize);

释放内存

void vPortFree(void *pv);

获取可用堆内存

算法解析

heap1算法

  • 仅支持静态分配

  • 无法释放

heap2算法

heap3算法

heap4算法

heap5算法