7. 类型感知内存管理单元

7.1. 本内存管理驱动特性与限制

本驱动基于 FREE RTOSheap_2.c,在此基础上修改 增加了对数据类型的定义

由于采用纯软件方式管理内存分配, 无法解决因频繁申请与释放导致的内存碎片问题

基于此限制,本驱动 仅用于为系统分配各类句柄

增加的数据类型定义, 在释放内存时,驱动并不实际释放内存,而是仅将该内存块标记为可用。该内存块在后续同一数据类型申请时可被复用,但不能用于不同类型的数据申请。

7.1.1. 内存管理方式

  • 纯软件管理内存分配

  • 无法解决频繁申请释放导致的内存碎片问题

  • 仅用于为系统分配各种句柄

  • 增加了数据类型定义支持

7.1.2. 内存释放机制

注意

本驱动的内存释放机制与常规内存管理不同:

  1. 不真正释放内存

  2. 仅将释放的内存标记为可用

  3. 释放后的内存只能再次分配给同类型的数据

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:内存指针;

备注

内存释放时,本驱动并不执行实际的物理释放操作,而是将该内存块标记为逻辑可用。此内存块仅可被后续同数据类型的申请请求复用,不支持跨类型分配。