FreeRTOS内存管理

45 阅读1分钟

1. 简介

在使用FreeRTOS创建任务、队列、信号量等对象的时候,一般有动态和静态两种方法。

  • 动态方法: 由FreeRTOS在创建任务、队列、信号量等对象的时候自动地i从所管理的内存堆中申请所创建所需的内存。在对象被删除后,该内存又会释放到FreeRTOS管理的内存堆中。

  • 静态方法: 由用户自定义对象,编译器在编译程序时,会为已经在程序中定义好的对象分配一定的内存空间。创建任务等对象的API函数一般是“static”结尾。并且,静态创建各种对象时需要用户提供各种内存空间。在删除任务、队列等对象后,这些被占用的内存空间会因为被固定下来而没有其他用途。

1.1 不用标准的c库自带的内存管理算法

  1. 占用大量的代码空间
  2. 没有线程安全的相关机制
  3. 运行有不确定性,每次调用这些函数时花费的时间可能都不相同
  4. 内存碎片化

FreeRTOS内存管理算法

image.png

FreeRTOS内存管理相关API函数

申请内存

在一段内存没有被释放之前绝对不能再调用一次函数pvPortMalloc()为其再次分配内存,否则会导致内存泄漏

void * pvPortMalloc(size_t xWantedSize);

释放内存

void vPortFree(void * pv);

获取当前空闲内存的大小

size_t xPortGetFreeHeapSize(void);