OpenEdv-开源电子网

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

关于正点原子开发板实验38,内存管理实验

[复制链接]

15

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-9-24
在线时间
0 小时
发表于 2013-9-25 16:12:07 | 显示全部楼层 |阅读模式
//内存管理初始化 
//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 
}

 mymemset(mallco_dev.memmap[memx], 0,memtblsize[memx]*2);//内存状态表数据清零 
为什么第三个参数要X2呢?????
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2022-1-13
在线时间
8 小时
发表于 2022-2-13 01:18:58 | 显示全部楼层
我大概说一下自己的理解,有不对的地方还请原子哥和各位大神指正
const u32 memtblsize[SRAMBANK]={MEM1_ALLOC_TABLE_SIZE, MEM2_ALLOC_TABLE_SIZE, MEM3_ALLOC_TABLE_SIZE};        //内存表大小

u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE];       
这个表是u16,也就是说在内存空间中开辟了MEM1_ALLOC_TABLE_SIZE*2个8位的内存空间(内存空间的最小单位是字节,8位)。
现在要把这个表清零,每次只能清除一个8位的内存单元
所以,下面这行语句要乘2。
mymemset(mallco_dev.memmap[memx], 0,memtblsize[memx]*2);//内存状态表数据清零 。

至于后面楼主提出的把这里的u8改为u16的问题(u8 *xs = s;)  
只是扩大了只能能够表示地址的范围(实际上没有意义,u8已经足够表示地址),并不能使其一次清除16位的内存 。

因此原子哥回复的是改了后并不能去掉*2
回复 支持 1 反对 0

使用道具 举报

15

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-9-24
在线时间
0 小时
 楼主| 发表于 2013-9-25 16:27:38 | 显示全部楼层
已解决,谢谢,
回复 支持 反对

使用道具 举报

17

主题

293

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2012-12-26
在线时间
1 小时
发表于 2013-10-21 21:35:05 | 显示全部楼层
回复【2楼】354213709:
---------------------------------
为什么啊 我也没看明白
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-10-21 22:18:50 | 显示全部楼层
回复【3楼】kassandra:
---------------------------------
因为这个表是u16的数组。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

17

主题

293

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2012-12-26
在线时间
1 小时
发表于 2013-10-22 11:30:51 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
哦 

void mymemset(void *s,u8 c,u32 count)  
{  
    u8 *xs = s;  
    while(count--)*xs++=c;  


把这个u8改成u16 
 mymemset(mallco_dev.memmap[memx], 0,memtblsize[memx]*2);//内存状态表数据清零  
第三个参数就不用X2了吧
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-10-22 16:00:49 | 显示全部楼层
回复【5楼】kassandra:
---------------------------------
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

17

主题

293

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2012-12-26
在线时间
1 小时
发表于 2013-10-23 10:26:57 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
怎么还要X2 
u16 *xs 就表示对象是16位的了,xs++就指向下一个16位的对象了。。还要X2?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-10-23 10:41:06 | 显示全部楼层
回复【7楼】kassandra:
---------------------------------
自己好好理解这个函数:
void mymemset(void *s,u8 c,u32 count)   
{   
    u8 *xs = s;   
    while(count--)*xs++=c;   
}  

其他的不解释了,不懂问你们c语言老师去。
2行代码,仔细读读,仔细想想。

答案是肯定要乘以2的,实在不懂,自己软件仿真,写个小代码测试吧,从实践中找答案。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

17

主题

293

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2012-12-26
在线时间
1 小时
发表于 2013-10-23 10:50:11 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
好吧。谢谢原子哥
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2013-12-12 02:10:31 | 显示全部楼层
void mymemset(void *s,u8 c,u32 count) 
假设count是5,就是把c填充到以s指针起始的连续5个指针空间里;不知对不对?
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2013-12-12 02:11:47 | 显示全部楼层
也就是说以s指针为起始地址的连续5个指针空间里存放的都是c数据
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-20 13:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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