单片机(不基于os)下如何实现简单的内存管理(malloc,realloc和free函数的重新实现)
来源:互联网 发布:逆光源网络剧未删减版 编辑:程序博客网 时间:2024/05/01 14:37
实现的原理是将内存分成小的片段进行管理,代码如下:
#define MEM_BLOCK_SIZE 4096#define MEM_LARGE_BLOCK_THRESHOLD 40960//>MEM_LARGE_BLOCK_THRESHOLD :requested size is large block #define MEM_BASE_ADDRESS (0x90000000)#define MEM_ALLOC_TABLE_FIRST_ENTRY0#define MAX_MEM_SIZE 7*1024*1024#define MEM_ALLOC_TABLE_SIZE(MAX_MEM_SIZE/MEM_BLOCK_SIZE)static INT16 memory_map[MEM_ALLOC_TABLE_SIZE];static char isMemoryManagementReady=0;void *memset(void *s, int c, size_t count){char *xs = s;while (count--)*xs++ = c;return s;}INT32 ssd_mem_init(void){memset(memory_map, 0, sizeof(memory_map));isMemoryManagementReady=1;}INT16ssd_mem_percentage_used(){int used=0;int i;for(i=0;i<MEM_ALLOC_TABLE_SIZE;i++){if(memory_map[i]){used++;}}return used*100/MEM_ALLOC_TABLE_SIZE;}//return -1:FAIL//>=0:return allocated address offsetINT32 ssd_mem_malloc(UINT32 size){ int offset=0; int startEntry=MEM_ALLOC_TABLE_FIRST_ENTRY;int nmemb;int i; if(!isMemoryManagementReady) { ssd_mem_init(); }if(size==0){return -1;}nmemb=size/MEM_BLOCK_SIZE;if(size%MEM_BLOCK_SIZE){nmemb++;}if(size > MEM_LARGE_BLOCK_THRESHOLD){ for(offset=startEntry;offset<MEM_ALLOC_TABLE_SIZE-nmemb;offset++) { if(!memory_map[offset]) { int vacantSize=0; for(vacantSize=0;vacantSize<nmemb && !memory_map[offset+vacantSize];vacantSize++); if(vacantSize==nmemb) {for(i=0;i<nmemb;i++){ memory_map[offset+i]=nmemb;} return (offset*MEM_BLOCK_SIZE); }} } }else{ for(offset=MEM_ALLOC_TABLE_SIZE-1;offset>=0;offset--) { if(!memory_map[offset] && ((offset+nmemb)<=MEM_ALLOC_TABLE_SIZE))//search start of vacant block { int vacantSize=0; for(vacantSize=0;vacantSize<nmemb && !memory_map[offset+vacantSize];vacantSize++); if(vacantSize==nmemb) {for(i=0;i<nmemb;i++){ memory_map[offset+i]=nmemb;} return (offset*MEM_BLOCK_SIZE); }} }}puts("malloc size erorr=");putInt32(size); return -1;}//return 0:OK//return 1:Out of boundINT32 ssd_mem_free(INT32 offset){int i; if(!isMemoryManagementReady) { ssd_mem_init();return 1; } if(offset<MAX_MEM_SIZE) {int index=offset/MEM_BLOCK_SIZE;int nmemb=memory_map[index];for(i=0;i<nmemb;i++){memory_map[index+i]=0;} return 0; } else { return 1;//out of bound }}void free(void *ptr){if(ptr==NULL)return;INT32 offset;offset=ptr-MEM_BASE_ADDRESS;ssd_mem_free(offset);}void * malloc(UINT32 size){INT32 offset;offset=ssd_mem_malloc(size);if(offset==-1){return NULL;}elsereturn MEM_BASE_ADDRESS+offset;}void *realloc(void *ptr,UINT32 size){INT32 offset;offset=ssd_mem_malloc(size);if(offset==-1){puts("realloc error/n");return NULL;}else{memcpy((void*)(MEM_BASE_ADDRESS+offset),ptr,size);free(ptr);return MEM_BASE_ADDRESS+offset;}}
- 单片机(不基于os)下如何实现简单的内存管理(malloc,realloc和free函数的重新实现)
- 单片机(不基于os)下如何实现简单的内存管理(malloc,realloc和free函数的重新实现)
- 单片机(不基于os)下如何实现简单的内存管理(malloc,realloc和free函数的重新实现)
- malloc calloc realloc free的简单实现
- 简单的malloc,free实现函数
- C语言动态内存管理malloc、calloc、realloc、free的用法和注意事项
- malloc,free的简单实现
- 内存对齐的malloc、realloc、free
- 内存管理: malloc()与free()的一种基于clib标准的实现
- 内存管理: malloc()与free()的一种基于池表结构的实现
- 关于malloc,realloc和free函数的讲解
- C语言内存管理:malloc、calloc、free的实现
- C语言内存管理:malloc、calloc、free的实现
- 实现和调试 Malloc、Free、Calloc 和 Realloc 的快速教程
- malloc和free的实现
- 自己写的STM32 内存管理 实现了malloc,free,remalloc等函数
- 自己写的STM32 内存管理 实现了malloc,free,remalloc等函数
- 自己写的STM32 内存管理 实现了malloc,free,remalloc等函数
- 命令行时,出现ImportError: No module named
- java.sql.SQLException: Io 异常: Connection reset
- Process Request shows status of 'INITIATED' or 'PROCESSING' but nolonger running
- hdu 1008
- DBCP的配置参数
- 单片机(不基于os)下如何实现简单的内存管理(malloc,realloc和free函数的重新实现)
- HTTP 返回码
- 创建流体
- Extjs中动态生成树
- 广告投放系统(openx)
- 观察者模式【Observer Pattern】
- 指针函数和函数指针的区别
- android 3d游戏研究(二)(边学边写,多谢高手指正,鞠躬) :数据库
- pl/sql中模拟登录Oracle EBS并获得职责 .