内存办理简介:
内存办理,是指软件运行时对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单片机参阅规划