多模块内存统计
使用场景
系统业务模块化清晰,用户需统计各模块的内存占用情况。
功能说明
Huawei LiteOS提供了一套基于内核内存接口的封装接口,增加模块ID作为入参。不同业务模块进行内存操作时,调用对应封装接口,可统计各模块的内存使用情况,并通过模块ID获取指定模块的内存使用情况。
功能分类 |
接口名 |
描述 |
---|---|---|
为指定模块申请、释放动态内存,并纳入模块统计 |
LOS_MemMalloc |
从指定动态内存池分配size长度的内存给指定模块 |
LOS_MemMfree |
释放指定模块的内存块 |
|
LOS_MemMallocAlign |
从指定动态内存池中申请长度为size且地址按boundary字节对齐的内存给指定模块 |
|
LOS_MemMrealloc |
按size大小重新分配内存块给指定模块,并将原内存块内容拷贝到新内存块。如果新内存块申请成功,则释放原内存块 |
|
获取指定模块的内存使用量 |
LOS_MemMusedGet |
获取指定模块的内存使用量,单位为Byte |
使用方法
- 通过make menuconfig打开多模块内存统计功能。
- 目前只有bestfit内存管理算法支持该功能,需要使能LOSCFG_KERNEL_MEM_BESTFIT:
Kernel ---> Memory Management ---> Dynamic Memory Management Algorithm ---> bestfit
- 该功能依赖于LOSCFG_MEM_MUL_MODULE,使用时需要在菜单项中开启“Enable Memory module statistics”:
Debug ---> Enable a Debug Version ---> Enable MEM Debug ---> Enable Memory module statistics
- 目前只有bestfit内存管理算法支持该功能,需要使能LOSCFG_KERNEL_MEM_BESTFIT:
- 每个业务模块配置唯一module ID,模块代码中在内存操作时调用对应接口,并传入相应模块ID。
- 通过LOS_MemMusedGet接口获取指定模块的内存使用情况,可用于模块内存占用优化分析。
注意事项
- 模块ID由宏MEM_MODULE_MAX限定,当系统模块个数超过该值时,需修改MEM_MODULE_MAX。
- 模块中所有内存操作都需调用封装接口,否则可能导致统计不准确。
- 目前只有bestfit内存管理算法支持该功能,需要使能LOSCFG_KERNEL_MEM_BESTFIT。
编程实例
void test(void) { void *ptr = NULL; void *ptrTmp = NULL; UINT32 size = 0x10; UINT32 module = 0; UINT32 memUsed = 0; ptr = LOS_MemMalloc(OS_SYS_MEM_ADDR, size, module); if (ptr == NULL) { PRINTK("module %d malloc failed\n", module); } else { PRINTK("module %d malloc successed\n", module); } memUsed = LOS_MemMusedGet(module); PRINTK("module %d mem used size %d\n", module, memUsed); module = 1; ptrTmp = LOS_MemMalloc(OS_SYS_MEM_ADDR, size, module); if (ptrTmp == NULL) { PRINTK("module %d malloc failed\n", module); } else { PRINTK("module %d malloc successed\n", module); } memUsed = LOS_MemMusedGet(module); PRINTK("module %d mem used size %d\n", module, memUsed); module = 0; LOS_MemMfree(OS_SYS_MEM_ADDR, ptr, module); module = 1; LOS_MemMfree(OS_SYS_MEM_ADDR, ptrTmp, module); }
log:
module 0 malloc successed module 0 mem used size 32 module 1 malloc successed module 1 mem used size 32