FreeRTOS Heap 1_2_3_4_5 比较
heap_1
- 在调度程序运行前,提前动态分配一大段内存空间,不管任务用与不用,用多少,内存占用是固定的
- 商业,安全领域,禁止动态分配内存
- basic version api:
pvPortMalloc()
,没有vPortFree()! configTOTAL_HEAP_SIZE
in FreeRTOSConfig.h
- basic version api:
每创建一个任务,都需要一个
task control block (TCB)
heap_2
- heap_2 是为了向后兼容才保留的,建议新的设计中使用heap_4代替。
- heap_2 允许释放内存
- heap_2 与 heap_1一样需要分割
configTOTAL_HEAP_SIZE
所静态分配的内存 - 最合适内存分配算法,比如要分配20bytes, 现在有5,25,50等内存区域,heap_2就会将25分配出20bytes。
- 但heap_2 不能整合相邻的空闲内存区域, heap_4可以。
- heap_2 适合于,重复性申请和释放内存的操作,并且每次内存大小都一样。
heap_3
- heap_3 使用标准库
malloc()
和free()
函数,configTOTAL_HEAP_SIZE
将不起作用。 heap 大小决定于linker配置
heap_4
- heap_4 与heap_1、heap_2 一样是从内存数组分配出小的内存块
- 内存数组大小决定于
configTOTAL_HEAP_SIZE
,这就造成一种现象:虽然没有任何内存被分配,但程序已经消耗了很多的内存。 - heap_4 采用 内存适配算法 和 相邻内存整合算法(减少了内存碎片化的风险)
heap_5
- heap_5 分配和释放内存的算法 和 heap_4 一样。
- heap_5 不局限于从静态内存数组中分配内存,它可以从 多个、不连续的内存空间中分配内存。
- 当使用heap_5时,
vPortDefineHeapRegions()
必须在 pvPofrtMalloc、内核对象之前调用。