注册 登录
查看: 380|回复: 12

关键词:volatile

[复制链接]
发表于 2014-11-19 21:43:46 | 显示全部楼层 |阅读模式
本帖最后由 板正的 于 2014-11-19 21:45 编辑

为什么PORT_MemMapPtr的定义使用volatile来修饰:不使用可以么?求山外大哥指点一下,书上没看懂。。。

ps:说错啦  望各位明白的同学指教一下
回复

使用道具 举报

发表于 2014-11-19 21:57:48 | 显示全部楼层
书本上有说吧,就port 和 gpio的 寄存器内存分布那部分。
回复 支持 反对

使用道具 举报

发表于 2014-11-19 23:35:16 | 显示全部楼层
这个,书上明明确确写得很清楚的,看port那部分内容吧。是专门有这个的说明,很容易找到。
回复 支持 反对

使用道具 举报

发表于 2014-11-20 00:01:02 | 显示全部楼层
楼上两位,楼主说了是看不懂书上说的。

书本 P88 有讲,不过不知道楼主看不懂什么内容,我也不好回答啊。

不过书上明明说了不可以省略volatile!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-20 11:39:24 | 显示全部楼层
东阳霁 发表于 2014-11-20 00:01
楼上两位,楼主说了是看不懂书上说的。

书本 P88 有讲,不过不知道楼主看不懂什么内容,我也不好回答啊 ...

嗯嗯   是88页上的。例程中说如果不加volatile会导致编译器忽略第一次写入的指令,我觉着两次写入之间并没有读取该地址的数据,那么第一次赋值有什么意义么?如果没有意义的话是不是可以把第一次的赋值去掉呢?没有了第一次赋值还需要用volatile声明么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-20 12:18:51 | 显示全部楼层
仰逸致 发表于 2014-11-19 23:35
这个,书上明明确确写得很清楚的,看port那部分内容吧。是专门有这个的说明,很容易找到。

恩恩 是看到这一部分了,感觉还是不明白。例程中说如果不加volatile会导致编译器忽略第一次写入的指令,我觉着两次写入之间并没有读取该地址的数据,那么第一次赋值有什么意义么?如果没有意义的话是不是可以把第一次的赋值去掉呢?没有了第一次赋值还需要用volatile声明么?
回复 支持 反对

使用道具 举报

发表于 2014-11-20 12:22:38 | 显示全部楼层
板正的 发表于 2014-11-20 12:18
恩恩 是看到这一部分了,感觉还是不明白。例程中说如果不加volatile会导致编译器忽略第一次写入的指令, ...

书上举了个例子啊。
IO口,假如是模拟输出PWM,那么就会不停地写入,假如优化了,就变成一条直线,而不是PWM。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-20 12:33:29 | 显示全部楼层
本帖最后由 板正的 于 2014-11-20 12:34 编辑
仰逸致 发表于 2014-11-20 12:22
书上举了个例子啊。
IO口,假如是模拟输出PWM,那么就会不停地写入,假如优化了,就变成一条直线,而不 ...

没有用volatile声明时,编译器会忽略第一次写入的指令,如果在第一次写入指令后(未声明),加一个延时,再写第二个指令,那么第一个指令就不会被忽略了吧。
比如
  1. PTA14=1;//PTA14没用volatile声明
  2. delay;
  3. PTA14=0;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-20 12:35:34 | 显示全部楼层
板正的 发表于 2014-11-20 12:33
没有用volatile声明时,编译器会忽略第一次写入的指令,如果在第一次写入指令后(未声明),加一个延时, ...

这时的灯应该是闪一下吧,说明第一次写入指令没有被编译器忽略吧
回复 支持 反对

使用道具 举报

发表于 2014-11-20 12:42:26 | 显示全部楼层
板正的 发表于 1416458134
这时的灯应该是闪一下吧,说明第一次写入指令没有被编译器忽略吧
你没开优化模式吧,我们的例程,默认debug模式是不开优化的。
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-20 12:48:25 | 显示全部楼层
山外メ雲ジ 发表于 2014-11-20 12:42
你没开优化模式吧,我们的例程,默认debug模式是不开优化的。

优化模式?您的意思是说如果开了优化模式的话PTA14=1这句指令就会被优化掉而如果用volatile声明一下的话就不会被优化掉对吗?
回复 支持 反对

使用道具 举报

发表于 2014-11-20 12:49:46 | 显示全部楼层
板正的 发表于 1416458905
优化模式?您的意思是说如果开了优化模式的话PTA14=1这句指令就会被优化掉而如果用volatile声明一下的话就不会被优化掉对吗?
是的。编程的时候,要考虑各种情况,不能说你现在的工程设置没开优化,就不加也行。

例如看看这个帖子:
脱裤子放屁的代码解析: 0 | 用法 - 智能车资料区 - 山外论坛 http://www.vcan123.com/forum.php?mod=viewthread&tid=6477
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-20 12:54:19 | 显示全部楼层
山外メ雲ジ 发表于 2014-11-20 12:49
是的。编程的时候,要考虑各种情况,不能说你现在的工程设置没开优化,就不加也行。

例如看看这个帖子: ...

哦哦   恩恩  以前都不知道这么回事呢  谢谢啦
回复 支持 反对

使用道具 举报

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

本版积分规则

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