中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 嵌入式下malloc()+free()的实现代码
作者:
标题: 嵌入式下malloc()+free()的实现代码 上一主题 | 下一主题
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
状态 离线
『第 4 楼』:  

垃圾收集?

2007-3-3 05:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jxfengzi
新手上路





积分 8
发帖 4
注册 2007-5-11
状态 离线
『第 5 楼』:  

up

2007-10-17 16:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: