最近在调试一份基于ucosII系统的代码,在观察map文件的时候,发现有个文件莫名其名的占用了9kb空间。这个文件就是ucosII自带的内存管理lib_mem.c文件。为什么会这样呢?一路查看,发现如下定义:
UcosII 在lib_mem.c中,留有很多接口可以对内存进行操作,可操作内存大小由
#define LIB_MEM_CFG_HEAP_SIZE 9u*1024u /*Configure Heap Memory Size */
这个大小可能是同事操作遗留下来的,我没去比对源码的初始值。
#ifndef LIB_MEM_CFG_HEAP_BASE_ADDR
CPU_INT08U Mem_Heap[LIB_MEM_CFG_HEAP_SIZE]; /* Mem heap. */
#endif
LIB_MEM_CFG_HEAP_SIZE的定义刚好是9kb,且全局搜索后,发现在此定义了一个堆空间,就是个大数组。于是继续搜素Mem_Heap的引用地,也仅有一处:
void Mem_Init (void)
{
#if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
MEM_POOL *pmem_pool;
/* --------- INIT MEM HEAP SEG / POOL --------- */
pmem_pool = (MEM_POOL *)&Mem_PoolHeap;
pmem_pool->Type = (LIB_MEM_TYPE) LIB_MEM_TYPE_HEAP;
pmem_pool->SegHeadPtr = (MEM_POOL *)&Mem_PoolHeap; /* Heap seg head = heap seg. */
pmem_pool->SegPrevPtr = (MEM_POOL *) 0;
pmem_pool->SegNextPtr = (MEM_POOL *) 0;
pmem_pool->PoolPrevPtr = (MEM_POOL *) 0;
pmem_pool->PoolNextPtr = (MEM_POOL *) 0;
pmem_pool->PoolAddrStart = (void *) 0;
pmem_pool->PoolAddrEnd = (void *) 0;
pmem_pool->PoolPtrs = (void **) 0;
pmem_pool->BlkSize = (CPU_SIZE_T ) 0u;
pmem_pool->BlkNbr = (CPU_SIZE_T ) 0u;
pmem_pool->BlkIx = (MEM_POOL_IX ) 0u;
#ifdef LIB_MEM_CFG_HEAP_BASE_ADDR
pmem_pool->SegAddr = (void *) LIB_MEM_CFG_HEAP_BASE_ADDR;
pmem_pool->SegAddrNextAvail = (void *) LIB_MEM_CFG_HEAP_BASE_ADDR;
#else
pmem_pool->SegAddr = (void *)&Mem_Heap[0];
pmem_pool->SegAddrNextAvail = (void *)&Mem_Heap[0];
#endif
pmem_pool->SegSizeTot = (CPU_SIZE_T ) LIB_MEM_CFG_HEAP_SIZE;
pmem_pool->SegSizeRem = (CPU_SIZE_T ) LIB_MEM_CFG_HEAP_SIZE;
/* ------------ INIT MEM POOL TBL ------------- */
Mem_PoolTbl = &Mem_PoolHeap;
#endif
}
该函数是对Mem_Heap这个私有堆进行初始化,且发现在系统初始化的时候的确有调用Mem_Init ()函数。本想着问题就这么解决了,把Mem_Init()屏蔽后,编译结果显示,lib_mem.o分配的内存还是9kb,重点Mem_Init()没有在任何地方被调用,且Mem_Heap数组也只是在Mem_Init()被使用,*但为什么编译后仍然会被分配空间呢??*这个疑问我保留在这里,有人能指点一二。
map数据:
0x20005b6c 0x00000144 Zero RW 856 .bss bsp_int.o
0x20005cb0 0x00000010 Zero RW 1532 .bss cpu_core.o
0x20005cc0 0x00002448 Zero RW 1620 .bss lib_mem.o
对于该私有堆,如果需要使用该空间,我们需要用lib_mem.c中定义的特定函数去进行申请和释放等操作。如:
void *Mem_HeapAlloc (CPU_SIZE_T size,
CPU_SIZE_T align,
CPU_SIZE_T *poctets_reqd,
LIB_ERR *perr)
如果在整个工程中,不需要使用该空间,可以将此空间进行最小设置,但是不能设置为0,否则会报错。通过map也可以看出,这块heap空间和其他内存空间相互独立存在。所以不需要使用,可尽量设置少点来避免空间浪费。
不过我这里有个疑问,按理说我不调用此函数和变量空间,编译器会进行优化,如果优化等级为leve0编译器会将大于8字节没引用的全局变量进行removing,不会分配内存空间,但是这个Mem_Heap却一直在占用我的内存,在没有揪出根本原因的时候,但确定确实没使用到该空间,设置一个小堆来释放该9KB空间何乐而不为(视自己工程而定)。
转载请注明出处,如有错误,欢迎指正!