7. 类型感知内存管理单元
7.1. 本内存管理驱动特性与限制
本驱动基于 FREE RTOS 的
heap_2.c,在此基础上修改 增加了对数据类型的定义 。由于采用纯软件方式管理内存分配, 无法解决因频繁申请与释放导致的内存碎片问题 。
基于此限制,本驱动 仅用于为系统分配各类句柄 ;
增加的数据类型定义, 在释放内存时,驱动并不实际释放内存,而是仅将该内存块标记为可用。该内存块在后续同一数据类型申请时可被复用,但不能用于不同类型的数据申请。
7.1.1. 内存管理方式
纯软件管理内存分配
无法解决频繁申请释放导致的内存碎片问题
仅用于为系统分配各种句柄
增加了数据类型定义支持
7.1.2. 内存释放机制
注意
本驱动的内存释放机制与常规内存管理不同:
不真正释放内存
仅将释放的内存标记为可用
释放后的内存只能再次分配给同类型的数据
7.1.3. 工作流程示例
1. 申请 TypeA 类型内存 → 分配新内存块
2. 释放 TypeA 类型内存 → 标记为"TypeA可用"
3. 再次申请 TypeA 类型 → 复用步骤2的内存
4. 申请 TypeB 类型内存 → 分配新内存块(不可复用TypeA内存)
备注
1. 碎片问题:由于不真正释放内存,长期运行仍可能产生碎片
2. 类型隔离:不同类型内存完全隔离,不能交叉使用
3. 适用场景:适合句柄类固定大小、类型明确的数据分配
4. 性能影响:减少实际分配次数,但增加类型匹配开销
7.2. 函数接口说明
7.2.1. 函数 void vPortInit(void *pAddr, uint32_t xLen)
此函数为指定内存管理单元分配物理区域:
1. pAddr:分配给内存管理单元的起始位置;
2. xLen:分配给内存管理单元的字节长度;
3. 返回值:
成功 0;
失败 错误请查看 errno-base.h。
7.2.2. 函数 void vPort_disable()
此函数标记内存单元为未初始化,调用此函数后,可以重新调用函数 vPortInit,实现内存管理的复位。
备注
用户若调用
vPort_disable() + vPortInit(),内存管理完全复位;那么之前申请到的所有内存将失效,客户不可以再使用之前申请的内存。
为避免产生野指针问题,不建议客户使用此方法。
7.2.3. 函数 void *pvPortMalloc(size_t xWantedSize, mm_type type)
申请内存:
1. xWantedSize:申请的长度;
2. type:申请的数据类型;
3. 返回值:
成功 内存指针;
失败 0。
7.2.4. 函数 void vPortFree(void *pv)
释放内存:
1. pv:内存指针;
备注
内存释放时,本驱动并不执行实际的物理释放操作,而是将该内存块标记为逻辑可用。此内存块仅可被后续同数据类型的申请请求复用,不支持跨类型分配。