pull/6/head
fuaojia 1 year ago
parent 5765dc9009
commit 06b38cbc74

@ -43,9 +43,9 @@ extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
#define HEAP_CAST(t, exp) ((t)(exp))
#define HEAP_ALIGN sizeof(UINTPTR)
#define MALLOC_MAXSIZE (0xFFFFFFFF - HEAP_ALIGN + 1)
#define HEAP_CAST(t, exp) ((t)(exp))//这个宏定义是一个类型转换的快捷方式。它接受两个参数t 表示目标类型exp 是需要进行类型转换的表达式。这个宏最终会将 exp 转换为类型 t。
#define HEAP_ALIGN sizeof(UINTPTR)//这个宏定义定义了 HEAP_ALIGN它的值是 sizeof(UINTPTR)。sizeof 操作符用于返回其操作数的大小(以字节为单位),所以 HEAP_ALIGN 的值将取决于 UINTPTR 类型的大小。
#define MALLOC_MAXSIZE (0xFFFFFFFF - HEAP_ALIGN + 1)//这个宏定义了 MALLOC_MAXSIZE它的值是 0xFFFFFFFF - HEAP_ALIGN + 1。在这里0xFFFFFFFF 表示一个32位无符号整数的最大值HEAP_ALIGN 已经在上面定义过了。这个宏定义似乎是用来表示在分配内存时可能的最大尺寸。
/*
* Description : look up the next memory node according to one memory node in the memory block list.
@ -53,13 +53,25 @@ extern "C" {
* struct LosHeapNode *node --- Size of memory in bytes to allocate
* Return : Pointer to next memory node
*/
/*这个函数的作用是获取下一个堆节点的指针。具体实现过程如下:
node NULL
LosHeapNode data size data size
struct LosHeapNode* UINTPTR struct LosHeapNode*
*/
struct LosHeapNode* OsHeapPrvGetNext(struct LosHeapManager *heapMan, struct LosHeapNode *node)
{
return (heapMan->tail == node) ? NULL : (struct LosHeapNode *)(UINTPTR)(node->data + node->size);
}
#ifdef LOSCFG_MEM_TASK_STAT
/*该函数接受两个参数heapMan 表示堆管理器的指针size 表示堆的初始大小。该函数的作用是初始化堆的统计信息,
heapMan->stat
heapMan->stat.memTotalUsed heapMan->stat.memTotalPeak使
memset_s heapMan->stat 0
heapMan->stat.memTotalUsed sizeof(struct LosHeapNode) + sizeof(struct LosHeapManager)使
heapMan->stat.memTotalPeak heapMan->stat.memTotalUsed使
LOSCFG_MEM_TASK_STAT */
VOID OsHeapStatInit(struct LosHeapManager *heapMan, UINT32 size)
{
(VOID)memset_s(&heapMan->stat, sizeof(Memstat), 0, sizeof(Memstat));
@ -67,7 +79,16 @@ VOID OsHeapStatInit(struct LosHeapManager *heapMan, UINT32 size)
heapMan->stat.memTotalUsed = sizeof(struct LosHeapNode) + sizeof(struct LosHeapManager);
heapMan->stat.memTotalPeak = heapMan->stat.memTotalUsed;
}
/*该函数的作用是向堆的统计信息中添加被使用的内存块。具体实现过程如下:
taskId blockSizetaskId IDblockSize
taskId OS_INT_INACTIVE
taskId ID LOS_CurTaskIDGet taskId TASK_NUM - 1
taskId taskId便
OS_MEM_ADD_USED blockSize taskId stat
便使使
使便*/
VOID OsHeapStatAddUsed(struct LosHeapManager *heapMan, struct LosHeapNode *node)
{
UINT32 taskId;
@ -87,7 +108,13 @@ VOID OsHeapStatAddUsed(struct LosHeapManager *heapMan, struct LosHeapNode *node)
node->taskId = taskId;
OS_MEM_ADD_USED(&heapMan->stat, blockSize, taskId);
}
/*该函数的作用是从堆的统计信息中减少被使用的内存块。具体实现过程如下:
taskId blockSizetaskId ID
blockSize
OS_MEM_REDUCE_USED blockSize taskId stat
便使使
使便 OsHeapStatAddUsed
使使*/
VOID OsHeapStatDecUsed(struct LosHeapManager *heapMan, struct LosHeapNode *node)
{
UINT32 taskId = node->taskId;
@ -97,17 +124,25 @@ VOID OsHeapStatDecUsed(struct LosHeapManager *heapMan, struct LosHeapNode *node)
}
#else /* LOSCFG_MEM_TASK_STAT */
//函数用于初始化堆管理器的内存统计信息。它接受两个参数heapMan 表示堆管理器的指针size 表示堆的总大小。在这个备选实现中,该函数没有任何具体的实现操作,直接返回。
VOID OsHeapStatInit(struct LosHeapManager *heapMan, UINT32 size) { }
//函数用于向堆的统计信息中添加被使用的内存块。它接受两个参数heapMan 表示堆管理器的指针node 表示要添加到统计信息中的堆节点指针。在这个备选实现中,该函数没有任何具体的实现操作,什么也不做。
VOID OsHeapStatAddUsed(struct LosHeapManager *heapMan, struct LosHeapNode *node) { }
//函数用于从堆的统计信息中减少被使用的内存块。它接受两个参数heapMan 表示堆管理器的指针node 表示要从统计信息中减少使用的堆节点指针。在这个备选实现中,该函数没有任何具体的实现操作,什么也不做。
VOID OsHeapStatDecUsed(struct LosHeapManager *heapMan, struct LosHeapNode *node) { }
#endif /* LOSCFG_MEM_TASK_STAT */
#ifdef LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK
/*这段代码实现了一个堆完整性检查的函数 OsHeapIntegrityCheck用于检查堆内存的完整性
(struct LosHeapNode *)(heap + 1) heap
heapStart heapEnd
LOS_NOK
OsHeapPrvGetNext
LOS_OK
*/
UINT32 OsHeapIntegrityCheck(struct LosHeapManager *heap)
{
struct LosHeapNode *node = (struct LosHeapNode *)(heap + 1);
@ -127,7 +162,7 @@ UINT32 OsHeapIntegrityCheck(struct LosHeapManager *heap)
}
#else /* LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK */
//这段代码实现了一个名为 OsHeapIntegrityCheck 的函数,它接受一个指向 LosHeapManager 结构体的指针作为参数,并直接返回 LOS_OK。
UINT32 OsHeapIntegrityCheck(struct LosHeapManager *heap)
{
return LOS_OK;
@ -136,12 +171,16 @@ UINT32 OsHeapIntegrityCheck(struct LosHeapManager *heap)
#endif /* LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK */
#ifdef LOSCFG_KERNEL_MEM_SLAB_EXTENTION
/*接受一个指向内存池的指针 pool 和一个表示需要分配内存大小的参数 size。
OsHeapAlloc
*/
VOID *OsMemAlloc(VOID *pool, UINT32 size)
{
return OsHeapAlloc(pool, size);
}
/*接受一个指向内存池的指针 pool 和一个指向待释放内存块的指针 ptr。
OsHeapFree
LOS_OK LOS_NOK */
UINT32 OsMemFree(VOID *pool, const VOID *ptr)
{
if (OsHeapFree(pool, ptr) == TRUE) {
@ -160,6 +199,19 @@ UINT32 OsMemFree(VOID *pool, const VOID *ptr)
* UITN32 size --- size of the heap memory pool
* Return : 1:success 0:error
*/
/*这段代码实现了一个名为 OsHeapInit 的函数,用于初始化堆内存管理器。让我逐步解释这段代码的功能:
pool size
pool struct LosHeapManager heapMan便
heapMan NULL
FALSE
使 memset_s 0
size size - sizeof(struct LosHeapManager)
head tail usedprev size
OsHeapStatInit
TRUE
*/
BOOL OsHeapInit(VOID *pool, UINT32 size)
{
struct LosHeapNode *node = NULL;
@ -192,6 +244,33 @@ BOOL OsHeapInit(VOID *pool, UINT32 size)
* UINT32 size --- size of the heap memory pool
* Return : NULL:error, other value:the address of the memory we alloced
*/
/*这段代码实现了一个名为 OsHeapAlloc 的函数,用于在堆内存管理器中分配指定大小的内存块。让我逐步解释这段代码的功能:
pool size
nodenextbestptr alignSize
heapMan pool struct LosHeapManager 便
heapMan NULL MALLOC_MAXSIZE NULL
OsHeapIntegrityCheck LOS_OK NULL
使node->used == 0node->size >= alignSize
best
best->size == alignSize SIZE_MATCH
best != NULL
SIZE_MATCH
alignSize
ptr
NULL*/
VOID *OsHeapAlloc(VOID *pool, UINT32 size)
{
struct LosHeapNode *node = NULL;
@ -222,11 +301,18 @@ VOID *OsHeapAlloc(VOID *pool, UINT32 size)
}
/* alloc failed */
/*这是一个条件判断语句,如果找到的最佳节点为空(即没有足够大小的空闲节点),则执行花括号中的代码块。*/
if (best == NULL) {
PRINT_ERR("there's not enough mem to alloc 0x%x Bytes!\n", alignSize);
goto OUT;
PRINT_ERR("there's not enough mem to alloc 0x%x Bytes!\n", alignSize);//在没有足够空闲内存来分配请求大小的内存块时,打印错误信息,提示用户无法分配指定大小的内存。
goto OUT;//跳转到标签 OUT 处,这通常是用于执行清理和释放资源的操作。
}
/*这是另一个条件判断语句,用于判断是否有足够的空间将找到的节点分割为两部分,以满足请求的大小,并且保留一个足够大的空洞来放置下一个节点的元数据。*/
/*node = (struct LosHeapNode*)(UINTPTR)(best->data + alignSize);:计算出新的节点的地址,该节点位于原节点的空闲空间之后,用于存放剩余的内存块。
node->used = 0;使
node->size = best->size - alignSize - sizeof(struct LosHeapNode);
node->prev = best;
best->size = alignSize;*/
if ((best->size - alignSize) > sizeof(struct LosHeapNode)) {
/* hole divide into 2 */
node = (struct LosHeapNode*)(UINTPTR)(best->data + alignSize);
@ -246,7 +332,11 @@ VOID *OsHeapAlloc(VOID *pool, UINT32 size)
best->size = alignSize;
}
/*这段代码可能是用于实现动态内存分配器的代码。具体来说,函数名称 SIZE_MATCH 可能代表了一种内存分配策略,即在进行内存分配时,选择最能够匹配请求大小的空闲内存块进行分配。
best best align 0used 1使 ptr OsHeapStatAddUsed 使
*/
SIZE_MATCH:
best->align = 0;
best->used = 1;
@ -264,6 +354,15 @@ OUT:
* UINT32 boundary --- boundary the heap needs align
* Return : NULL:error, other value:the address of the memory we alloced
*/
/*这段代码是一个用于分配指定大小、指定对齐边界alignment boundary的内存块的函数。该函数的名称为 OsHeapAllocAlign。
pool size 0boundary sizeof(VOID*)VOID* boundary NULL
useSize使 OsHeapAlloc pool useSize ptr
OS_MEM_ALIGN ptr boundary OUT ptr gap gap sizeof(UINTPTR) alignedPtr
*/
VOID* OsHeapAllocAlign(VOID *pool, UINT32 size, UINT32 boundary)
{
UINT32 useSize;
@ -297,7 +396,15 @@ VOID* OsHeapAllocAlign(VOID *pool, UINT32 size, UINT32 boundary)
OUT:
return ptr;
}
/*这段代码是一个用于释放内存的函数,名称为 OsHeapDoFree。该函数接收两个参数一个是 LosHeapManager 结构体指针 heapMan代表内存池管理器另一个是 LosHeapNode 结构体指针 curNode代表需要释放的内存块对应的内存池节点。
curNode node used 0使
使 while node 使 node node
使 while 使 OsHeapPrvGetNext node next next 使 node next node size heapMan->tail heapMan->tail next 使
使 LosHeapManager LosHeapNode */
STATIC VOID OsHeapDoFree(struct LosHeapManager *heapMan, struct LosHeapNode *curNode)
{
struct LosHeapNode *node = curNode;
@ -330,6 +437,15 @@ STATIC VOID OsHeapDoFree(struct LosHeapManager *heapMan, struct LosHeapNode *cur
* VOID* ptr --- the pointer of heap memory we want to free
* Return : 1:success 0:error
*/
/*这段代码是用于释放指定内存块的函数 OsHeapFree。该函数接收两个参数一个是 VOID 类型指针 pool代表内存池另一个是 const VOID 类型指针 ptr代表需要释放的内存块的起始地址。
node LosHeapNode gapSize UINT32 ret BOOL
ptr sizeof(UINTPTR) ptr ptr FALSE
使 ((struct LosHeapNode *)ptr) - 1 node 使 ret FALSE OUT
OsHeapStatDecUsed used OsHeapDoFree node ret */
BOOL OsHeapFree(VOID *pool, const VOID *ptr)
{
struct LosHeapNode *node = NULL;
@ -378,6 +494,19 @@ OUT:
* Output : status --- heap statistics
* Return : LOS_OK on success or error code on failure
*/
/*这段代码是用于获取指定内存池的统计信息的函数 OsHeapStatisticsGet。该函数接收两个参数一个是 VOID 类型指针 pool代表内存池另一个是 LosHeapStatus 结构体指针 status用于保存内存池的统计信息。
heapUsedmaxFreeNodeSizefreeNodeNumusedNodeNum node ramHeap heapUsed maxFreeNodeSize freeNodeNum usedNodeNum
LOS_NOK status LOS_NOK
使 sizeof(struct LosHeapManager) heapUsed
使 node 使 heapUsed usedNodeNum 使 maxFreeNodeSize freeNodeNum
heapUsed LOS_NOK status LOS_OK
LOSCFG_MEM_TASK_STAT usageWaterLine */
UINT32 OsHeapStatisticsGet(VOID *pool, LosHeapStatus *status)
{
UINT32 heapUsed = 0;
@ -435,6 +564,15 @@ UINT32 OsHeapStatisticsGet(VOID *pool, LosHeapStatus *status)
* Input : pool --- Pointer to the manager, to distinguish heap
* Return : max free block size
*/
/*这段代码是用于获取指定内存池中最大可用块大小的函数 OsHeapGetMaxFreeBlkSize。该函数接收一个参数一个 VOID 类型指针 pool代表内存池。
sizetemp node ramHeap size temp
LOS_NOK
使 node 使 temp temp size size temp
size */
UINT32 OsHeapGetMaxFreeBlkSize(VOID *pool)
{
UINT32 size = 0;

@ -41,18 +41,40 @@ extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
#define POOL_ADDR_ALIGNSIZE 64
#define POOL_ADDR_ALIGNSIZE 64//是一个宏表示内存池地址对齐的大小值为64。
LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_memSpin);
LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_memSpin);//是一个修饰符用于指定变量所属的段section为.bss.init该变量在程序运行前会被初始化为0。
//是一个宏用于初始化自旋锁变量g_memSpin。
UINT8 *m_aucSysMem0 = (UINT8 *)NULL;
UINT8 *m_aucSysMem1 = (UINT8 *)NULL;
__attribute__((section(".data.init"))) UINTPTR g_sys_mem_addr_end;
UINT8 *m_aucSysMem0 = (UINT8 *)NULL;//是一个指向UINT8类型的指针变量初始值为NULL。
UINT8 *m_aucSysMem1 = (UINT8 *)NULL;//是一个指向UINT8类型的指针变量初始值为NULL。
__attribute__((section(".data.init"))) UINTPTR g_sys_mem_addr_end;//是一个UINTPTR类型的变量位于.data.init段用于记录系统内存地址的末尾位置。
#ifdef LOSCFG_EXC_INTERACTION
__attribute__((section(".data.init"))) UINTPTR g_excInteractMemSize = 0;
#ifdef LOSCFG_EXC_INTERACTION//表示如果定义了宏LOSCFG_EXC_INTERACTION则编译以下代码块。
__attribute__((section(".data.init"))) UINTPTR g_excInteractMemSize = 0;//是一个UINTPTR类型的变量位于.data.init段用于记录异常交互内存的大小初始值为0。
#endif
/*这段代码是一个函数LOS_MemInit()的实现,用于初始化内存池。
LITE_OS_SEC_TEXT_INIT section.text.init
pool
size
poolsizesizeof(struct LosHeapManager)LOS_NOK
poolsizeOS_MEM_ALIGN_SIZEsize
OsMemMulPoolInit()OUT
OsHeapInit()OUT
OsSlabMemInit() Slab LOS_OK
OUT
LOS_NOKLOS_OK
Slab */
LITE_OS_SEC_TEXT_INIT UINT32 LOS_MemInit(VOID *pool, UINT32 size)
{
UINT32 ret = LOS_NOK;
@ -103,6 +125,21 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsMemExcInteractionInit(UINTPTR memStart)
* Description : Initialize Dynamic Memory pool
* Return : LOS_OK on success or error code on failure
*/
/*这段代码是一个条件编译块当定义了宏LOSCFG_EXC_INTERACTION时才会被编译。
LITE_OS_SEC_TEXT_INIT section.text.init
memStart
m_aucSysMem0memStartmemStart
g_excInteractMemSizeEXC_INTERACT_MEM_SIZE
LOS_MemInit()m_aucSysMem0g_excInteractMemSizeret
ret
LOS_MemInit()LOSCFG_EXC_INTERACTION*/
LITE_OS_SEC_TEXT_INIT UINT32 OsMemSystemInit(UINTPTR memStart)
{
UINT32 ret;
@ -121,6 +158,18 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsMemSystemInit(UINTPTR memStart)
* Description : print heap information
* Input : pool --- Pointer to the manager, to distinguish heap
*/
/*这段代码是用于打印内存池pool信息的函数接收一个pool指针作为参数。
pool
poolLosHeapManagerheapMan
LosHeapStatusstatus
OsHeapStatisticsGet()statusLOS_NOK
使
便*/
VOID OsMemInfoPrint(const VOID *pool)
{
struct LosHeapManager *heapMan = (struct LosHeapManager *)pool;
@ -136,6 +185,20 @@ VOID OsMemInfoPrint(const VOID *pool)
status.usedNodeNum, status.freeNodeNum);
}
/*这段代码是用于内存分配的函数,可以从指定的内存池中分配一块指定大小的内存。
pool
size
ptr
poolsize0
OsSlabMemAlloc()SLABptr
SLABOsHeapAlloc()ptr
SLAB便*/
LITE_OS_SEC_TEXT VOID *LOS_MemAlloc(VOID *pool, UINT32 size)
{
VOID *ptr = NULL;
@ -158,6 +221,19 @@ LITE_OS_SEC_TEXT VOID *LOS_MemAlloc(VOID *pool, UINT32 size)
return ptr;
}
/*这段代码是用于按指定对齐边界分配内存的函数,可以从指定的内存池中分配一块指定大小、按指定对齐边界对齐的内存。
pool
size
boundary
ptr
OsHeapAllocAlign()ptr
便*/
LITE_OS_SEC_TEXT VOID *LOS_MemAllocAlign(VOID *pool, UINT32 size, UINT32 boundary)
{
VOID *ptr = NULL;
@ -171,6 +247,14 @@ LITE_OS_SEC_TEXT VOID *LOS_MemAllocAlign(VOID *pool, UINT32 size, UINT32 boundar
return ptr;
}
/*这段代码是用于重新分配内存大小的函数,主要有以下几个步骤:
ptrLOS_MemAlloc()
ptr0
ptr0OsSlabMemCheck()
*/
VOID *LOS_MemRealloc(VOID *pool, VOID *ptr, UINT32 size)
{
VOID *retPtr = NULL;
@ -228,6 +312,15 @@ VOID *LOS_MemRealloc(VOID *pool, VOID *ptr, UINT32 size)
return retPtr;
}
/*这段代码是用于释放内存的函数,主要有以下几个步骤:
poolmemLOS_NOK
便
OsSlabMemFree()TRUE
OsSlabMemFree()OsHeapFree()TRUEFALSE
TRUELOS_OKLOS_NOK
*/
LITE_OS_SEC_TEXT UINT32 LOS_MemFree(VOID *pool, VOID *mem)
{
BOOL ret = FALSE;
@ -250,6 +343,17 @@ LITE_OS_SEC_TEXT UINT32 LOS_MemFree(VOID *pool, VOID *mem)
return (ret == TRUE ? LOS_OK : LOS_NOK);
}
/*这段代码是用于获取内存池状态信息的函数,主要有以下几个步骤:
poolstatusLOS_NOK
LosHeapStatusheapStatus
errintSave
便
OsHeapStatisticsGet()heapStatusLOS_OKLOS_NOK
status使使
使statusuwUsageWaterLine
LOS_OK
使使*/
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *status)
{
LosHeapStatus heapStatus;
@ -282,6 +386,15 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *st
return LOS_OK;
}
/*这段代码是用于获取指定内存池已使用内存大小的函数,主要有以下几个步骤:
poolOS_NULL_INT
LosHeapStatusheapStatus
errintSave
便
OsHeapStatisticsGet()heapStatusLOS_OKOS_NULL_INT
使
使使便*/
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemTotalUsedGet(VOID *pool)
{
LosHeapStatus heapStatus;
@ -303,6 +416,13 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemTotalUsedGet(VOID *pool)
return heapStatus.totalUsedSize;
}
/*这段代码是用于获取指定内存池的大小的函数,主要有以下几个步骤:
poolOS_NULL_INT
LosHeapManagerheapManager
LosHeapManagerheapManager
heapManager->size
便*/
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemPoolSizeGet(const VOID *pool)
{
struct LosHeapManager *heapManager = NULL;
@ -315,6 +435,14 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemPoolSizeGet(const VOID *pool)
return heapManager->size;
}
/*这段代码是用于对指定内存池进行完整性检查的函数,主要有以下几个步骤:
poolOS_NULL_INT
intSaveret
便
OsHeapIntegrityCheck()ret0
*/
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemIntegrityCheck(VOID *pool)
{
UINT32 intSave;
@ -331,6 +459,16 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemIntegrityCheck(VOID *pool)
return ret;
}
/*这段代码是用于对多个内存池进行完整性检查的函数,主要有以下几个步骤:
LOS_MemIntegrityCheck()m_aucSysMem1LOS_OK
LOSCFG_EXC_INTERACTION
LOS_MemIntegrityCheck()m_aucSysMem0LOS_OK
*/
VOID OsMemIntegrityMultiCheck(VOID)
{
if (LOS_MemIntegrityCheck(m_aucSysMem1) == LOS_OK) {

@ -42,13 +42,18 @@
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
//用于将指定的大小 sz 进行对齐,返回对齐后的大小。它使用 HEAP_ALIGN 宏定义来指定对齐的字节数,通过将 sz 加上 HEAP_ALIGN - 1然后按位取反与运算&)来实现向上对齐。
#define ALIGNE(sz) (((sz) + HEAP_ALIGN - 1) & (~(HEAP_ALIGN - 1)))
//用于将指定的 value 进行 align 字节对齐,返回对齐后的值。它将 value 转换为 UINT32 类型,并将其与 align - 1 按位取反与运算,即将 value 向上舍入到最近的 align 的倍数。
#define OS_MEM_ALIGN(value, align) (((UINT32)(UINTPTR)(value) + (UINT32)((align) - 1)) & \
(~(UINT32)((align) - 1)))
//用于表示对齐标志的宏定义,其值为 0x80000000。
#define OS_MEM_ALIGN_FLAG 0x80000000
//用于设置对齐标志的宏定义,将传入的 align 参数按位或运算与 OS_MEM_ALIGN_FLAG 进行组合。
#define OS_MEM_SET_ALIGN_FLAG(align) ((align) = ((align) | OS_MEM_ALIGN_FLAG))
//用于获取对齐标志的宏定义,将传入的 align 参数与 OS_MEM_ALIGN_FLAG 进行按位与运算,得到对齐标志。
#define OS_MEM_GET_ALIGN_FLAG(align) ((align) & OS_MEM_ALIGN_FLAG)
//用于获取对齐间隙大小的宏定义,将传入的 align 参数与 ~OS_MEM_ALIGN_FLAG 进行按位与运算,得到去除对齐标志后的值。
#define OS_MEM_GET_ALIGN_GAPSIZE(align) ((align) & (~OS_MEM_ALIGN_FLAG))
typedef struct tagLosHeapStatus {
@ -60,8 +65,12 @@ typedef struct tagLosHeapStatus {
#ifdef LOSCFG_MEM_TASK_STAT
UINT32 usageWaterLine;
#endif
} LosHeapStatus;
} LosHeapStatus;//结构体:描述了内存堆的状态信息,包括总共使用的大小、总共空闲的大小、最大空闲节点的大小、已用节点数和空闲节点数等字段。
/*结构体:描述了内存堆中的每个节点,包括前一个节点指针、任务 ID、节点大小、
使使
使 0 data[0]
便*/
struct LosHeapNode {
struct LosHeapNode *prev;
#ifdef LOSCFG_MEM_TASK_STAT
@ -73,12 +82,12 @@ struct LosHeapNode {
UINT8 data[0];
};
extern BOOL OsHeapInit(VOID *pool, UINT32 size);
extern VOID* OsHeapAlloc(VOID *pool, UINT32 size);
extern VOID* OsHeapAllocAlign(VOID *pool, UINT32 size, UINT32 boundary);
extern BOOL OsHeapFree(VOID *pool, const VOID* ptr);
extern UINT32 OsHeapStatisticsGet(VOID *pool, LosHeapStatus *status);
extern UINT32 OsHeapIntegrityCheck(struct LosHeapManager *heap);
extern BOOL OsHeapInit(VOID *pool, UINT32 size);//函数声明:用于初始化内存池,即将一块内存空间转化为一个内存堆,并返回是否初始化成功。
extern VOID* OsHeapAlloc(VOID *pool, UINT32 size);//函数声明:用于在内存堆上分配一块指定大小的内存,并返回分配到的内存地址。
extern VOID* OsHeapAllocAlign(VOID *pool, UINT32 size, UINT32 boundary);//函数声明:用于在内存堆上分配一块指定大小并且按照给定对齐边界对齐的内存,并返回分配到的内存地址。
extern BOOL OsHeapFree(VOID *pool, const VOID* ptr);//函数声明:用于释放内存堆中的指定内存地址所对应的节点,返回是否释放成功。
extern UINT32 OsHeapStatisticsGet(VOID *pool, LosHeapStatus *status);//函数声明:用于获取内存堆的状态信息,并将其保存在传入的 LosHeapStatus 结构体中,返回获取到的信息字节数。
extern UINT32 OsHeapIntegrityCheck(struct LosHeapManager *heap);//函数声明:用于检查整个内存堆的完整性,即检查是否存在内存泄漏或内存重叠等问题。
#ifdef __cplusplus
#if __cplusplus

@ -39,6 +39,15 @@ extern "C" {
#define MIN_TASK_ID(x, y) ((x) > (y) ? (y) : (x))
#define MAX_MEM_USE(x, y) ((x) > (y) ? (x) : (y))
/*这段代码是一个函数OsMemstatTaskUsedInc的实现用于更新内存统计信息。
IDstattaskMemstats
usedSizememUsed使usedSize使MAX_MEM_USEmemUsedmemPeakmemPeak
usedSizestatmemTotalUsed使usedSize使MAX_MEM_USE
使*/
LITE_OS_SEC_TEXT_MINOR VOID OsMemstatTaskUsedInc(Memstat *stat, UINT32 usedSize, UINT32 taskId)
{
UINT32 record = MIN_TASK_ID(taskId, TASK_NUM - 1);
@ -51,6 +60,13 @@ LITE_OS_SEC_TEXT_MINOR VOID OsMemstatTaskUsedInc(Memstat *stat, UINT32 usedSize,
stat->memTotalPeak = MAX_MEM_USE(stat->memTotalPeak, stat->memTotalUsed);
}
/*这段代码是一个函数OsMemstatTaskUsedDec的实现用于更新内存统计信息。
IDstattaskMemstats
使usedSizeusedSizememUsed使usedSizeusedSizestatmemTotalUsed使usedSize
使便*/
LITE_OS_SEC_TEXT_MINOR VOID OsMemstatTaskUsedDec(Memstat *stat, UINT32 usedSize, UINT32 taskId)
{
UINT32 record = MIN_TASK_ID(taskId, TASK_NUM - 1);
@ -66,6 +82,15 @@ LITE_OS_SEC_TEXT_MINOR VOID OsMemstatTaskUsedDec(Memstat *stat, UINT32 usedSize,
stat->memTotalUsed -= usedSize;
}
/*这段代码是一个函数OsMemstatTaskClear的实现用于清除任务的内存统计信息。
IDstattaskMemstats
使00
memUsedmemPeak0使
*/
LITE_OS_SEC_TEXT_MINOR VOID OsMemstatTaskClear(Memstat *stat, UINT32 taskId)
{
UINT32 record = MIN_TASK_ID(taskId, TASK_NUM - 1);
@ -80,6 +105,13 @@ LITE_OS_SEC_TEXT_MINOR VOID OsMemstatTaskClear(Memstat *stat, UINT32 taskId)
taskMemstats[record].memPeak = 0;
}
/*这段代码是一个函数OsMemstatTaskUsage的实现用于获取指定任务的内存使用量。
IDstattaskMemstats
memUsed使
使*/
LITE_OS_SEC_TEXT_MINOR UINT32 OsMemstatTaskUsage(const Memstat *stat, UINT32 taskId)
{
UINT32 record = MIN_TASK_ID(taskId, TASK_NUM - 1);
@ -88,6 +120,17 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsMemstatTaskUsage(const Memstat *stat, UINT32 tas
return taskMemstats[record].memUsed;
}
/*这段代码是一个函数OsMemTaskUsage的实现用于获取指定任务在系统内所有内存池中的内存使用量之和。
poolstat
statOsMemstatTaskUsage使
使
使*/
UINT32 OsMemTaskUsage(UINT32 taskId)
{
LosMemPoolInfo *pool = NULL;
@ -110,6 +153,17 @@ UINT32 OsMemTaskUsage(UINT32 taskId)
#endif
}
/*这段代码是一个函数OsMemTaskClear的实现用于清除指定任务在系统内所有内存池中的内存统计信息。
poolstat
statOsMemstatTaskClear
OsMemstatTaskClear
*/
VOID OsMemTaskClear(UINT32 taskId)
{
LosMemPoolInfo *pool = NULL;

@ -30,6 +30,17 @@
STATIC VOID *g_poolHead = NULL;
/*这段代码是一个函数OsMemMulPoolInit的实现用于初始化多内存池。
nextPoolcurPoolpoolEndnextPoolcurPoolpoolEnd
NULL
使便*/
UINT32 OsMemMulPoolInit(VOID *pool, UINT32 size)
{
VOID *nextPool = g_poolHead;
@ -58,6 +69,21 @@ UINT32 OsMemMulPoolInit(VOID *pool, UINT32 size)
return LOS_OK;
}
/*这段代码是一个函数OsMemMulPoolDeinit的实现用于反初始化多内存池。
retnextPoolcurPoolretnextPoolcurPool
do-while
退
next
*/
UINT32 OsMemMulPoolDeinit(const VOID *pool)
{
UINT32 ret = LOS_NOK;
@ -90,12 +116,29 @@ UINT32 OsMemMulPoolDeinit(const VOID *pool)
return ret;
}
/*这段代码是函数OsMemMulPoolHeadGet的实现用于获取多内存池链表的头节点指针。
g_poolHead
便便*/
VOID *OsMemMulPoolHeadGet(VOID)
{
return g_poolHead;
}
/*这段代码是函数LOS_MemDeInit的实现用于释放指定内存池的资源并进行反初始化操作。
retintSaveretintSave
MEM_LOCK
OsMemMulPoolDeinitret
MEM_UNLOCK
使MEM_LOCKOsMemMulPoolDeinit使MEM_UNLOCK*/
LITE_OS_SEC_TEXT_INIT UINT32 LOS_MemDeInit(VOID *pool)
{
UINT32 ret;
@ -108,6 +151,17 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_MemDeInit(VOID *pool)
return ret;
}
/*这段代码是函数LOS_MemPoolList的实现用于打印多内存池链表中每个内存池的信息。
nextPoolindexnextPoolindex
whileOsMemInfoPrintnextPoolindex
OsMemInfoPrint
便使OsMemInfoPrint便*/
LITE_OS_SEC_TEXT_INIT UINT32 LOS_MemPoolList(VOID)
{
VOID *nextPool = g_poolHead;

Loading…
Cancel
Save