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、內核對象之前調用。