FreeRTOS内存管理简介
在使用 FreeRTOS 创建任务、队列、信号量等对象的时候, FreeRTOS 一般都提供了两种方法,
- 动态方法创建:自动地从 FreeRTOS 管理的内存堆中申请所创建对象所需的内存,在对象被删除后,又可以将这块内存释放会 FreeRTOS 管理的内存堆。
- 静态方法创建:需要用户提供各种内存空间,并且使用静态方式占用的内存空间一般固定下来了,即使任务、队列等被删除后,这些被占用的内存空间也没有其他用途。
备注 :动态方式管理比静态方式更加灵活。
标准的 C 库也提供了函数 malloc()和函数 free()来实现动态地申请和释放内存,但是标准 C 库的动态内存管理方法有如下几个缺点,
- 占用大量的代码空间,不适合用在资源紧缺的嵌入式系统
- 没有线程安全的相关机制。
- 具有不确定性,体现在每次执行的时间不同。
- 内存碎片化
FreeRTOS内存管理算法
FreeRTOS提供了5种动态内存管理算法,分别为heap_1、heap_2、heap_3、heap_4和heap_5,这 5 种动态内存管理算法各自的特点如下所示:
- heap_1: 最简单,只允许申请内存,不允许释放内存。
- heap_2: 允许申请和释放内存,但不能合并相邻的空闲内存块。
- heap_3: 简单封装 C 库的函数 malloc()和函数 free(), 以确保线程安全。
- heap_4: 允许申请和释放内存,