FreeRTOS Heap 1_2_3_4_5 比较

TOC

heap_1

  • 在调度程序运行前,提前动态分配一大段内存空间,不管任务用与不用,用多少,内存占用是固定的
  • 商业,安全领域,禁止动态分配内存
    • basic version api: pvPortMalloc(),没有vPortFree()!
    • configTOTAL_HEAP_SIZE in FreeRTOSConfig.h

每创建一个任务,都需要一个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、内核对象之前调用。




posted @ 2021-01-01 16:00  JerryZheng2020  阅读(1490)  评论(0编辑  收藏  举报