|
seekfor
荣誉版主
积分 57
发帖 23
注册 2006-10-28
状态 离线
|
『楼 主』:
嵌入式下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:sfrad32@hotmail.com
Mail:Seek_for@163.com
<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;
}
|
|
2006-11-19 00:25 |
|
|
seekfor
荣誉版主
积分 57
发帖 23
注册 2006-10-28
状态 离线
|
『第
2 楼』:
以上库的使用方法
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);
}
}
|
|
2006-11-19 00:27 |
|
|
Rinrin
初级用户
积分 30
发帖 10
注册 2005-7-23
状态 离线
|
『第
3 楼』:
做高性能的堆管理函数不容易
推荐一本书叫《垃圾收集》
|
|
2007-3-2 09:40 |
|
|
sword221
初级用户
积分 30
发帖 17
注册 2006-8-2
状态 离线
|
|
2007-3-3 05:49 |
|
|
jxfengzi
新手上路
积分 8
发帖 4
注册 2007-5-11
状态 离线
|
|
2007-10-17 16:51 |
|
|