嵌入式内存管理——清除多余的私有内存

最近在调试一份基于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空间何乐而不为(视自己工程而定)。

转载请注明出处,如有错误,欢迎指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值