微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于STM32原子战舰板内存管理源码

基于STM32原子战舰板内存管理源码

时间:12-01 来源:互联网 点击:

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; //指向空地址

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top