V9.0.0版本之前为下列对象分配内存采用动态的方式,在之后的版本才允许应用程序开发者自己静态的分配内存;

  • 任务
  • 软件定时器
  • 队列
  • 事件组
  • 二值信号量
  • 计数信号量
  • 递归信号量
  • 互斥量

当然,具体使用静态分配还是动态分配由开发者自己决定。

动态分配

动态分配的好处在于使用灵活简单、同时潜在的可以降低内存占用。

  • 更少的函数参数
  • 内存分配使用RTOS提供的API自动分配
  • 应用程序开发者不需要自己去考虑内存分配,只要内存足够
  • 如果某个对象被删除,则它占用的那部分空间可以回收再利用
  • RTOS的API函数提供堆内存的使用信息返回,方便优化堆内存大小
  • 内存分配机制可以选择最适合应用程序的,例如heap_1.c适用于简单的和对内存安全有限制的应用,heap_4.c用于碎片保护,heap_5.c分散堆到多个RAM区域。

下列API用于动态内存分配,configSUPPORT_DYNAMIC_ALLOCATION设置项需要设置为1,或者不定义。

  • xTaskCreate()
  • xQueueCreate()
  • xTimerCreate()
  • xEventGroupCreate()
  • xSemaphoreCreateBinary()
  • xSemaphoreCreateCounting()
  • xSemaphoreCreateMutex()
  • xSemaphoreCreateRecursiveMutex()

具体使用方法参考官方API参考手册

静态分配

静态内存分配的好处:

  • RTOS 对象可以放置在内存中的特定位置
  • 最大的内存使用在编译的时候就可以确定,而不是运行的时候
  • 开发者不需要考虑内存分配失败的情况
  • 允许不去动态分配内训,这样在使用RTOS上会简单点(尽管freeRTOS的内存分配机制以及可以克服大多数不利条件)

configSUPPORT_STATIC_ALLOCATION设置为1时,可以使用下列API函数实现静态内存分配,分配好的静态内存地址传递给API函数。使用方法可以参考StaticAllocation.c

  • xTaskCreateStatic()
  • xQueueCreateStatic()
  • xTimerCreateStatic()
  • xEventGroupCreateStatic()
  • xSemaphoreCreateBinaryStatic()
  • xSemaphoreCreateCountingStatic()
  • xSemaphoreCreateMutexStatic()
  • xSemaphoreCreateRecursiveMutexStatic()