内存管理的疑问?内存管理表初始化的时候,为什么要乘以2???

2019-07-21 06:00发布

//内存管理表
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}; //内存表大小 0---1279,0---6143
const u32 memblksize[2]={MEM1_BLOCK_SIZE,MEM2_BLOCK_SIZE}; //内存分块大小
const u32 memsize[2]={MEM1_MAX_SIZE,MEM2_MAX_SIZE}; //内存总大小

//设置内存
//*s:内存首地址
//c :要设置的值
//count:需要设置的内存大小(字节为单位)
void mymemset(void *s,u8 c,u32 count)  
{  
    u8 *xs = s;     //这里是隐式转换,把void*转换为u8*
    while(count--)*xs++=c;  
}   
//内存管理初始化  
//memx:所属内存块
void 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  
}
那个memtblsize数组不是32位的吗???还要乘以2,那内存管理表的编号岂不是扩大2倍了???

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
41条回答
ndzhzsdw
1楼-- · 2019-07-24 06:58
请教原子哥,
// 释放内存(外部调用) 
// memx:所属内存块
// ptr:内存首地址 
void myfree(u8 memx, void *ptr)
{
u32 offset;
// 地址为0
if(ptr == NULL) return;
offset = (u32)ptr - (u32)malloc_dev.membase[memx];
mem_free(memx, offset);
}


// 重新分配内存(外部调用)
// memx:所属内存块
// *ptr:旧内存首地址
// size:要分配的内存大小(字节)
// 返回值:新分配到的内存首地址.
void *myrealloc(u8 memx, void *ptr, u32 size)
{
u32 offset;
offset = mem_malloc(memx, size);
if(offset == 0xFFFFFFFF)
return NULL;
else
{
// 拷贝旧内存内容到新内存
mymemcpy((void*)((u32)malloc_dev.membase[memx] + offset), ptr, size);
// 释放旧内存
myfree(memx, ptr);
// 返回新内存首地址
return ((void*)((u32)malloc_dev.membase[memx] + offset));
}
}


myfree函数的偏移地址是offset = (u32)ptr - (u32)malloc_dev.membase[memx];
而myrealloc的偏移地址是(u32)malloc_dev.membase[memx] + offset)
想了好久不知道为啥是这样啊?!
kecai
2楼-- · 2019-07-24 10:03
回复【26楼】ndzhzsdw:
---------------------------------
(u32)malloc_dev.membase[memx] + offset)这个不是偏移地址,是分配新内存后返回的地址,offset才表示偏移地址。
ndzhzsdw
3楼-- · 2019-07-24 15:55
 精彩回答 2  元偷偷看……
YouDream
4楼-- · 2019-07-24 21:16
回复【2楼】正点原子:
---------------------------------
原子兄,探索者内存管理实验中有如下代码对STM32F4内部112K内存块进行管理:
#define MEM1_BLOCK_SIZE  32            //内存块大小为 32 字节
#define MEM1_MAX_SIZE 100*1024     //最大管理内存 100K
#define MEM1_ALLOC_TABLE_SIZE  MEM1_MAX_SIZE/MEM1_BLOCK_SIZE
由上,可以计算出内存管理表的大小是100 * 1024 / 32 = 3200(个),一个内存管理表项用两个字节来存储,则内存管理表占用的总大小是3200 * 2 = 6400(字节) = 6.25K;
我的问题来了,112K - 100K - 6.25K = 5.75K,这剩下的5.75K内存为何没有作管理,还是我的理解哪里有错?请指教~~
正点原子
5楼-- · 2019-07-24 22:51
回复【29楼】YouDream:
---------------------------------
你的全局变量,堆栈,这些都要用内存啊
另外,你剩一点内存还是好的,指不定下次加几行代码,咋办?
YouDream
6楼-- · 2019-07-25 00:51
回复【30楼】正点原子:
---------------------------------
还有一个疑问,
//内存池(32字节对齐)
__align(32) u8 mem1base[MEM1_MAX_SIZE]; //内部SRAM内存池
__align(32) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000))); //外部SRAM内存池
__align(32) u8 mem3base[MEM3_MAX_SIZE] __attribute__((at(0X10000000))); //内部CCM内存池
//内存管理表
u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; //内部SRAM内存池MAP
u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000+MEM2_MAX_SIZE))); //外部SRAM内存池MAP
u16 mem3mapbase[MEM3_ALLOC_TABLE_SIZE] __attribute__((at(0X10000000+MEM3_MAX_SIZE))); //内部CCM内存池MAP
为啥其它两个内存池指定了绝对地址访问,而内部112K内存池就没有指定呢?谢谢~~

一周热门 更多>