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

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

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

存使用率

mem1base,mem2base, //内存池

mem1mapbase,mem2mapbase, //内存管理状态表,mem1mapbase(1250项),mem2mapbase(6250项)

0,0, //内存管理未就绪

};

/*

1,“void *des”无类型指针,不能指向具体的数据,“void *des”无类型指针指向内存中的数据类型由用户自己确定,如malloc()函数的返回值就是“void *des”无类型指针,因为malloc()函数的返回值是不确定的是根据形参的数据类型确定的

2,“void mymemcpy(void *des,void *src,u32 n) ”函数的理解:

des是指针,但是不确定指向什么类型的数据,换句话说des指针存储的什么类型数据不确定,“u8 *xdes=des;”将des指针存储的数据

存储到一个新的“u8 *”类型指针xdes中;“u8 *xsrc=src;”同理。

“*xdes++=*xsrc++; ”,当*xsrc++(自增)时,即指针“src”指针自增,也就是说把“src”指针逐位复制到des目标指针去了。复制个数就是n。

3,“*P”的意义:a),“*P”就是以指针变量P的内容(P的内容就是指针变量P里存储的某一类型数据的指针值)为地址的变量;b),指针运算符“*”如果是在定义变量时候加在前面,意思是这个变量是指针变量,如 char *a;如果是在访问指针变量的时候加在前面(如*a),意思是取指针变量指向的值,如 char b=*a; 上面定义了a是一个字符指针,这里就是把指针变量a指向的值取出来并赋给b。

*/

//复制内存,作用是将源地址的内容复制到目标地址

//*des:目的地址

//*src:源地址

//n:需要复制的内存长度(字节为单位)

void mymemcpy(void *des,void *src,u32 n)

{ //“void *des”无类型指针,不能指向具体的数据,“void *des”无类型指针指向内存中的数据类型由用户自己确定

u8 *xdes=des;//目标地址,“*xdes”转换成u8类型,也可以理解为把目的地地址des存储到xdes指针中

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;

} //以*s为内存首地址的count个字节中,填充c,即把c写入到*s为首地址的内存中,个数多少由count值决定

//内存管理初始化

//memx:所属内存块,要么SRAMEX==1(外部内存);要么SRAMIN(内部内存)==0

/*

const u32 memtblsize[2]={MEM1_ALLOC_TABLE_SIZE,MEM2_ALLOC_TABLE_SIZE};//内存管理表大小

const u32 memblksize[2]={MEM1_BLOCK_SIZE,MEM2_BLOCK_SIZE}; //内存分块大小

const u32 memsize[2]={MEM1_MAX_SIZE,MEM2_MAX_SIZE}; //内存总大小

*/

void mem_init(u8 memx) //如“mem_init(SRAMIN);”表示内部内存块

{ //memmap,是16位的,mymemset,设置是针对8位的,那么1个16位的数据是不是2个8位组成的啊?!

mymemset(mallco_dev.memmap[memx], 0,memtblsize[memx]*2);//内存状态表数据清零

//把u8类型的数据“0”填充到u16类型指针元素memmap[0]中(根据结构体定义“u16 *memmap[2]; ”),memmap[0]=mem1mapbase==1250,

//也就是说“mallco_dev.memmap[memx]”在这里表示1250个内部内存块用以存储u16类型指针,

//“memtblsize[memx]”是什么呢?memtblsize[memx]即memtblsize[0]==1250个内部内存管理表,

//而mallco_dev.memmap[memx]是16位的,为了将其全部清零,所以乘以2.

mymemset(mallco_dev.membase[memx], 0,memsize[memx]); //内存池所有数据清零

//memsize[0]==40K字节空间, mallco_dev.membase[memx]==40K字节空间,

mallco_dev.memrdy[memx]=1; //内存管理初始化OK

}

/*

*/

//获取内存使用率

//memx:所属内存块,要么SRAMEX==1(外部内存);要么SRAMIN(内部内存)==0

//返回值:使用率(0~100)

u8 mem_perused(u8 memx)

{

u32 used=0;

u32 i;

for(i=0;i {

if(mallco_dev.memmap[memx][i])used++;

} //mallco_dev.memmap[memx][i]是二维数组。当内存块初始化后该值为0,

return (used*100)/(memtblsize[memx]); //used*100,乘以100是将小数变成整数

}

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

//memx:所属内存块

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

//返回值:0XFFFFFFFF,代表错误;其他,内存偏移地址

//向memx存储器申请size个字节的连续存储空间,并将size个字节中首个字节的地址偏

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

网站地图

Top