
# 多内存池机制
#### 使用场景
系统中使用多个动态内存池时，需对各内存池进行管理和使用情况统计。
#### 功能说明
系统内存机制中通过链表实现对多个内存池的管理。内存池需回收时可调用对应接口进行去初始化。
通过多内存池机制，可以获取系统各个内存池的信息和使用情况，也可以检测内存池空间分配交叉情况，当系统两个内存池空间交叉时，第二个内存池会初始化失败，并给出空间交叉的提示信息。
| 功能分类    | 接口名             | 描述                                                                                                       |
|:---|:---|:---|
| 初始化内存池  | LOS_MemInit     | 初始化一块指定的动态内存池，大小为size                                                                                    |
| 删除内存池   | LOS_MemDeInit   | 删除指定内存池，仅打开LOSCFG_MEM_MUL_POOL时有效                                                                        |
| 显示系统内存池 | LOS_MemPoolList | 打印系统中已初始化的所有内存池，包括内存池的起始地址、内存池大小、空闲内存总大小、已使用内存总大小、最大的空闲内存块大小、空闲内存块数量、已使用的内存块数量，仅打开LOSCFG_MEM_MUL_POOL时有效 |
   
#### 使用方法
1. 通过make menuconfig打开多内存池机制。
   功能依赖于LOSCFG_MEM_MUL_POOL，使用时在菜单项中开启"Enable Memory multi-pool control"：
   ```
   Debug  ---> Enable a Debug Version---> Enable MEM Debug---> Enable Memory multi-pool control
   ```
   
2. 调用LOS_MemInit接口进行内存池初始化，内存池回收时调用LOS_MemDeInit接口进行去初始化。
3. 调用LOS_MemInfoGet获取指定内存池的信息和使用情况。
4. 调用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
```
