关于探索者F4开发板的内存管理实验my_mem_init( )的疑问

2019-07-20 01:47发布

本帖最后由 斩柴人 于 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]

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。