![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-10-31 15:54 |
共 47,815 主题排行 / 349,930 发帖 / 今日 0 篇 / 48,290 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » 嵌入式下malloc()+free()的实现代码 |
| 可打印版本 3,267 / 4 |
| 第1楼 seekfor | 发表于 2006-11-19 00:25 |
| 荣誉版主 发帖 23 积分 57 | |
|
嵌入式下malloc()+free()的实现代码 /*************************************Seekfor FAT System v1.3**************************************************************************
********************* ********************************* ********************* v1.3 ******* ********** ******* ******** ******* *********** ******* ******* ******* ******* ******** ******* ******* ******* ******* ******** ******* ******* ******* ******** ******* ******* ******* ******** *********** ************************* *********** *********** ******* ******* *********** ******* ******* ******* ******* ******* ******* ******* ******* ******* ******* ******** ******* ******* ******* ******* ******** ******* ******* ******* ******* ******** ******* ********** ******* ******* *********** ******* ********************* *************** ********************** Seekfor FAT system v1.3是移植性非常强的一个嵌入式FAT16/FAT32文件系统软件包,支持多个物理驱动器,完全兼容DOS下的文件系统,支持多任务下的文件操作. <1>和SFS 前期版本比较,SFS v1.3增加以下特性: 1.增强了错误处理功能 2.增加了FAT_format()功能 3.开始支持扩展分区 4.开始支持长文件的显示(暂不支持用长文件名访问文件),Windows下建立的长文件名可以正常显示 5.取消v1.0中的物理驱动器概念,所有驱动器都看做逻辑驱动器 6.修正v1.0中扇区计算不对不兼容Windows的bug 7.修正FAT32根目录起始位置固定的bug 8.内部直接支持malloc()+free()机制,用户只需提供2K以上的RAM空间即可使用SFS v1.3 <2>更新软件请联系: QQ:82054357 MSN:[email protected] Mail:[email protected] <3>本文件说明 a.文件名:malloc.c b.功能:动态内存分配 **************************************************************************************************************************************/ #include "malloc.h" static DWORD dwUnits=0;/*每个分配单元字节数*/ static DWORD dwNumOfUnits=0;/*分配单元总数*/ static BYTE*lpszMAT=(BYTE*)0;/*MAT表首地址*/ static BYTE*lpszMEM=(BYTE*)0;/*MEM首地址*/ static BYTE MASK[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; static BYTE bit_is_set(DWORD offset) { BYTE*item; BYTE i; item=lpszMAT+(offset>>3); i=offset&0x07; return ((*item)&MASK[i]); } static void set_bit(DWORD offset) { BYTE*item; BYTE i; item=lpszMAT+(offset>>3); i=offset&0x07; *item|=MASK[i]; } static void clear_bit(DWORD offset) { BYTE*item; BYTE i; item=lpszMAT+(offset>>3); i=offset&0x07; *item&=~MASK[i]; } /**void MEM_init(BYTE*ptr,DWORD len,DWORD alloc_unit)******************************************** 功能: 内存模块重新初始化 入口: BYTE*ptr:内存首地址 DWORD len:内存块大小 DWORD alloc_unit:每单元字节数,在ARM下一定要是4的倍数,否则在使用DWORD*会产生DATA abort中断 出口: 无 调用者: 任意 备注: 无 *************************************************************************************************/ void MEM_init(BYTE*ptr,DWORD len,DWORD alloc_unit) { DWORD dwBytes; dwUnits=(alloc_unit==0)?DEFAULT_ALLOC_UNIT:alloc_unit;/*检测分配单元是否有效,如果无效则使用默认设置*/ dwNumOfUnits=(len*8-7)/(dwUnits*8+1);/*检测总的分配单元数*/ dwBytes=(dwNumOfUnits+7)/8; if(dwBytes&0x03)/*不是字对齐则分配单元减去1*/ { dwNumOfUnits--; } dwBytes=dwBytes+(4-(dwBytes&0x03));/*DWORD对齐*/ for(len=0;len<dwBytes;len++) *(ptr+len)=0x00; lpszMAT=ptr; lpszMEM=ptr+dwBytes; } /**void free(void*)************************************************************************** 功能: free一个内存块(在MAT表中所有使用项目全部置0) 入口: void*ptr:malloc()返回的内存块指针 出口: 无 调用者: 任意 备注: 无 *************************************************************************************************/ void free(void*ptr) { DWORD offset,i,j; DWORD*mem; if((DWORD)ptr<(DWORD)(lpszMEM+sizeof(DWORD)*2)) return; mem=((DWORD*)ptr); mem-=2; offset=*mem++; i=*mem++; for(j=0;j<i;j++) { clear_bit(offset+j); } } /**void malloc(DWORD size)************************************************************************** 功能: 动态分配一个size大小的内存块 入口: DWORD size:要分配的大小,字节数 出口: 调用成功返回一个有效指针,否则返回NULL 调用者: 任意 备注: 无 *************************************************************************************************/ void*malloc(DWORD size) { DWORD i,j; DWORD blocks; DWORD total; DWORD*ptr; if(!lpszMAT||!lpszMEM) return (void*)0; total=(size+(dwUnits-1)+sizeof(DWORD)*2)/dwUnits;/*计算需要的单元总数*/ for(i=0;i<dwNumOfUnits;i++) { if(bit_is_set(i)) continue; blocks=0; for(j=i;j<dwNumOfUnits;j++) { if(bit_is_set(j)) break; if(++blocks==total) break; } if(blocks>=total) { ptr=(DWORD*)(lpszMEM+i*dwUnits); *ptr++=i; *ptr++=blocks; for(j=0;j<blocks;j++) set_bit(i+j); return (void*)ptr; } i+=blocks; } return (void*)0; } |
|
| 第2楼 seekfor | 发表于 2006-11-19 00:27 |
| 荣誉版主 发帖 23 积分 57 | |
|
以上库的使用方法 unsigned char MEM[1024*32];/*32K的动态空间*/
void main() { char*p; MEM_init((char*)MEM,1024*32,32); p=(char*)malloc(256*sizeof(char)); if(p) { strcpy(p,"This is a demo program!\r\n"); printf(p); free(p); } } |
|
| 第3楼 Rinrin | 发表于 2007-03-02 09:40 |
| 初级用户 发帖 10 积分 30 | |
|
做高性能的堆管理函数不容易
推荐一本书叫《垃圾收集》 |
|
| 第4楼 sword221 | 发表于 2007-03-03 05:49 |
| 初级用户 发帖 17 积分 30 | |
|
垃圾收集?
|
|
| 第5楼 jxfengzi | 发表于 2007-10-17 16:51 |
| 新手上路 发帖 4 积分 8 | |
|
up
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |