更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_membox.c 文件参考

静态内存池主文件 更多...

浏览源代码.

函数

LITE_OS_SEC_BSS SPIN_LOCK_INIT (g_memboxSpin)
 
STATIC INLINE UINT32 OsCheckBoxMem (const LOS_MEMBOX_INFO *boxInfo, const VOID *node)
 检查静态内存块 更多...
 
LITE_OS_SEC_TEXT_INIT UINT32 LOS_MemboxInit (VOID *pool, UINT32 poolSize, UINT32 blkSize)
 初始化一个静态内存池,根据入参设定其起始地址、总大小及每个内存块大小 更多...
 
LITE_OS_SEC_TEXT VOID * LOS_MemboxAlloc (VOID *pool)
 从指定的静态内存池中申请一块静态内存块,整个内核源码只有 OsSwtmrScan中用到了静态内存. 更多...
 
LITE_OS_SEC_TEXT UINT32 LOS_MemboxFree (VOID *pool, VOID *box)
 释放指定的一块静态内存块 更多...
 
LITE_OS_SEC_TEXT_MINOR VOID LOS_MemboxClr (VOID *pool, VOID *box)
 清零指定静态内存块的内容 更多...
 
LITE_OS_SEC_TEXT_MINOR VOID LOS_ShowBox (VOID *pool)
 show membox info. 更多...
 
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemboxStatisticsGet (const VOID *boxMem, UINT32 *maxBlk, UINT32 *blkCnt, UINT32 *blkSize)
 获取指定静态内存池的信息,包括内存池中总内存块数量、已经分配出去的内存块数量、每个内存块的大小 更多...
 

详细描述

静态内存池主文件

使用场景
    当用户需要使用固定长度的内存时,可以通过静态内存分配的方式获取内存,一旦使用完毕,
    通过静态内存释放函数归还所占用内存,使之可以重复使用。

开发流程
    通过make menuconfig配置静态内存管理模块。
    规划一片内存区域作为静态内存池。
    调用LOS_MemboxInit初始化静态内存池。
    初始化会将入参指定的内存区域分割为N块(N值取决于静态内存总大小和块大小),将所有内存块挂到空闲链表,在内存起始处放置控制头。
    调用LOS_MemboxAlloc接口分配静态内存。
    系统将会从空闲链表中获取第一个空闲块,并返回该内存块的起始地址。
    调用LOS_MemboxClr接口。将入参地址对应的内存块清零。
    调用LOS_MemboxFree接口。将该内存块加入空闲链表。

注意事项
    静态内存池区域,如果是通过动态内存分配方式获得的,在不需要静态内存池时,
    需要释放该段内存,避免发生内存泄露。
    静态内存不常用,因为需要使用者去确保不会超出使用范围
版本
作者
weharmonyos.com | 鸿蒙研究站 | 每天死磕一点点
日期
2022-04-02

在文件 los_membox.c 中定义.

函数说明

◆ OsCheckBoxMem()

STATIC INLINE UINT32 OsCheckBoxMem ( const LOS_MEMBOX_INFO boxInfo,
const VOID *  node 
)

检查静态内存块

在文件 los_membox.c86 行定义.

87{
88 UINT32 offset;
89
90 if (boxInfo->uwBlkSize == 0) {
91 return LOS_NOK;
92 }
93
94 offset = (UINT32)((UINTPTR)node - (UINTPTR)(boxInfo + 1));
95 if ((offset % boxInfo->uwBlkSize) != 0) {
96 return LOS_NOK;
97 }
98
99 if ((offset / boxInfo->uwBlkSize) >= boxInfo->uwBlkNum) {
100 return LOS_NOK;
101 }
102
103 return OS_MEMBOX_CHECK_MAGIC(node);//检查魔法数字是否被修改过了
104}
unsigned long UINTPTR
Definition: los_typedef.h:68
unsigned int UINT32
Definition: los_typedef.h:57
UINT32 uwBlkSize
Definition: los_membox.h:65
UINT32 uwBlkNum
Definition: los_membox.h:66
这是这个函数的调用关系图:

◆ SPIN_LOCK_INIT()

LITE_OS_SEC_BSS SPIN_LOCK_INIT ( g_memboxSpin  )