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

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

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

for(offset=memtblsize[memx]-1;offset>

if(!mallco_dev.memmap[memx][offset])cmemb++;//连续空内存块数增加,offset从1249->

一维数组,每个元素对应的实际意义是对应的一个内存块,顺序是offset从1249(高)->

p[memx][index+i]=0;

}

return 0;

}else return 2;//偏移超区了.

}

//释放内存(外部调用)

//memx:所属内存块

//ptr:内存首地址

void myfree(u8 memx,void *ptr)

{

u32 offset;

if(ptr==NULL)return;//地址为0.

offset=(u32)ptr-(u32)mallco_dev.membase[memx];

mem_free(memx,offset);//释放内存

}

//分配内存(外部调用)

//memx:所属内存块

//size:内存大小(字节)

//返回值:分配到的内存首地址.

//在memx存储器中,找出size个字节的连续空闲的内存空间,并将连续空闲的内存空间指针值标注出来;返回值就是这个指针值

/*

mallco_dev.membase[memx]即mallco_dev.membase[0]代表MCU内部存储器的40K字节中的第一个字节变量的地址,是u8类型指针变量,也就是说一个字节占用一个地址;换句话说,把内部存储器的40K字节的地址定义为一个“u8 mem1base[MEM1_MAX_SIZE]”数组,指针类型数组“u8 *membase[2];”的赋值是{mem1base,mem2base},而“mem1base,mem2base”分别是内部内存池和外部内存池的数组名,各自首元素的地址亦是个指针常量;因为事先已经定义

“u8 mem1base[MEM1_MAX_SIZE]”即“u8 mem1base[40K];”。如何理解“(void*)((u32)mallco_dev.membase[memx]+offset); ”呢?

1),已经说过mallco_dev.membase[memx]是首个变量的地址即40k字节中首个字节的地址值;

2),“offset”是:向memx存储器申请size个字节的连续空闲存储空间,这个找到的连续空闲空间当中首个字节的地址偏移值就是offset,offset==32(将32个字节空间组成一个内存块)*内存块号(如,假设向内部存储器申请64个字节的连续空闲存储空间,通过“mem_malloc(memx,size); ”函数得到在第五个存储块开始有连续2个存储快空闲可供使用(假设是5号和4号存储快),因为每个存储快有32个字节即有32个地址编号,4*32==128(这里的4是指第四块),5*32==160(这里的5是指第五块),那么这个160就是40K个字节编号当中的地址偏移值offset,即128-192号就是第四块和第五块内存块所对应的指针编号);注意offset是地址偏移值而不是地址;为什么要引入地址偏移值这个概念呢?假设第一个字节的地址值是0x0000 6800,那么就知道(0x0000 6800+160)的值就是第五块内存的指针。

3),“(u32)mallco_dev.membase[memx]”代表指针类型数组,意义是内部存储器40K字节中的第一个字节变量的地址,原来存放的是u8类型数据的地址,现在强制类型转换扩展为u32类型;

4),(void*)((u32)mallco_dev.membase[memx]+offset); 转换为无类型指针,指针值是32位,由此可知,“void *mymalloc(u8 memx,u32 size)”函数的返回值就是一个指针,即形参size所指向的由高向低的首个指针值;“void *mymalloc(u8 memx,u32 size)”是个指针类型函数,只能赋给指针。

*/

void *mymalloc(u8 memx,u32 size) //p=mymalloc(sramx,2048)

{

u32 offset;

offset=mem_malloc(memx,size);

if(offset==0XFFFFFFFF)return NULL;

else return (void*)((u32)mallco_dev.membase[memx]+offset);

}

//重新分配内存(外部调用)

//memx:所属内存块

//*ptr:旧内存首地址

//size:要分配的内存大小(字节)

//返回值:新分配到的内存首地址.

void *myrealloc(u8 memx,void *ptr,u32 size)

{

u32 offset;

offset=mem_malloc(memx,size);

if(offset==0XFFFFFFFF)return NULL;

else

{

mymemcpy((void*)((u32)mallco_dev.membase[memx]+offset),ptr,size); //拷贝旧内存内容到新内存

// 把size个字节指针ptr复制到“((u32)mallco_dev.membase[memx]+offset)”,

myfree(memx,ptr); //释放旧内存,因为在mem_malloc(memx,size)中已经将连续空闲内存块标注为1(已被占用),清除掉原来的标记

return (void*)((u32)mallco_dev.membase[memx]+offset); //返回新内存首地址,无类型指针

}

}

头文件:

#ifndef __MALLOC_H

#define __MALLOC_H

typedef unsigned long u32;

typedef unsigned short u16;

typedef unsigned char u8;

#ifndef NULL

#define NULL 0

#endif

#define SRAMIN 0 //内部内存池

#define SRAMEX 1 //外部内存池

//mem1内存参数设定.mem1完全处于内部SRAM里面

#define MEM1_BLOCK_SIZE 32 //内存块大小为32字节

#define MEM1_MAX_SIZE 40*1024 //最大管理内存 40K

#define MEM1_ALLOC_TABLE_SIZE MEM1_MAX_SIZE

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

网站地图

Top