转向自己的博客----》》》》》》原博客地址
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