RT-Thread内存管理
存储空间可以分为两种:内部存储空间和外部存储空间。
内部存储空间主要指 RAM 内存,外部存储空间主要指 Flash 存储。
变量、中间数据一般存放在 RAM 中,只有在实际使用时才将它们从 RAM 调入到 CPU 中进行运算。
一些数据需要的内存大小需要在程序运行过程中根据实际情况确定,这就要求系统具有对内存空间进行动态管理的能力,在用户需要一段内存空间时,向系统申请,系统选择一段合适的内存空间分配给用户,用户使用完毕后,再释放回系统,以便系统将该段内存空间回收再利用。
内存管理的功能特点
实时系统对内存管理有三大严苛要求:
-
分配时间确定性:内存分配过程必须在可预测的确定时间内完成,否则会影响实时任务的响应;
-
避免内存碎片:频繁分配释放会产生不连续的小内存块,导致无法满足大块内存申请,而嵌入式系统常需常年不间断运行,不能依赖重启解决碎片;
-
适应资源多样性:不同嵌入式系统的内存资源差异大(从数十KB到数MB),需要灵活高效的管理算法。
针对这些挑战,RT-Thread 提供了两类内存管理方式——内存堆和内存池。其中内存堆管理进一步细分为三种算法,以适应不同的内存设备:
-
小内存管理算法:适用于小内存块分配,管理简单,适合资源极紧张的系统;
-
slab 管理算法:面向大内存块,基于对象缓存和复用,减少碎片,提高分配效率;
-
memheap 管理算法:支持多个内存堆,允许将不同物理内存区域统一管理,适用于多内存片或外扩 RAM 的场景。
info
FreeRTOS 并没有使用标准的 malloc 和 free,而是设计了一套可插拔的 pvPortMalloc / vPortFree 机制,并直接提供了五种经典的实现算法。
| 特性 | heap_1 (最简单) | heap_2 (最佳适应) | heap_3 (标准C库包装) | heap_4 (最佳适应+合并) | heap_5 (多区域堆) |
|---|---|---|---|---|---|
| 时间确定性 | 高 (执行时间恒定) | 低 (非确定性) | 低 (非确定性) | 低 (非确定性) | 低 (非确定性) |
| 内存释放 | 不支持 | 支持 | 支持 | 支持 | 支持 |
| 碎片合并 | 无碎片 (不释放) | 无 (易产生碎片) | 取决于C库实现 | 有 (合并相邻空闲块) | 有 (合并相邻空闲块) |
| 适用内存资源 | 极小型系统,只分配不释放 | 分配释放大小相同的对象 | 依赖链接器设置 | 通用型,大小随机分配和释放 | 多个非连续内存区域 (如内外部RAM) |
| 核心特点 | 简单、确定、无碎片 | 允许释放,但不合并 | 线程安全的malloc包装 | 首选方案,有效避免碎片 | heap_4的能力 + 支持多块不连续内存 |
内存堆管理
内存堆管理用于管理一段连续的内存空间: