#include "malloc.h" #include "elog.h" //内存池(32字节对齐) __attribute__(( aligned(32) )) uint8_t mem1base[MEM1_MAX_SIZE] ; //内部SRAM内存池 __attribute__(( section(".sdram") , aligned(32) )) uint8_t mem2base[MEM2_MAX_SIZE] ; // __attribute__(( section(".dispram") , aligned(32) )) uint8_t mem3base[MEM3_MAX_SIZE] ; //内存管理表 uint16_t mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; __attribute__(( section(".sdrammap") )) uint16_t mem2mapbase[MEM2_ALLOC_TABLE_SIZE] ; // __attribute__(( section(".disprammap") )) uint16_t mem3mapbase[MEM3_ALLOC_TABLE_SIZE] ; //内存管理参数 const uint32_t memtblsize[SRAMBANK]={MEM1_ALLOC_TABLE_SIZE,MEM2_ALLOC_TABLE_SIZE }; //内存表大小 const uint32_t memblksize[SRAMBANK]={MEM1_BLOCK_SIZE,MEM2_BLOCK_SIZE }; //内存分块大小 const uint32_t memsize[SRAMBANK]={MEM1_MAX_SIZE,MEM2_MAX_SIZE }; //内存总大小 // const uint32_t memtblsize[SRAMBANK]={MEM1_ALLOC_TABLE_SIZE,MEM2_ALLOC_TABLE_SIZE,MEM3_ALLOC_TABLE_SIZE }; //内存表大小 // const uint32_t memblksize[SRAMBANK]={MEM1_BLOCK_SIZE,MEM2_BLOCK_SIZE,MEM3_BLOCK_SIZE }; //内存分块大小 // const uint32_t memsize[SRAMBANK]={MEM1_MAX_SIZE,MEM2_MAX_SIZE,MEM3_MAX_SIZE }; //内存总大小 //内存管理控制器 struct _m_mallco_dev mallco_dev= { my_mem_init, //内存初始化 my_mem_perused, //内存使用率 mem1base,mem2base , //内存池 mem1mapbase,mem2mapbase , //内存管理状态表 0,0 //内存管理未就绪 }; //复制内存 //*des:目的地址 //*src:源地址 //n:需要复制的内存长度(字节为单位) void mymemcpy(void *des,void *src,uint32_t n) { uint8_t *xdes=des; uint8_t *xsrc=src; while(n--)*xdes++=*xsrc++; } //设置内存 //*s:内存首地址 //c :要设置的值 //count:需要设置的内存大小(字节为单位) void mymemset(void *s,uint8_t c,uint32_t count) { uint8_t *xs = s; while(count--)*xs++=c; } //内存管理初始化 //memx:所属内存块 void my_mem_init(uint8_t memx) { log_i("mem_init.... %d %d ",memsize[memx] , memtblsize[memx]*2); mymemset(mallco_dev.memmap[memx], 0,memtblsize[memx]*2);//内存状态表数据清零 mymemset(mallco_dev.membase[memx], 0,memsize[memx]); //内存池所有数据清零 mallco_dev.memrdy[memx]=1; //内存管理初始化OK } //获取内存使用率 //memx:所属内存块 //返回值:使用率(0~100) uint8_t my_mem_perused(uint8_t memx) { uint32_t used=0; uint32_t i; for(i=0;i=0;offset--)//搜索整个内存控制区 { if(!mallco_dev.memmap[memx][offset])cmemb++;//连续空内存块数增加 else cmemb=0; //连续内存块清零 if(cmemb==nmemb) //找到了连续nmemb个空内存块 { for(i=0;i