OpenEdv-开源电子网

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

大家好,请问在原子例程 内存管理实验中初始化函数为什么管理表要*2

[复制链接]

14

主题

76

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1422
金钱
1422
注册时间
2015-12-22
在线时间
325 小时
发表于 2016-5-24 17:12:51 | 显示全部楼层 |阅读模式
1金钱
大家好,请问在原子例程 内存管理实验中初始化函数为什么管理表要*2

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  
}

最佳答案

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

因为memmap的成员是16位的,MEM1_ALLOC_TABLE_SIZE是成员的个数,乘以2才是字节数。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2016-5-24 17:12:52 | 显示全部楼层
因为memmap的成员是16位的,MEM1_ALLOC_TABLE_SIZE是成员的个数,乘以2才是字节数。
活到老,学到老。
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-5-24 17:27:54 | 显示全部楼层
注意管理表的数据类型
回复

使用道具 举报

14

主题

76

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1422
金钱
1422
注册时间
2015-12-22
在线时间
325 小时
 楼主| 发表于 2016-5-24 18:51:08 | 显示全部楼层
zuozhongkai 发表于 2016-5-24 17:27
注意管理表的数据类型

内存池大小和内存管理表大小都是定义的U32的。为什么内存池初始化不需要*2

//内存管理参数          
const u32 memtblsize[SRAMBANK]={MEM1_ALLOC_TABLE_SIZE,MEM2_ALLOC_TABLE_SIZE,MEM3_ALLOC_TABLE_SIZE};        //内存表大小
const u32 memblksize[SRAMBANK]={MEM1_BLOCK_SIZE,MEM2_BLOCK_SIZE,MEM3_BLOCK_SIZE};


//内存管理初始化  
//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  
}  
回复

使用道具 举报

14

主题

76

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1422
金钱
1422
注册时间
2015-12-22
在线时间
325 小时
 楼主| 发表于 2016-5-25 13:14:14 | 显示全部楼层
zuozhongkai 发表于 2016-5-24 17:27
注意管理表的数据类型

你好,可以帮忙指点下吗,谢谢
回复

使用道具 举报

14

主题

76

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1422
金钱
1422
注册时间
2015-12-22
在线时间
325 小时
 楼主| 发表于 2016-5-25 17:25:10 | 显示全部楼层
//内存管理控制器   函数指针
struct _m_mallco_dev
{
        void (*init)(u8);                                        //初始化
        u8 (*perused)(u8);                                      //内存使用率
        u8         *membase[SRAMBANK];                                //内存池 管理SRAMBANK个区域的内存
        u16 *memmap[SRAMBANK];                                 //内存管理状态表
        u8  memrdy[SRAMBANK];                                 //内存管理是否就绪
};

那内存池定义的是u8类型,在初始化的时候为什么不*4呢?
回复

使用道具 举报

14

主题

76

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1422
金钱
1422
注册时间
2015-12-22
在线时间
325 小时
 楼主| 发表于 2016-5-25 17:25:24 | 显示全部楼层
kingnike 发表于 2016-5-25 15:16
因为memmap的成员是16位的,MEM1_ALLOC_TABLE_SIZE是成员的个数,乘以2才是字节数。

//内存管理控制器   函数指针
struct _m_mallco_dev
{
        void (*init)(u8);                                        //初始化
        u8 (*perused)(u8);                                      //内存使用率
        u8         *membase[SRAMBANK];                                //内存池 管理SRAMBANK个区域的内存
        u16 *memmap[SRAMBANK];                                 //内存管理状态表
        u8  memrdy[SRAMBANK];                                 //内存管理是否就绪
};

那内存池定义的是u8类型,在初始化的时候为什么不*4呢?
回复

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2016-5-25 18:17:40 | 显示全部楼层
loyalboy1111 发表于 2016-5-25 17:25
//内存管理控制器   函数指针
struct _m_mallco_dev
{

为啥要乘4?你看下mymemset这个函数怎么写 的好吗
活到老,学到老。
回复

使用道具 举报

14

主题

76

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1422
金钱
1422
注册时间
2015-12-22
在线时间
325 小时
 楼主| 发表于 2016-5-25 20:29:07 | 显示全部楼层
kingnike 发表于 2016-5-25 18:17
为啥要乘4?你看下mymemset这个函数怎么写 的好吗

恩,确实,没有留意到这个,谢谢指点
回复

使用道具 举报

7

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2015-10-21
在线时间
52 小时
发表于 2017-2-9 18:57:18 | 显示全部楼层
你把 *2去掉看看结果
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-24 12:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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