本帖最后由 斩柴人 于 2019-1-6 20:00 编辑
内存管理实验的my_mem_init( )函数一直是不太好理解的,在我发这个贴子之前已经有好多人在论坛上发帖问过了。比如这些:
stm32F103xx,内存管理malloc.c文件中设置内存mymemset()函数问题。
内存管理的疑问?内存管理表初始化的时候,为什么要乘以2???。
分配内存求解。但是帖子里面的回复也是解释得非常的隐晦(或者说似懂非懂)。而之前发帖子的楼主门看起来也不像懂了的样子。
实际上这个疑问的核心就是,初始化内存管理表的时候,传进mymemset( )函数的16位地址被转换成了u8类型的地址,这样一来,地址不就错了吗?
还有
mymemset(mallco_dev.memmap[memx], 0,memtblsize[memx]*2);//内存状态表数据清零
不就从错位的地址开始写入了memtblsize[memx]*2个8bit的数了吗?
上面的理解肯定是错的,但是错在哪里呢?一直想不通。
[mw_shl_code=c,true]struct _m_mallco_dev
{
void (*init)(u8); //初始化
u8 (*perused)(u8); //内存使用率
u8 *membase[SRAMBANK]; //内存池 管理SRAMBANK个区域的内存
u16 *memmap[SRAMBANK]; //内存管理状态表
u8 memrdy[SRAMBANK]; //内存管理是否就绪
};
//内存管理控制器
struct _m_mallco_dev mallco_dev=
{
my_mem_init, //内存初始化
my_mem_perused, //内存使用率
mem1base,mem2base,mem3base, //内存池
mem1mapbase,mem2mapbase,mem3mapbase,//内存管理状态表
0,0,0, //内存管理未就绪
};
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)));
//设置内存
//*s:内存首地址
//c :要设置的值
//count:需要设置的内存大小(字节为单位)
void mymemset(void *s,u8 c,u32 count)
{
u8 *xs = s;
while(count--)*xs++=c;
}
//内存管理初始化
//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]
你这样说根本一点意义都没有。你知道C语言有多庞大吗,你如果真的是知道上面的理解错在哪里,直接说出来就那么难?
一周热门 更多>