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

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

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

移值标注出来,注意是地址偏移值而不是地址。

u32 mem_malloc(u8 memx,u32 size)

{

signed long offset=0;

u16 nmemb; //需要的内存块数

u16 cmemb=0;//连续空内存块数

u32 i;

if(!mallco_dev.memrdy[memx])mallco_dev.init(memx);//未初始化,先执行初始化

/*

“mallco_dev.init(memx);”是什么意思?mallco_dev.init(memx)是结构体变量mallco_dev的一个成员,本句中就是对结构体成员的引用,即执行

mem_init(u8 memx)函数的意思;如何引用结构体中指向函数的指针变量成员?既然是指向函数的指针变量且有赋值,在引用时按照格式:

结构体变量名.指向函数的指针变量名(形参);

*/

if(size==0)return 0XFFFFFFFF;//不需要分配 memblksize[memx]==32

nmemb=size/memblksize[memx]; //获取需要分配的连续内存块数

/*

c语言规定:除法的运算结果与运算对象的数据类型有关,两个数都是int则商(即结果)是int,若商(即结果)有小数则省略掉小数点部分。本例中

size和memblksize[memx]都是int,所以结果只能是int。假设size<32,则nmemb==0;

c语言规定取余运算的运算对象必须是int。当小数对大数取余时余(即结果)是小数本身;例如,在“if(size%memblksize[memx])nmemb++;”中 ,

假设size<32,则size%memblksize[memx]的结果是size值本身,所以执行“nmemb++;”运算,这时运算结果是nmemb==1;如果size是32的整数倍则不执行

“nmemb++;”运算;

memtblsize[0]==1250,memtblsize[1]==6250,

mallco_dev.memmap[memx][offset]是什么意思?

*/

if(size%memblksize[memx])nmemb++;

for(offset=memtblsize[memx]-1;offset>=0;offset--)//搜索整个内存控制区

{

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

/*

如,{ memmap[0][149],memmap[0][148],...memmap[0][1],memmap[0][0]};实际上可以把“mallco_dev.memmap[memx][offset]”视为具有1250个变量的

一维数组,每个元素对应的实际意义是对应的一个内存块,顺序是offset从1249(高)->0(低)变化;如果哪个变量等于0(即空闲)就执行

“cmemb++;”操作,这样就可以计算出连续空闲内存块数cmemb;切记!目的是要获取连续的空闲的内存块数!这样就必须结合下一句

“else cmemb=0;”来分析;如果没有出现连续的空闲内存块(即数组顺序相连的变量值没有出现类似“0,0,0,0,0”这样的情况),程序会执行下一语

句“else cmemb=0;”即把上面的“cmemb”统计值清零,这样程序就会在for循环里面继续寻找符合“if(cmemb==nmemb)”条件的状态出现,

如果for循环执行完了还没有出现符合“if(cmemb==nmemb)”条件的状态,则返回0XFFFFFFFF结束本函数表示没有找到符合条件的内存块。假

设:size=65,那么nmemb就是3即需要获取连续3个内存块来存放65个字节,再假设数组顺序相连的变量值出现了类似“0,0,0,0,0”这样的情况(即有

连续4个空闲的内存块),这时就出现了符合“if(cmemb==nmemb)”条件的状态,即当cmemb计数计到3的时候(即出现了连续相连的3个内存块)就

符合“cmemb==nmemb”了,程序就自然进入“if(cmemb==nmemb)”语句。

offset*memblksize[memx]代表什么呢?offset的取值范围是0-1249,memblksize[memx]代表每个内存块的字节数即32,offset*memblksize[memx]就

是返回偏移地址值;也就是把连续空闲的内存块对应的地址的首地址值标注出来。

*/

else cmemb=0; //连续内存块清零

if(cmemb==nmemb) //找到了连续nmemb个空内存块

{

for(i=0;i {

mallco_dev.memmap[memx][offset+i]=nmemb;

}

return (offset*memblksize[memx]);//返回偏移地址

}

}

return 0XFFFFFFFF;//未找到符合分配条件的内存块

}

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

//memx:所属内存块

//offset:内存地址偏移

//返回值:0,释放成功;1,释放失败;

u8 mem_free(u8 memx,u32 offset)

{

int i;

if(!mallco_dev.memrdy[memx])//未初始化,先执行初始化

{

mallco_dev.init(memx); //本句等价于“mem_init(memx);”

return 1;//未初始化

}

if(offset {

int index=offset/memblksize[memx]; //偏移所在内存块号码 memblksize[memx]==32,

int nmemb=mallco_dev.memmap[memx][index]; //内存块数量

for(i=0;i {

mallco_dev.memma

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

网站地图

Top