private pool说明


1. 概述

sdk所有模块都在mma里申请内存,如果有频繁destory再create的动作(buffer释放再申请)容易出现内存空隙导致浪费内存。在mma里单独为每个模块分配一块private pool,能有效解决内存碎片问题:

MI_S32 MI_SYS_ConfigPrivateMMAPool(MI_SYS_GlobalPrivPoolConfig_t *pstGlobalPrivPoolConf);

2. 结构体说明

u8MMAHeapName,         ## mma的名字33x系列固定为mma_heap_name0

u32PrivateHeapSize      ## 申请private pool的size(具体每个模块的size见《内存说明.pdf》)。

bCreate            ## TRUE表示申请FALSE表示释放

3. 使用说明

其中eConfigType 包括四种类型mma buffer:

  1. E_MI_SYS_VPE_TO_VENC_PRIVATE_RING_POOL  :  

    RingHeapAlloc  : vpe port 0-->venc间的yuv单独申请一块private pool。

  2. E_MI_SYS_PER_CHN_PRIVATE_POOL :

    每个venc chnnel 单独申请一块private pool。

  3. E_MI_SYS_PER_DEV_PRIVATE_POOL :

    1. 为所有ISP buffer申请一块private pool。

    2. 为所有RGN申请一块private pool。

    3. 为ao dev单独申请一块private pool,size= ao_Dev0_dma + ao-Dev0-tmp。

    4. 为ai dev单独申请一块private pool,size= ai-Dev0-dma + ai0-out0 * depth。

  4. E_MI_SYS_PER_CHN_PORT_OUTPUT_POOL :

    1. 每个vpe port 单独申请一块private pool, size=vpe0-outx-y  (x表示vpe chnnel ,y 表示port) *depth。

    2. 每个divp chnnel 单独申请一块private pool , size=divp0-outx-0 (x表示divp chnnel) *depth。

sample code请参考int ConfigMMAHeap(USER_MMA_INFO *MmaParam,int alloc_flag);

建议: MI_SYS_INIT() 后,就立即调该api 申请每个模块的Private Pool。这样可以最大化的避免碎片。

为所有模块申请private pool后,cat /proc/mi_modules/mi_sys_mma/mma_heap0_name检查每个private pool是否申请过大或者过小。过大会浪费内存,过小会让模块buffer在private pool申请不到而跑到mma里申请。