OpenEdv-开源电子网

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

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

[复制链接]

11

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2018-11-9
在线时间
61 小时
发表于 2019-1-6 19:58:18 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 斩柴人 于 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]

最佳答案

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

因为这里是对整个内存管理表清零,u8全部清零,换成u16,也是0,换成u32,还是0.。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-1-6 19:58:19 | 显示全部楼层
因为这里是对整个内存管理表清零,u8全部清零,换成u16,也是0,换成u32,还是0.。。
回复

使用道具 举报

11

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2018-11-9
在线时间
61 小时
 楼主| 发表于 2019-1-6 22:48:12 | 显示全部楼层
怎么了,没有人知道吗?
回复

使用道具 举报

11

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2018-11-9
在线时间
61 小时
 楼主| 发表于 2019-1-7 08:52:26 | 显示全部楼层
正点原子 发表于 2019-1-6 19:58
因为这里是对整个内存管理表清零,u8全部清零,换成u16,也是0,换成u32,还是0.。。

我不觉得这是最佳答案,还是没有解决这个疑问的核心。
回复

使用道具 举报

14

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2443
金钱
2443
注册时间
2017-9-13
在线时间
559 小时
发表于 2019-1-7 10:23:13 | 显示全部楼层
多看看C语言吧,很基本的问题
回复

使用道具 举报

11

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2018-11-9
在线时间
61 小时
 楼主| 发表于 2019-1-7 12:54:37 | 显示全部楼层
HCHDaLeiGe 发表于 2019-1-7 10:23
多看看C语言吧,很基本的问题

你这样说根本一点意义都没有。你知道C语言有多庞大吗,你如果真的是知道上面的理解错在哪里,直接说出来就那么难?
回复

使用道具 举报

14

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2443
金钱
2443
注册时间
2017-9-13
在线时间
559 小时
发表于 2019-1-7 13:03:07 | 显示全部楼层
做人虚心点,我不知道还会有人这样理解
回复

使用道具 举报

11

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2018-11-9
在线时间
61 小时
 楼主| 发表于 2019-1-7 15:47:10 | 显示全部楼层
HCHDaLeiGe 发表于 2019-1-7 13:03
做人虚心点,我不知道还会有人这样理解

这和虚心有什么关系?不理解一个东西,拿出来提问就不虚心了?
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2019-5-21
在线时间
5 小时
发表于 2019-5-21 12:31:05 | 显示全部楼层
memmap,是16位的,mymemset,设置是针对8位的,那么1个16位的数据是不是2个8位组成的啊?!
回复

使用道具 举报

11

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2018-11-9
在线时间
61 小时
 楼主| 发表于 2019-5-21 20:18:59 | 显示全部楼层
songpei 发表于 2019-5-21 12:31
memmap,是16位的,mymemset,设置是针对8位的,那么1个16位的数据是不是2个8位组成的啊?!

其实就是指针转换的问题。一个个讲得都不着边际
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-10 13:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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