#include "malloc.h" ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //ALIENTEK STM32F7开发板 //内存管理 驱动代码 //正点原子@ALIENTEK //技术论坛:www.openedv.com //创建日期:2015/12/12 //版本:V1.0 //版权所有,盗版必究。 //Copyright(C) 广州市星翼电子科技有限公司 2014-2024 //All rights reserved ////////////////////////////////////////////////////////////////////////////////// //内存池(32字节对齐) _Pragma("data_alignment=32") u8 mem1base[MEM1_MAX_SIZE]; //内部SRAM内存池 _Pragma("data_alignment=32") u8 mem2base[MEM2_MAX_SIZE] @(0XC01F4000); //外部SDRAM内存池,前面2M给LTDC用了(1280*800*2) _Pragma("data_alignment=32") u8 mem3base[MEM3_MAX_SIZE] @(0X20000000); //内部DTCM内存池 //内存管理表 u32 mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; //内部SRAM内存池MAP u32 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] @(0XC01F4000+MEM2_MAX_SIZE); //外部SRAM内存池MAP u32 mem3mapbase[MEM3_ALLOC_TABLE_SIZE] @(0X20000000+MEM3_MAX_SIZE); //内部DTCM内存池MAP //内存管理参数 const u32 memtblsize[SRAMBANK]={MEM1_ALLOC_TABLE_SIZE,MEM2_ALLOC_TABLE_SIZE,MEM3_ALLOC_TABLE_SIZE}; //内存表大小 const u32 memblksize[SRAMBANK]={MEM1_BLOCK_SIZE,MEM2_BLOCK_SIZE,MEM3_BLOCK_SIZE}; //内存分块大小 const u32 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,mem3base, //内存池 mem1mapbase,mem2mapbase,mem3mapbase,//内存管理状态表 0,0,0, //内存管理未就绪 }; //复制内存 //*des:目的地址 //*src:源地址 //n:需要复制的内存长度(字节为单位) void mymemcpy(void *des,void *src,u32 n) { u8 *xdes=des; u8 *xsrc=src; while(n--)*xdes++=*xsrc++; } //设置内存 //*s:内存首地址 //c :要设置的值 //count:需要设置的内存大小(字节为单位) void mymemset(void *s,u8 c,u32 count) { u8 *xs = s; while(count--)*xs++=c; } //内存管理初始化 //memx:所属内存块 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%) 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