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