OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5698|回复: 3

内存管理表要定义为u16数组,好浪费空间

[复制链接]

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2013-1-15
在线时间
6 小时
发表于 2014-7-28 22:29:00 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-28 22:29:01 | 显示全部楼层
这个没办法,必须的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2013-1-15
在线时间
6 小时
 楼主| 发表于 2014-7-29 08:23:29 | 显示全部楼层



原子:内层管理实验,外接内存每个4K空间开始的地方是非0,存的是offset地址,而这部分空间用作内存管理表,mymalloc的时候要进行非0检查,导致malloc失败?
多谢!

#define MEM2_BLOCK_SIZE            32                                //内存块大小为32字节
//#define MEM2_MAX_SIZE            200*1024                          //最大管理内存200K
#define MEM2_MAX_SIZE            800*1024                          //最大管理内存800K

//内存分配(内部调用)
//memx:所属内存块
//size:要分配的内存大小(字节)
//返回值:0XFFFFFFFF,代表错误;其他,内存偏移地址
u32 mem_malloc(u8 memx,u32 size)  
{  
    signed long offset=0;  
    u16 nmemb;    //需要的内存块数  
    u16 cmemb=0;//连续空内存块数
    u32 i;  
    printf("%s-%s(%d)memx=%d\r\n",__FILE__,__func__,__LINE__,memx);
    printf("%s-%s(%d)size=%d\r\n",__FILE__,__func__,__LINE__,size);
    if(!mallco_dev.memrdy[memx])
        mallco_dev.init(memx);//未初始化,先执行初始化
    printf("%s-%s(%d)\r\n",__FILE__,__func__,__LINE__);
    if(size==0)
    {
        printf("%s-%s(%d)\r\n",__FILE__,__func__,__LINE__);
        return 0XFFFFFFFF;//不需要分配
    }
    printf("%s-%s(%d)\r\n",__FILE__,__func__,__LINE__);
    nmemb=size/memblksize[memx];      //获取需要分配的连续内存块数
    printf("%s-%s(%d):nmemb=%d\r\n",__FILE__,__func__,__LINE__,nmemb);
    if(size%memblksize[memx])
        nmemb++;  
    printf("%s-%s(%d):nmemb=%d\r\n",__FILE__,__func__,__LINE__,nmemb);

    printf("%s-%s(%d):mallco_dev.memmap[memx][0]=0x%x\r\n",__FILE__,__func__,__LINE__,mallco_dev.memmap[memx][0]);
    printf("%s-%s(%d):mallco_dev.memmap[memx][0]=0x%x\r\n",__FILE__,__func__,__LINE__,&(mallco_dev.memmap[memx][0]));
    printf("%s-%s(%d):mallco_dev.memmap[memx][1]=0x%x\r\n",__FILE__,__func__,__LINE__,mallco_dev.memmap[memx][1]);
    printf("%s-%s(%d):mallco_dev.memmap[memx][1]=0x%x\r\n",__FILE__,__func__,__LINE__,&(mallco_dev.memmap[memx][1]));
    printf("%s-%s(%d):memtblsize[memx]=%d\r\n",__FILE__,__func__,__LINE__,memtblsize[memx]);
    printf("%s-%s(%d):mallco_dev.memmap[memx][memtblsize[memx]-1]=0x%x\r\n",__FILE__,__func__,__LINE__,mallco_dev.memmap[memx][memtblsize[memx]-1]);
    printf("%s-%s(%d):mallco_dev.memmap[memx][memtblsize[memx]-1]=0x%x\r\n",__FILE__,__func__,__LINE__,&mallco_dev.memmap[memx][memtblsize[memx]-1]);

    //for(offset=memtblsize[memx]-1;offset>=0;offset--)//搜索整个内存控制区  
    for(offset=memtblsize[memx];offset>0;offset--)//搜索整个内存控制区  
    {     
        //printf("%s-%s(%d)ffset=%d\r\n",__FILE__,__func__,__LINE__,offset);
        if(!mallco_dev.memmap[memx][offset])
            cmemb++;//连续空内存块数增加
        else
            cmemb=0;                    //连续内存块清零
        if(cmemb==nmemb)        //找到了连续nmemb个空内存块
        {
            for(i=0;i<nmemb;i++)                      //标注内存块非空
            {  
                mallco_dev.memmap[memx][offset+i]=nmemb;  
            }  
            return (offset*memblksize[memx]);//返回偏移地址  
        }
    }  
    printf("%s-%s(%d)\r\n",__FILE__,__func__,__LINE__);
    return 0XFFFFFFFF;//未找到符合分配条件的内存块  
}  





>ex ram malloc test...
..\..\lib\MALLOC\malloc.c-mem_malloc(87)memx=1
..\..\lib\MALLOC\malloc.c-mem_malloc(88)size=614400
..\..\lib\MALLOC\malloc.c-mem_malloc(91)
..\..\lib\MALLOC\malloc.c-mem_malloc(97)
..\..\lib\MALLOC\malloc.c-mem_malloc(99):nmemb=19200
..\..\lib\MALLOC\malloc.c-mem_malloc(102):nmemb=19200
..\..\lib\MALLOC\malloc.c-mem_malloc(104):mallco_dev.memmap[memx][0]=0xc8
..\..\lib\MALLOC\malloc.c-mem_malloc(105):mallco_dev.memmap[memx][0]=0x680c8000
..\..\lib\MALLOC\malloc.c-mem_malloc(106):mallco_dev.memmap[memx][1]=0x0
..\..\lib\MALLOC\malloc.c-mem_malloc(107):mallco_dev.memmap[memx][1]=0x680c8002
..\..\lib\MALLOC\malloc.c-mem_malloc(108):memtblsize[memx]=25600
..\..\lib\MALLOC\malloc.c-mem_malloc(109):mallco_dev.memmap[memx][memtblsize[memx]-1]=0x0
..\..\lib\MALLOC\malloc.c-mem_malloc(110):mallco_dev.memmap[memx][memtblsize[memx]-1]=0x680d47fe
..\..\lib\MALLOC\malloc.c-mem_malloc(128)
..\..\lib\MALLOC\malloc.c-mymalloc(173)offset=0xffffffff







回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-29 10:44:10 | 显示全部楼层
回复【3楼】busdriver:
---------------------------------
不会的,内存池的数据,内存分配的时候,不关心。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-4 20:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表