多内存池机制
使用场景
系统中使用多个动态内存池时,需对各内存池进行管理和使用情况统计。
功能说明
系统内存机制中通过链表实现对多个内存池的管理。内存池需回收时可调用对应接口进行去初始化。
通过多内存池机制,可以获取系统各个内存池的信息和使用情况,也可以检测内存池空间分配交叉情况,当系统两个内存池空间交叉时,第二个内存池会初始化失败,并给出空间交叉的提示信息。
功能分类 |
接口名 |
描述 |
---|---|---|
初始化内存池 |
LOS_MemInit |
初始化一块指定的动态内存池,大小为size |
删除内存池 |
LOS_MemDeInit |
删除指定内存池,仅打开LOSCFG_MEM_MUL_POOL时有效 |
显示系统内存池 |
LOS_MemPoolList |
打印系统中已初始化的所有内存池,包括内存池的起始地址、内存池大小、空闲内存总大小、已使用内存总大小、最大的空闲内存块大小、空闲内存块数量、已使用的内存块数量,仅打开LOSCFG_MEM_MUL_POOL时有效 |
使用方法
- 通过make menuconfig打开多内存池机制。
- 调用LOS_MemInit接口进行内存池初始化,内存池回收时调用LOS_MemDeInit接口进行去初始化。
- 调用LOS_MemInfoGet获取指定内存池的信息和使用情况。
- 调用LOS_MemPoolList获取系统所有内存池信息和使用情况。
注意事项
- 初始化内存池时,需保证各内存池空间无交叉,若交叉则会导致初始化失败。
- malloc/free系列接口默认从OS系统内存池申请和释放内存,其它内存池的操作必须调用Huawei LiteOS内存接口(LOS_MemAlloc等),不能调用malloc/free系列接口及其相关封装接口。
- 内存池回收必须调用LOS_MemDeInit接口去初始化(回收前需确保池中内存块均已释放),否则二次初始化该内存池空间会失败,导致该内存池不能被重新使用。
- 内存池大小需根据业务实际情况合理分配。
编程实例
void test(void) { UINT32 ret = 0; UINT32 size = 0x100000; VOID *poolAddr1 = LOS_MemAlloc(OS_SYS_MEM_ADDR, size); ret = LOS_MemInit(poolAddr1, size); if (ret != 0) { PRINTK("LOS_MemInit failed\n"); return; } VOID *poolAddr2 = LOS_MemAlloc(OS_SYS_MEM_ADDR, size); ret = LOS_MemInit(poolAddr2, size); if (ret != 0) { PRINTK("LOS_MemInit failed\n"); return; } PRINTK("\n********step1 list the mem poll\n"); LOS_MemPoolList(); LOS_MemDeInit(poolAddr1); if (ret != 0) { PRINTK("LOS_MemDeInit failed\n"); return; } PRINTK("\n********step2 list the mem poll\n"); LOS_MemPoolList(); LOS_MemDeInit(poolAddr2); if (ret != 0) { PRINTK("LOS_MemDeInit failed\n"); return; } PRINTK("\n********step3 list the mem poll\n"); LOS_MemPoolList(); }
log:
********step1 list the mem poll pool0 : pool addr pool size used size free size max free node size used node num free node num --------------- -------- ------- -------- -------------- ------------- ------------ 0x8017b2c0 0x100000 0x2e1fc 0xd1d20 0xd1d20 0x2b 0x1 pool1 : pool addr pool size used size free size max free node size used node num free node num --------------- -------- ------- -------- -------------- ------------- ------------ 0x8027b2c0 0x7d84d40 0x7070c8 0x767db94 0x767db94 0x1026 0x1 pool2 : pool addr pool size used size free size max free node size used node num free node num --------------- -------- ------- -------- -------------- ------------- ------------ 0x8078244c 0x100000 0x10 0xfff0c 0xfff0c 0x1 0x1 pool3 : pool addr pool size used size free size max free node size used node num free node num --------------- -------- ------- -------- -------------- ------------- ------------ 0x8088245c 0x100000 0x10 0xfff0c 0xfff0c 0x1 0x1 ********step2 list the mem poll pool0 : pool addr pool size used size free size max free node size used node num free node num --------------- -------- ------- -------- -------------- ------------- ------------ 0x8017b2c0 0x100000 0x2e1fc 0xd1d20 0xd1d20 0x2b 0x1 pool1 : pool addr pool size used size free size max free node size used node num free node num --------------- -------- ------- -------- -------------- ------------- ------------ 0x8027b2c0 0x7d84d40 0x7070c8 0x767db94 0x767db94 0x1026 0x1 pool2 : pool addr pool size used size free size max free node size used node num free node num --------------- -------- ------- -------- -------------- ------------- ------------ 0x8088245c 0x100000 0x10 0xfff0c 0xfff0c 0x1 0x1 ********step3 list the mem poll pool0 : pool addr pool size used size free size max free node size used node num free node num --------------- -------- ------- -------- -------------- ------------- ------------ 0x8017b2c0 0x100000 0x2e1fc 0xd1d20 0xd1d20 0x2b 0x1 pool1 : pool addr pool size used size free size max free node size used node num free node num --------------- -------- ------- -------- -------------- ------------- ------------ 0x8027b2c0 0x7d84d40 0x7070c8 0x767db94 0x767db94 0x1026 0x1