#include "sys_malloc.h" ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //ALIENTEK STM32H7开发板 //内存管理 驱动代码 //正点原子@ALIENTEK //技术论坛:www.openedv.com //创建日期:2018/7/30 //版本:V1.0 //版权所有,盗版必究。 //Copyright(C) 广州市星翼电子科技有限公司 2014-2024 //All rights reserved //******************************************************************************** //修改说明 //无 ////////////////////////////////////////////////////////////////////////////////// //内存池(64字节对齐) __align(64) u8 mem1base[MEM1_MAX_SIZE]; //内部SRAM内存池 //内存管理表 u32 mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; //内部SRAM内存池MAP #ifdef SRAMEX //1 //外部内存池(SDRAM),SDRAM共32MB __align(64) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0XC01F4000))); //外部SDRAM内存池,前面2M给LTDC用了(1280*800*2) u32 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0XC01F4000+MEM2_MAX_SIZE))); //外部SDRAM内存池MAP #endif #ifdef SRAM12 //2 //SRAM1/2/3内存池,SRAM1+SRAM2,共256KB __align(64) u8 mem3base[MEM3_MAX_SIZE] __attribute__((at(0x30000000))); //内部SRAM1+SRAM2内存池 u32 mem3mapbase[MEM3_ALLOC_TABLE_SIZE] __attribute__((at(0x30000000+MEM3_MAX_SIZE))); //内部SRAM1+SRAM2内存池MAP #endif #ifdef SRAM4 //3 //SRAM4内存池,SRAM4共64KB __align(64) u8 mem4base[MEM4_MAX_SIZE] __attribute__((at(0x38000000))); //内部SRAM4内存池 u32 mem4mapbase[MEM4_ALLOC_TABLE_SIZE] __attribute__((at(0x38000000+MEM4_MAX_SIZE))); //内部SRAM4内存池MAP #endif #ifdef SRAMDTCM //4 //DTCM内存池,DTCM共128KB,此部分内存仅CPU和MDMA(通过AHBS)可以访问!!!! __align(64) u8 mem5base[MEM5_MAX_SIZE] __attribute__((at(0x20000000))); //内部DTCM内存池 u32 mem5mapbase[MEM5_ALLOC_TABLE_SIZE] __attribute__((at(0x20000000+MEM5_MAX_SIZE))); //内部DTCM内存池MAP #endif #ifdef SRAMITCM //5 //ITCM内存池,DTCM共64 KB,此部分内存仅CPU和MDMA(通过AHBS)可以访问!!!! __align(64) u8 mem6base[MEM6_MAX_SIZE] __attribute__((at(0x00000000))); //内部ITCM内存池 u32 mem6mapbase[MEM6_ALLOC_TABLE_SIZE] __attribute__((at(0x00000000+MEM6_MAX_SIZE))); //内部ITCM内存池MAP #endif #ifdef SRAMEX //1 //外部内存池(SDRAM),SDRAM共32MB #endif #ifdef SRAM12 //2 //SRAM1/2/3内存池,SRAM1+SRAM2,共256KB #endif #ifdef SRAM4 //3 //SRAM4内存池,SRAM4共64KB #endif #ifdef SRAMDTCM //4 //DTCM内存池,DTCM共128KB,此部分内存仅CPU和MDMA(通过AHBS)可以访问!!!! #endif #ifdef SRAMITCM //5 //ITCM内存池,DTCM共64 KB,此部分内存仅CPU和MDMA(通过AHBS)可以访问!!!! #endif //内存管理参数 const u32 memtblsize[SRAMBANK]={ MEM1_ALLOC_TABLE_SIZE, #ifdef SRAMEX //1 //外部内存池(SDRAM),SDRAM共32MB MEM2_ALLOC_TABLE_SIZE, #endif #ifdef SRAM12 //2 //SRAM1/2/3内存池,SRAM1+SRAM2,共256KB MEM3_ALLOC_TABLE_SIZE, #endif #ifdef SRAM4 //3 //SRAM4内存池,SRAM4共64KB MEM4_ALLOC_TABLE_SIZE, #endif #ifdef SRAMDTCM //4 //DTCM内存池,DTCM共128KB,此部分内存仅CPU和MDMA(通过AHBS)可以访问!!!! MEM5_ALLOC_TABLE_SIZE, #endif #ifdef SRAMITCM //5 //ITCM内存池,DTCM共64 KB,此部分内存仅CPU和MDMA(通过AHBS)可以访问!!!! MEM6_ALLOC_TABLE_SIZE #endif }; //内存表大小 const u32 memblksize[SRAMBANK]={ MEM1_BLOCK_SIZE, #ifdef SRAMEX //1 //外部内存池(SDRAM),SDRAM共32MB MEM2_BLOCK_SIZE, #endif #ifdef SRAM12 //2 //SRAM1/2/3内存池,SRAM1+SRAM2,共256KB MEM3_BLOCK_SIZE, #endif #ifdef SRAM4 //3 //SRAM4内存池,SRAM4共64KB MEM4_BLOCK_SIZE, #endif #ifdef SRAMDTCM //4 //DTCM内存池,DTCM共128KB,此部分内存仅CPU和MDMA(通过AHBS)可以访问!!!! MEM5_BLOCK_SIZE, #endif #ifdef SRAMITCM //5 //ITCM内存池,DTCM共64 KB,此部分内存仅CPU和MDMA(通过AHBS)可以访问!!!! MEM6_BLOCK_SIZE #endif }; //内存分块大小 const u32 memsize[SRAMBANK] ={ MEM1_MAX_SIZE, #ifdef SRAMEX //1 //外部内存池(SDRAM),SDRAM共32MB MEM2_MAX_SIZE, #endif #ifdef SRAM12 //2 //SRAM1/2/3内存池,SRAM1+SRAM2,共256KB MEM3_MAX_SIZE, #endif #ifdef SRAM4 //3 //SRAM4内存池,SRAM4共64KB MEM4_MAX_SIZE, #endif #ifdef SRAMDTCM //4 //DTCM内存池,DTCM共128KB,此部分内存仅CPU和MDMA(通过AHBS)可以访问!!!! MEM5_MAX_SIZE, #endif #ifdef SRAMITCM //5 //ITCM内存池,DTCM共64 KB,此部分内存仅CPU和MDMA(通过AHBS)可以访问!!!! MEM6_MAX_SIZE #endif }; //内存总大小 //内存管理控制器 struct _m_mallco_dev mallco_dev= { .init = my_mem_init, //内存初始化 .perused = my_mem_perused, //内存使用率 .membase[SRAMIN] = mem1base, //内存池 #ifdef SRAMEX //1 //外部内存池(SDRAM),SDRAM共32MB .membase[SRAMEX] = mem2base, #endif #ifdef SRAM12 //2 //SRAM1/2/3内存池,SRAM1+SRAM2,共256KB mem3base, #endif #ifdef SRAM4 //3 //SRAM4内存池,SRAM4共64KB mem4base, #endif #ifdef SRAMDTCM //4 //DTCM内存池,DTCM共128KB,此部分内存仅CPU和MDMA(通过AHBS)可以访问!!!! mem5base, #endif #ifdef SRAMITCM //5 //ITCM内存池,DTCM共64 KB,此部分内存仅CPU和MDMA(通过AHBS)可以访问!!!! mem6base, #endif .memmap[SRAMIN] = mem1mapbase,//内存管理状态表 #ifdef SRAMEX //1 //外部内存池(SDRAM),SDRAM共32MB mem2mapbase, #endif #ifdef SRAM12 //2 //SRAM1/2/3内存池,SRAM1+SRAM2,共256KB mem3mapbase, #endif #ifdef SRAM4 //3 //SRAM4内存池,SRAM4共64KB mem4mapbase, #endif #ifdef SRAMDTCM //4 //DTCM内存池,DTCM共128KB,此部分内存仅CPU和MDMA(通过AHBS)可以访问!!!! mem5mapbase, #endif #ifdef SRAMITCM //5 //ITCM内存池,DTCM共64 KB,此部分内存仅CPU和MDMA(通过AHBS)可以访问!!!! mem6mapbase #endif .memrdy= {0,0,0,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