内存管理

发布于 2023-08-12  1628 次阅读


内容纲要

内存管理

内存管理简介

​ 在使用 FreeRTOS 创建任务、队列、信号量等对象的时候,FreeRTOS 一般都提供了两种方法,一种是动态地申请创建对象时所需要的内存,这种方法也叫动态方法;一种是由用户自定义对象,在编译器编译程序的时候,会为已经在程序中定义好的对象分配一定的内存空间,这种方法也叫静态方法。

​ 静态方法创建任务、队列、信号量等对象的 API 函数一般是以“Static”结尾的,例如静态创建任务的 API 函数 xTaskCreateStatic()。使用静态方式创建各种对象时,需要用户提供各种内存空间,例如任务的栈空间、任务控制块所用内存空间等等,并且使用静态方式占用的内存空间一般固定下来了,即使任务、队列等被删除后,这些被占用的内存空间也没有其他用途。

​ 在使用动态方式管理内存的时候,FreeRTOS 就能够在创建任务、队列、信号量等对象的时候,自动地从 FreeRTOS 管理的内存堆中申请所创建对象所需的内存,在对象被删除后,又可以将这块内存释放会 FreeRTOS 管理的内存堆,这样看来,动态方式管理内存相比与静态方式, 显得灵活许多。

​ 除了 FreeRTOS 提供的动态内存管理方法,标准的 C 库也提供了函数 malloc()和函数 free() 来实现动态地申请和释放内存,但是标准 C 库的动态内存管理方法有如下几个缺点:

  1. 并不适用于所有嵌入式系统。
  2. 占用大量的代码空间。
  3. 没有线程安全的相关机制。
  4. 具有不确定性,体现在每次执行的时间不同。
  5. ……

​ 为此,FreeRTOS 提供了动态方式管理内存的方法。不同的嵌入式系统对于动态内存管理的需求不同,因此 FreeRTOS 提供了多种内存管理算法选项,并将其作为 FreeRTOS 移植层的一部分,这样一来,FreeRTOS 的使用者就能够根据自己实际的需求选的何时的动态内存管理算法,并将其移植到系统中。

​ FreeRTOS 一共提供了 5 种动态内存管理算法,这 5 种动态内存管理算法本别对应了 5 个 C 源文件,分别为:heap_1.c、heap_2.c、heap_3.c、heap_4.c、heap_5.c,在后面小节中将会讲解 这 5 种动态内存管理算法的异同。

内存管理算法

​ FreeRTOS提供了5种动态内存管理算法,分别为heap_1、heap_2、heap_3、heap_4和heap_5, 这 5 种动态内存管理算法各自的特点如下所示:

heap_1:最简单,只允许申请内存,不允许释放内存。

heap_2:允许申请和释放内存,但不能合并相邻的空闲内存块。

heap_3:简单封装 C 库的函数 malloc()和函数 free(),以确保线程安全。

heap_4:允许申请和释放内存,并且能够合并相邻的空闲内存块,减少内存碎片的产生。

heap_5:能够管理多个非连续内存区域的 heap_4。

​ 根据实际的应用需求选择合适的内存管理算法,一般使用heap_4算法

内存相关API函数

世界のネズミは彼らが望むものに依存し、彼らは彼ら自身から誰も求めません
最后更新于 2023-08-27