初级会员

- 积分
- 71
- 金钱
- 71
- 注册时间
- 2013-1-15
- 在线时间
- 6 小时
|
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_ ...
|