任务创建、信号量、消息队列、事件标志组、互斥信号量、软件定时器组等需要的 RAM 空间 都是通过动态内存管理从 FreeRTOSConfig.h 文件定义的 heap 空间中申请的。

动态内存管理介绍

FreeRTOS 支持 5 种动态内存管理方案,分别通过文件 heap_1,heap_2,heap_3,heap_4 和 heap_5 实现,这 5 个文件在 FreeRTOS 软件包中的路径是portable\MemMang。

用户创建的 FreeRTOS 工程项目仅需要 5 种方式中的一种。

五种动态内存管理方式简单总结如下,实际项目中,用户根据需要选择合适的:

  • heap_1:五种方式里面最简单的,但是申请的内存不允许释放。
  • heap_2:支持动态内存的申请和释放,但是不支持内存碎片的处理,并将其合并成一个大的内存块。
  • heap_3:将编译器自带的 malloc 和 free 函数进行简单的封装,以支持线程安全,即支持多任务调 用。
  • heap_4:支持动态内存的申请和释放,支持内存碎片处理,支持将动态内存设置在个固定的地址。 (推荐这个)pvPortMalloc() and vPortFree()).
  • heap_5:在 heap_4 的基础上支持将动态内存设置在不连续的区域上。

动态内存和静态内存比较

动态内存 API 函数