主要是按照原子哥哥的代码来开端了解或者说学习一下内存办理,特别关于咱们这个想往嵌入式方向开展的人来说,内存办理应该是一种艺术的。
今日在对原子的代码稍作修正是能够进行内存分配和收回的,所以开端深入剖析一下这个代码的完结进程。一、所谓的内存办理内存办理,是指软件运行时对计算机内存资源的分配和运用的技能。其最主要的意图是怎么高效,快速的分配,并且在恰当的时分开释和收回内存资源。
二、代码剖析
1、首要了解一下一个数据结构,这是一个声明
/*************************** 内存办理操控 **********************************************/ typedef struct {void (*init)(u8);//初始化u8 (*perused)(u8); //内存运用率u8 *membase[2];//内存池 办理2个区域的内存u16 *memmap[2]; //内存办理状态表u8 memrdy[2]; //内存办理是否安排妥当}_m_mallco_dev;
成员包含两个函数指针(该指针指向函数),两个指针数组和一个u8类型的数组,详细剖析下这几个成员的意义,那么首要要找到这个
_m_mallco_dev mallco_dev={mem_init,//内存初始化mem_perused,//内存运用率mem1base,mem2base,//内存池 mem1mapbase,mem2mapbase,//内存办理状态表0,0, //内存办理未安排妥当};这才是真实界说的当地,现在就能够了解这个几个成员的详细功用了。
a、初始化中 mem_init,mem_perused,这是两个函数,为什么能够这样用呢(直接用函数名)?
能够这样了解么,函数名就像数组名相同,只不过函数名是代码段的指针,而数组名是数据段的指针 ,所以这儿函数名便是给函数指针赋值了。当然函数指针并不能说是等于指针的,就像数组相同,数组名不等于指针的。总书记和主席仍是不相同的。所以暂时能够这样了解,函数名尽管代表了一个地址,可是这个值是确认了的,可是指针是能够指向其他地址的。就这样!这样写只不过是为了便利咱们拜访算了。能够按自己的需求修正!
那么这两个函数的效果?这才是咱们最关怀的,看这个
void mem_init(u8 memx) { mymemset(mallco_dev.memmap[memx], 0,memtblsize[memx]*2);//内存状态表数据清零 mymemset(mallco_dev.membase[memx], 0,memsize[memx]);//内存池一切数据清零 mallco_dev.memrdy[memx]=1;//内存办理初始化OK } b、注释很清晰,那么接下来便是剖析这个三句话的效果,没办法,我无法做到,一眼能看出终究。
mymemset(mallco_dev.memmap[memx], 0,memtblsize[memx]*2);等价于mymemset(mem1base, 0,0×500*2)
它里边的内容很简单便是
void mymemset(void *s,u8 c,u32 count) { u8 *xs = s; while(count–)*xs++=c; }以mem1base为首地址的巨细为0xa00的内容清0,那么mem1base又是什么呢?接下来看看
__align(4) u8 mem1base[MEM1_MAX_SIZE];这显着是4字节对齐的内部SRAM的地址,也便是咱们的flash里边的地址。所以这就完结了对咱们内部flash0xa00的内容清零,好的持续看下面的
c、 mymemset(mallco_dev.membase[memx], 0,memsize[memx]);//内存池一切数据清零
自然地这个也是一个意思,清零,仅有不同的便是代表的意思不相同,到底是内存池数据清零,仍是状态表的清零,咱们看不出来,那么只要持续剖析了。清零完成果给相应的数组元素填充1表明完结标志。至此咱们第一个初始化成员就剖析结束!!
2、下面开端剖析第二个成员perused函数
先看函数怎么界说的/***************************************************************************************
名 称: mem_perused
* 功 能: 获取内存运用率
* 参 数: *memx:所属内存块
* 返 回 值: 运用率(0~100)**************************************************************************************
/u8 mem_perused(u8 memx)
{ u32 used=0; u32 i;
for(i=0;i{ if(mallco_dev.memmap[memx][i])used++;
} return (used*100)/(memtblsize[memx]);
} 这儿能够看到呈现一个这样的表达式,需求仔细剖析!mallco_dev.memmap[memx][i]
分化一下,仍是相同,这个是指针数组,也便是数组里边寄存的是指针,那么这儿给它赋值为一个数组名mem1mapbase,可是拜访的时分仍是能够用下表来拜访的。那么能够替换为:if(mem1mapbase[i]) used++;看到没,这仍是咱们之前拜访过了的那个数组,只不过这儿是当非零的时分履行used++,也便是咱们占用了才会进行++。那么效果便是:used表明的是占用了的巨细。(used*100)/(memtblsize[memx])表明的便是占用值,memtblsize[memx]使咱们分配的总的巨细,到这儿那么第二个成员也剖析结束。
3、后边这几个成员变量,之前就现已剖析过了。mem1base,mem2base,//内存池mem1mapbase,mem2mapbase,//内存办理状态表0,0, 这儿就不胪陈了。这个数据成果剖析至此,那么接下来看咱们分配内存的进程终究怎么完结?
三、分配内存
首要看一个中心代码如下
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/317724.html