跳到主要内容

RT-Thread内存管理

存储空间可以分为两种:内部存储空间和外部存储空间。

内部存储空间主要指 RAM 内存,外部存储空间主要指 Flash 存储。

变量、中间数据一般存放在 RAM 中,只有在实际使用时才将它们从 RAM 调入到 CPU 中进行运算。

一些数据需要的内存大小需要在程序运行过程中根据实际情况确定,这就要求系统具有对内存空间进行动态管理的能力,在用户需要一段内存空间时,向系统申请,系统选择一段合适的内存空间分配给用户,用户使用完毕后,再释放回系统,以便系统将该段内存空间回收再利用。

内存管理的功能特点

实时系统对内存管理有三大严苛要求:

  1. 分配时间确定性:内存分配过程必须在可预测的确定时间内完成,否则会影响实时任务的响应;

  2. 避免内存碎片:频繁分配释放会产生不连续的小内存块,导致无法满足大块内存申请,而嵌入式系统常需常年不间断运行,不能依赖重启解决碎片;

  3. 适应资源多样性:不同嵌入式系统的内存资源差异大(从数十KB到数MB),需要灵活高效的管理算法。

针对这些挑战,RT-Thread 提供了两类内存管理方式——内存堆和内存池。其中内存堆管理进一步细分为三种算法,以适应不同的内存设备:

  • 小内存管理算法:适用于小内存块分配,管理简单,适合资源极紧张的系统;

  • slab 管理算法:面向大内存块,基于对象缓存和复用,减少碎片,提高分配效率;

  • memheap 管理算法:支持多个内存堆,允许将不同物理内存区域统一管理,适用于多内存片或外扩 RAM 的场景。

信息

FreeRTOS 并没有使用标准的 mallocfree,而是设计了一套可插拔的 pvPortMalloc / vPortFree 机制,并直接提供了五种经典的实现算法。

特性heap_1 (最简单)heap_2 (最佳适应)heap_3 (标准C库包装)heap_4 (最佳适应+合并)heap_5 (多区域堆)
时间确定性 (执行时间恒定)低 (非确定性)低 (非确定性)低 (非确定性)低 (非确定性)
内存释放不支持支持支持支持支持
碎片合并无碎片 (不释放) (易产生碎片)取决于C库实现 (合并相邻空闲块) (合并相邻空闲块)
适用内存资源极小型系统,只分配不释放分配释放大小相同的对象依赖链接器设置通用型,大小随机分配和释放多个非连续内存区域 (如内外部RAM)
核心特点简单、确定、无碎片允许释放,但不合并线程安全的malloc包装首选方案,有效避免碎片heap_4的能力 + 支持多块不连续内存

内存堆管理

内存堆管理用于管理一段连续的内存空间:

小内存管理算法

slab 管理算法

memheap 管理算法

内存堆配置和初始化

内存池