OpenEdv-开源电子网

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

内存管理表空间非0

[复制链接]

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2013-1-15
在线时间
6 小时
发表于 2014-7-29 08:25:53 | 显示全部楼层 |阅读模式
5金钱
原子:内层管理实验,外接内存每个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


最佳答案

查看完整内容[请看2#楼]

我们的内存管理表,是在内存池之后的,所以你这个内存池里面的4K开始位置非零,是没有影响的才对。 内存分配是去内存管理表里面查。而不是在内存池里面查。 代码如下: [mw_shl_code=c,true]//内存池(4字节对齐) __align(4) u8 mem1base[MEM1_MAX_SIZE]; //内部SRAM内存池 __align(4) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000))); //外部SRAM内存池 //内存管理表 u16 mem1mapbase[MEM1_ ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-29 08:25:54 | 显示全部楼层
我们的内存管理表,是在内存池之后的,所以你这个内存池里面的4K开始位置非零,是没有影响的才对。
内存分配是去内存管理表里面查。而不是在内存池里面查。
代码如下:
[mw_shl_code=c,true]//内存池(4字节对齐) __align(4) u8 mem1base[MEM1_MAX_SIZE]; //内部SRAM内存池 __align(4) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000))); //外部SRAM内存池 //内存管理表 u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; //内部SRAM内存池MAP u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000+MEM2_MAX_SIZE))); //外部SRAM内存池MAP //内存管理参数 const u32 memtblsize[2]={MEM1_ALLOC_TABLE_SIZE,MEM2_ALLOC_TABLE_SIZE}; //内存表大小 const u32 memblksize[2]={MEM1_BLOCK_SIZE,MEM2_BLOCK_SIZE}; //内存分块大小 const u32 memsize[2]={MEM1_MAX_SIZE,MEM2_MAX_SIZE}; //内存总大小 [/mw_shl_code]
重点是这句: [mw_shl_code=c,true]u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000+MEM2_MAX_SIZE))); //外部SRAM内存池MAP[/mw_shl_code]
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2013-1-15
在线时间
6 小时
 楼主| 发表于 2014-7-29 14:52:18 | 显示全部楼层
内存池地址是0x68000000-0x680C7FFF,一个800K空间,从0x680C8000开始,就是内存管理表空间了,关键是这个空间里面4K开始的位置非0。
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2013-1-15
在线时间
6 小时
 楼主| 发表于 2014-7-29 14:53:57 | 显示全部楼层
比如图片里面的地址0x680C8000内容是C8,地址0x680C9000的内容是C9,内存管理表空间就是从0x680C8000地址开始的。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-29 15:48:25 | 显示全部楼层
那就是你代码有问题了.
[mw_shl_code=c,true]//内存管理初始化 //memx:所属内存块 void my_mem_init(u8 memx) { mymemset(mallco_dev.memmap[memx], 0,memtblsize[memx]*2);//内存状态表数据清零 mymemset(mallco_dev.membase[memx], 0,memsize[memx]); //内存池所有数据清零 mallco_dev.memrdy[memx]=1; //内存管理初始化OK } [/mw_shl_code]
内存初始化的时候,我们有把内存池和内存管理表,都清零的.
清零后不可能还有值才对.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2013-1-15
在线时间
6 小时
 楼主| 发表于 2014-7-29 22:19:04 | 显示全部楼层
main()函数里面清零了,但是每4K地址开始设为offset地址了
   mem_init(SRAMIN); //初始化内部内存池
  mem_init(SRAMEX); //初始化内部内存池
最后增加一句
   mallco_dev.init(SRAMEX);//未初始化,先执行初始化
外部RAM test才成功了!
exram malloc test...
malloc succeed ptr_exram=0x68032000
ex ram free test...
free succeed ptr_exram=0x68032000
exram free succeed
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-30 00:19:06 | 显示全部楼层
回复【6楼】busdriver:
---------------------------------
那就奇怪了,我们的例程是可以直接测试的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-4 16:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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