#include "malloc.h" ////////////////////////////////////////////////////////////////////////////////// /*************************************************************************/ //内存管理 驱动代码 //STM32H7工程模板-HAL库函数版本 //DevEBox 大越创新 //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com /*************************************************************************/ ////////////////////////////////////////////////////////////////////////////////// //内存池(64字节对齐) __align(64) u8 mem1base[MEM1_MAX_SIZE]; //内部SRAM内存池 __align(64) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0XC01F4000))); //外部SDRAM内存池,前面2M给LTDC用了(1280*800*2) __align(64) u8 mem3base[MEM3_MAX_SIZE] __attribute__((at(0x30000000))); //内部SRAM1+SRAM2内存池 __align(64) u8 mem4base[MEM4_MAX_SIZE] __attribute__((at(0x38000000))); //内部SRAM4内存池 __align(64) u8 mem5base[MEM5_MAX_SIZE] __attribute__((at(0x20000000))); //内部DTCM内存池 __align(64) u8 mem6base[MEM6_MAX_SIZE] __attribute__((at(0x00000000))); //内部ITCM内存池 //内存管理表 u32 mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; //内部SRAM内存池MAP u32 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0XC01F4000+MEM2_MAX_SIZE))); //外部SDRAM内存池MAP u32 mem3mapbase[MEM3_ALLOC_TABLE_SIZE] __attribute__((at(0x30000000+MEM3_MAX_SIZE))); //内部SRAM1+SRAM2内存池MAP u32 mem4mapbase[MEM4_ALLOC_TABLE_SIZE] __attribute__((at(0x38000000+MEM4_MAX_SIZE))); //内部SRAM4内存池MAP u32 mem5mapbase[MEM5_ALLOC_TABLE_SIZE] __attribute__((at(0x20000000+MEM5_MAX_SIZE))); //内部DTCM内存池MAP u32 mem6mapbase[MEM6_ALLOC_TABLE_SIZE] __attribute__((at(0x00000000+MEM6_MAX_SIZE))); //内部ITCM内存池MAP //内存管理参数 const u32 memtblsize[SRAMBANK]={MEM1_ALLOC_TABLE_SIZE,MEM2_ALLOC_TABLE_SIZE,MEM3_ALLOC_TABLE_SIZE, MEM4_ALLOC_TABLE_SIZE,MEM5_ALLOC_TABLE_SIZE,MEM6_ALLOC_TABLE_SIZE}; //内存表大小 const u32 memblksize[SRAMBANK]={MEM1_BLOCK_SIZE,MEM2_BLOCK_SIZE,MEM3_BLOCK_SIZE, MEM4_BLOCK_SIZE,MEM5_BLOCK_SIZE,MEM6_BLOCK_SIZE}; //内存分块大小 const u32 memsize[SRAMBANK]={MEM1_MAX_SIZE,MEM2_MAX_SIZE,MEM3_MAX_SIZE, MEM4_MAX_SIZE,MEM5_MAX_SIZE,MEM6_MAX_SIZE}; //内存总大小 //内存管理控制器 struct _m_mallco_dev mallco_dev= { my_mem_init, //内存初始化 my_mem_perused, //内存使用率 mem1base,mem2base,mem3base,mem4base,mem5base,mem6base, //内存池 mem1mapbase,mem2mapbase,mem3mapbase,mem4mapbase,mem5mapbase,mem6mapbase,//内存管理状态表 0,0,0,0,0,0, //内存管理未就绪 }; /*************************************************************************/ //复制内存 //*des:目的地址 //*src:源地址 //n:需要复制的内存长度(字节为单位) //STM32H7工程模板-HAL库函数版本 //DevEBox 大越创新 //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com /*************************************************************************/ void mymemcpy(void *des,void *src,u32 n) { u8 *xdes=des; u8 *xsrc=src; while(n--)*xdes++=*xsrc++; } /*************************************************************************/ //设置内存 //*s:内存首地址 //c :要设置的值 //count:需要设置的内存大小(字节为单位) //STM32H7工程模板-HAL库函数版本 //DevEBox 大越创新 //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com /*************************************************************************/ void mymemset(void *s,u8 c,u32 count) { u8 *xs = s; while(count--)*xs++=c; } /*************************************************************************/ //内存管理初始化 //memx:所属内存块 //STM32H7工程模板-HAL库函数版本 //DevEBox 大越创新 //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com /*************************************************************************/ void my_mem_init(u8 memx) { mymemset(mallco_dev.memmap[memx],0,memtblsize[memx]*4); //内存状态表数据清零 mallco_dev.memrdy[memx]=1; //内存管理初始化OK } /*************************************************************************/ //获取内存使用率 //memx:所属内存块 //返回值:使用率(扩大了10倍,0~1000,代表0.0%~100.0%) //STM32H7工程模板-HAL库函数版本 //DevEBox 大越创新 //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com /*************************************************************************/ u16 my_mem_perused(u8 memx) { u32 used=0; u32 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