#include "malloc.h" //内存池(32字节对齐) __align(32) uint8_t mem1base[MEM1_MAX_SIZE]; //内部SRAM内存池 __align(32) uint8_t mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000))); //外部SRAM内存池 //内存管理表 uint16_t mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; //内部SRAM内存池MAP uint16_t mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000+MEM2_MAX_SIZE))); //外部SRAM内存池MAP //内存管理参数 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}; //内存总大小 //内存管理控制器 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) { 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