您的位置 首页 电路

STM32学习――内存办理

内存管理,是指软件运行时对mcu内存资源的分配和使用的技术。主要目的是高效快速的分配使用内存资源。在适当的时候释放回收内存资源。内存管理实现的方

内存办理简介:

内存办理,是指软件运行时对mcu内存资源的分配和运用的技能。首要意图是高效快速的分配运用内存资源。在恰当的时分开释收回内存资源。内存办理完结的方法最终是完结两个函数:malloc和free;malloc函数用于内存请求,free函数用于内存开释。

内存分配原理:

当指针P调用malloc请求内存的时分,先判别P要分配的内存块数(m),然后从n项开端,向下查找,直到找到接连的m块空间(即对应的内存办理项为“0”)。然后将这m个内存办理项的值都赋值为m(符号为占用)。,最终,把最终的内存地址回来给指针P,完结一次内存分配。留意:假如内存不够用的时分,或许没有接连的m块内存时,则回来NULL给P,表明分配失利。

内存开释原理:

当P请求的内存用完后,需求开释的时分,调用free函数完结。free函数先判别P指向的内存地址所对应的内存块数m。(内存办理项的值便是所分配的内存块数)将这m个内存办理项的值清零,符号开释,完结一次内存开释。

要害代码示例:

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

//memx:所属内存块

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

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

u32 mem_malloc(u32 size)

{

signed long offset=0;

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

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

u32 i;

if(!mallco_dev.memrdy)mallco_dev.init(); //未初始化,先履行初始化

if(size==0)return 0XFFFFFFFF; //不需求分配

nmemb=size/memblksize; //获取需求分配的接连内存块数

if(size%memblksize)nmemb++;

for(offset=memtblsize-1;offset>=0;offset–) //查找整个内存控制区

{

if(!mallco_dev.memmap[offset])cmemb++; //接连空内存块数添加

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

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

{

for(i=0;i //标示内存块非空

{

mallco_dev.memmap[offset+i]=nmemb;

}

return (offset*memblksize); //回来偏移地址

}

}

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

}

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

//offset:内存地址偏移

//回来值:0,开释成功;1,开释失利;

u8 mem_free(u32 offset)

{

int i;

if(!mallco_dev.memrdy)//未初始化,先履行初始化

{

mallco_dev.init();

return 1;//未初始化

}

if(offset

{

int index=offset/memblksize; //偏移地点内存块号码

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

for(i=0;i //内存块清零

{

mallco_dev.memmap[index+i]=0;

}

return 0;

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

}

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

//ptr:内存首地址

void myfree(void *ptr)

{

u32 offset;

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

offset=(u32)ptr-(u32)mallco_dev.membase;

mem_free(offset); //开释内存

}

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

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

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

void *mymalloc(u32 size)

{

u32 offset;

offset=mem_malloc(size);

if(offset==0XFFFFFFFF)return NULL;

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

}

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

//*ptr:旧内存首地址

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

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

void *myrealloc(void *ptr,u32 size)

{

u32 offset;

offset=mem_malloc(size);

if(offset==0XFFFFFFFF)return NULL;

else

{

mymemcpy((void*)((u32)mallco_dev.membase+offset),ptr,size); //复制旧内存内容到新内存

myfree(ptr); //开释旧内存

return (void*)((u32)mallco_dev.membase+offset); //回来新内存首地址

}

}

  • STM32单片机中文官网
  • STM32单片机官方开发工具
  • STM32单片机参阅规划

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/dianlu/156691.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部