基于STM32原子战舰板内存管理源码
for(offset=memtblsize[memx]-1;offset> if(!mallco_dev.memmap[memx][offset])cmemb++;//连续空内存块数增加,offset从1249-> 一维数组,每个元素对应的实际意义是对应的一个内存块,顺序是offset从1249(高)-> /MEM1_BLOCK_SIZE //内存表大小 //mem2内存参数设定.mem2的内存池处于外部SRAM里面,其他的处于内部SRAM里面 #define MEM2_BLOCK_SIZE 32 //内存块大小为32字节 #define MEM2_MAX_SIZE 200*1024 //最大管理内存200K #define MEM2_ALLOC_TABLE_SIZE MEM2_MAX_SIZE/MEM2_BLOCK_SIZE //内存表大小 struct _m_mallco_dev //内存管理控制器 { void (*init)(u8); //初始化 u8 (*perused)(u8); //内存使用率 u8 *membase[2]; //内存池 管理2个区域的内存 u16 *memmap[2]; //内存管理状态表 u8 memrdy[2]; //内存管理是否就绪 }; extern struct _m_mallco_dev mallco_dev; //在mallco.c里面定义,定义全局变量,结构体变量mallco_dev void mymemset(void *s,u8 c,u32 count); //设置内存 void mymemcpy(void *des,void *src,u32 n);//复制内存 void mem_init(u8 memx); //内存管理初始化函数(外/内部调用) u32 mem_malloc(u8 memx,u32 size); //内存分配(内部调用) u8 mem_free(u8 memx,u32 offset); //内存释放(内部调用) u8 mem_perused(u8 memx); //获得内存使用率(外/内部调用) //////////////////////////////////////////////////////////////////////////////// //用户调用函数 void myfree(u8 memx,void *ptr); //内存释放(外部调用) void *mymalloc(u8 memx,u32 size); //内存分配(外部调用) void *myrealloc(u8 memx,void *ptr,u32 size);//重新分配内存(外部调用) #endif 这部分代码,定义了很多关键数据,比如内存块大小的定义:MEM1_BLOCK_SIZE和MEM2_BLOCK_SIZE,都是32字节。内存池总大小,内部为40K,外部为200K(最大支持到近1M字节,不过为了方便演示,这里只管理200K内存)。MEM1_ALLOC_TABLE_SIZE和MEM2_ALLOC_TABLE_SIZE,则分别代表内存池1和2的内存管理表大小。 从这里可以看出,如果内存分块越小,那么内存管理表就越大,当分块为2字节1个块的时候,内存管理表就和内存池一样大了(管理表的每项都是u16类型)。显然是不合适的,我们这里取32字节,比例为1:16,内存管理表相对就比较小了。 主函数部分: int main(void) { u8 key; u8 i=0; u8 *p=0; u8 *tp=0; u8 paddr[18]; //存放的内容“P Addr:+p地址的ASCII值” u8 sramx=0; //默认为内部sram Stm32_Clock_Init(9); //系统时钟设置 uart_init(72,9600); //串口初始化为9600 delay_init(72); //延时初始化 led_init(); //初始化与LED连接的硬件接口 LCD_Init(); //初始化LCD usmart_dev.init(72); //初始化USMART Key_Init(); //按键初始化 FSMC_SRAM_Init(); //初始化外部SRAM,因为用到了外部sram mem_init(SRAMIN); //初始化内部内存池,SRAMIN==0 mem_init(SRAMEX); //初始化外部内存池,SRAMEX==1 POINT_COLOR=RED;//设置字体为红色 LCD_ShowString(60,50,200,16,16,"WarShip STM32"); LCD_ShowString(60,70,200,16,16,"MALLOC TEST"); LCD_ShowString(60,90,200,16,16,"WANG YAN"); LCD_ShowString(60,110,200,16,16,"2013/12/16"); LCD_ShowString(60,130,200,16,16,"key_right:Malloc key_left:Free"); LCD_ShowString(60,150,200,16,16,"wake_up:SRAMx key_down:Read"); POINT_COLOR=BLUE;//设置字体为蓝色 LCD_ShowString(60,170,200,16,16,"SRAMIN"); LCD_ShowString(60,190,200,16,16,"SRAMIN USED: %"); LCD_ShowString(60,210,200,16,16,"SRAMEX USED: %"); while(1) { key=Key_Scan(0);//不支持连按 switch(key) { case 0://没有按键按下 break; case key_right: //KEY0按下 p=mymalloc(sramx,2048);//申请2K字节,即64个内存块的空间 if(p!=NULL)sprintf((char*)p,"Memory Malloc Test%03d",i);//向p写入一些内容 break; case key_down: //KEY1按下 if(p!=NULL) //NULL==0; { sprintf((char*)p,"Memory Malloc Test%03d",i);//更新显示内容 // LCD_ShowString(60,270,200,16,16,p); LCD_ShowString(60,250,200,16,16,p);//显示P的内容 printf("Memory Malloc Test%03d",i);//将“Memory Malloc Test”用串口输出,利用串口助手可以看到输出的结果 //"03"表示参数“i”的值只显示3位,%-输出控制符;d-将“i”以十进制的形式输出;i的范围0--255;输出参数可以是多个,可以参考郝斌老师的相关视频; //输出控制符包含:%Ld--L代表long类型;%c--代表字符类型;:%X--代表16进制并大写; } break; case key_left: //KEY2按下 myfree(sramx,p);//释放内存 p=0; //指向空地址
STM32原子战舰板内存管 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)