目录
1. 预备知识
2. 内存分配方案示例
3. 与堆相关的实用函数
- 预备知识
- 从FreeRTOS V9.0.0 版本开始,可以完全静态分配FreeRTOS 应用程序,不再需要包含堆内存管理器。但是本章讨论动态内存分配,FreeRTOS 在每次创建内核对象时分配RAM,在每次删除内核对象时释放RAM。这种策略减少了系统设计和规划的工作量,简化了API,并最大限度地减少了RAM地占用。
- 可以使用标准C语言库的 malloc() 函数和 free() 函数来分配内存,但由于一些原因,这些函数可能并不适合:
- 在小型嵌入式系统中,malloc() 函数和 free() 函数并不总是可用的。
- 实现的malloc () 函数和 free() 函数可能相对较大,占用了宝贵的代码空间。
- malloc () 函数和 free() 函数很少是线程安全的。
- malloc () 函数和 free() 函数不是确定的,执行函数所需时间会因为不同的调用而有差异。
- malloc () 函数和 free() 函数可能会出现内存碎片化的情况。(比如,堆内的空闲RAM分散成彼此独立的小块,虽然可能总的空闲RAM大小是够的,但是因为其不连续,所以仍无法被分配给某个内存块。)
- malloc () 函数和 free() 函数会使链接器配置复杂化。
- FreeRTOS现在将内存分配视为可移植层部分,因为不同的嵌入式系统有不同的动态内存分配和时间要求。FreeRTOS使用pvPortMalloc() 和 vPortfree() 来分配和释放RAM。
- FreeRTOS 提供了5个pvPortMalloc() 和 vPortfree() 的实现案例,它们分别定义在heap_1.c, …, heap_5.c 源文件中,全部位于 FreeRTOS/Source/portable/MemMang 目录下。
- 内存分配方案示例
(1)heap_1
- heap_1.c 实现了基本的 pvPortMalloc() 函数,并且没有实现vPortFree() 函数。所以,从不删除任务或其他内核对象的应用程序可能会使用heap_1(有些关键系统是禁止使用动态内存分配的,因为存在非确定性)。heap_1 总是确定性的,而且不会引起内存碎片化。 <