文章目录
- 静态内存管理
- 开发配置
- 注意事项
- LiteOS_华为云
静态内存管理:在静态内存池中分配用户初始化时预设的固定大小的内存块;
- 分配和释放效率高,静态内存池中无碎片?;
- 只能申请到预设大小的内存块,不能按需申请;
静态内存管理
实质是一个静态数组,静态内存池内的块大小在初始化时设定,初始化后块大小不可变更。静态内存池有一个控制块和若干相同大小的内存块构成。
功能 | 接口名 | 描述 |
初始化静态内存 | LOS_MemboxInit | 初始化一个静态内存池,设定其起始地址、总大小及每个块大小 |
清除静态内存块内容 | LOS_MemboxClr | 清零指定静态内存块的内容 |
申请、释放静态内存 | LOS_MemboxAlloc | 从指定的静态内存池中申请一块静态内存块 |
申请、释放静态内存 | LOS_MemboxFree | 释放指定的一块静态内存块 |
获取、打印静态内存池信息 | LOS_MemboxStatisticsGet | 获取指定静态内存池的信息,包括内存池中总内存块数量、已经分配出去的内存块数量、每个内存块的大小 |
获取、打印静态内存池信息 | LOS_ShowBox | 打印指定静态内存池所有节点信息(打印等级是LOS_INFO_LEVEL),包括内存池起始地址、内存块大小、总内存块数量、每个空闲内存块的起始地址、所有内存块的起始地址 |
typedef struct
{
UINT32 uwBlkSize; /* 内存块的大小 */
UINT32 uwBlkNum; /* 内存块总数 */
UINT32 uwBlkCnt; /* 已经分配使用的块数 */
LOS_MEMBOX_NODE stFreeList; /* 内存控制块的空闲链表,指针指向下一个可用的内存块 */
} LOS_MEMBOX_INFO;
UINT32 LOS_MemboxInit(VOID *pBoxMem, /* 内存池地址,需要用户自定义 */
UINT32 uwBoxSize, /* 内存池大小 */
UINT32 uwBlkSize); /* 内存块大小 */
VOID LOS_MemboxClr(VOID *pBoxMem, /* 内存池地址 */
VOID *pBox) /* 需要释放的内存块 */
VOID *LOS_MemboxAlloc(VOID *pBoxMem) /* 指向内存池的指针 */
UINT32 LOS_MemboxFree(VOID *pBoxMem, /* 内存池地址 */
VOID *pBox) /* 需要释放的内存块 */
开发配置
make menuconfig: Kernel --> Memory Management
配置项 | 含义 | 取值范围 | 默认值 | 依赖 |
LOSCFG_KERNEL_MEMBOX | 使能membox内存管理 | YES/NO | YES | 无 |
LOSCFG_KERNEL_MEMBOX_STATIC | 选择静态内存方式实现membox | YES/NO | YES | LOSCFG_KERNEL_MEMBOX |
LOSCFG_KERNEL_MEMBOX_DYNAMIC | 选择动态内存方式实现membox | YES/NO | NO | LOSCFG_KERNEL_MEMBOX |
- 规划一片内存区域作为静态内存池;
-
LOS_MemboxInit
初始化静态内存池(内存池大小、内存块大小),将所有内存挂到空闲链表,在内存起始处放置控制头; -
LOS_MemboxAlloc
分配静态内存,系统将从空闲链表中取第一个空闲块,并返回该内存块的起始地址; -
LOS_MemboxClr
将入参地址对应的内存块清零; -
LOS_MemboxFree
将内存块加入空闲链表;
注意事项
…