自写malloc函数的实现

转向自己的博客----》》》》》》原博客地址

z_malloc.c

#include "z_malloc.h"

#include <string.h>
__align(MALLOC_EX_BLOCK_SIZE) uint8 malloc_ex_mem[MALLOC_EX_MEM_SIZE] ={0};
uint32 manager_ex_table[MALLOC_EX_MANAGER_TABLE] = { 0 };

void init_EXmem(void){
	uint32 i;
	for(i=0;i<MALLOC_EX_MANAGER_TABLE;i++){
		manager_ex_table[i]=0;
	}
}
///申请内存
static void* _EXmalloc(uint32 size){
	uint32 i_need_block_num;//需要的block数量
	float f_nedd_blcok_num;
	uint32 i;
	uint32 find_block_num=0;//找到的空的块
	uint32 temp;
	uint8 flag=0;

	f_nedd_blcok_num=size/(float)MALLOC_EX_BLOCK_SIZE;
	i_need_block_num=size/MALLOC_EX_BLOCK_SIZE;	
	if(f_nedd_blcok_num>i_need_block_num){//向上进位
		i_need_block_num+=1;
	}
	for(i=0;i<MALLOC_EX_MANAGER_TABLE;){
		if(manager_ex_table[i]==0){
			find_block_num++;
			if(find_block_num==i_need_block_num){
				flag=1;
				break;				
			}
			i++;
		}else{
			find_block_num=0;
			i+=manager_ex_table[i];
		}
	}
	if(flag!=1||i>=MALLOC_EX_MANAGER_TABLE){//没有找到,或者超出了
		return NULL;
	}
	i-=i_need_block_num-1;
//	if(i!=0){
//		i-=i_need_block_num;
//	}
	for(temp=i;temp<i+i_need_block_num;temp++){
		if(temp==i){
			manager_ex_table[i]=i_need_block_num;
		}else{
			manager_ex_table[temp]=1;
		}
	}
	return (void*)(&(malloc_ex_mem[MALLOC_EX_BLOCK_SIZE*i]));	
}
static void _EXfree(void* mem_addr){
	if(mem_addr==NULL){return ;}
	uint32 free_size;
	uint32 i_mem_offset=(uint32)mem_addr-(uint32)malloc_ex_mem;
	uint32 i_manager_offset=i_mem_offset/MALLOC_EX_BLOCK_SIZE;
	uint32 i;
	if(i_manager_offset>MALLOC_EX_MANAGER_TABLE){
		return ;
	}
	free_size=manager_ex_table[i_manager_offset];
	for(i=i_manager_offset;i<free_size+i_manager_offset;i++){
		manager_ex_table[i]=0;
	}
}
u32 getMemBlockRealSize(void *mem_addr){
	uint32 i_mem_size=(uint32)mem_addr-(uint32)malloc_ex_mem;
	uint32 i_manager_offset=i_mem_size/MALLOC_EX_BLOCK_SIZE;
	return manager_ex_table[i_manager_offset]*MALLOC_EX_BLOCK_SIZE;
}
void* EXmalloc(uint32 size){
	void * res;
	u32 ecz;
	res=_EXmalloc(size);
	return  res;
}
void* EXcalloc(u32 num,u32 size){
	void *mem= EXmalloc(num*size);
	if(mem!=NULL){
		memset(mem,0,size);
	}
	return mem;
}

void EXfree(void* mem_addr){
	u32 ecz;
	_EXfree(mem_addr);
}
void *EXrealloc (void *ptr, u32 new_size ){
	void * new_pt;
	u32 _t_new_size;
	if(ptr==NULL){
		new_pt=EXmalloc(new_size);
		return new_pt;
	}else{
		new_pt=EXmalloc(new_size);
		_t_new_size=getMemBlockRealSize(ptr);
		memcpy(new_pt,ptr,_t_new_size>new_size?new_size:_t_new_size);
		EXfree(ptr);
	}
	return new_pt;
}
	

z_malloc.h

#ifndef _MEM_H__
#define _MEM_H__
#include "stm32f10x.h"                  // Device header

#include "type.h"

#define MALLOC_EX_MEM_SIZE (80*1024)
#define MALLOC_EX_BLOCK_SIZE (32)
#define MALLOC_EX_MANAGER_TABLE (MALLOC_EX_MEM_SIZE/MALLOC_EX_BLOCK_SIZE)

void init_EXmem(void);
void* EXmalloc(uint32 size);
void EXfree(void* mem_addr);
void *EXrealloc(void *ptr, u32 new_size );
void* EXcalloc(u32 num,u32 size);


#endif

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值