20120903请举例 volatile 非用不可的几个情况

[复制链接]
2998|13
 楼主| 谈的元 发表于 2012-9-3 08:32 | 显示全部楼层 |阅读模式
20120903

请具体举例 volatile 非用不可的几个情况,不用的volatile可能问题,

最好说明单片机类型,有代码说明最好

不要再解释volatile的含义,不要贴出网络上有的解释

例子多多为善。
infion_123 发表于 2012-9-3 09:04 | 显示全部楼层
顶一个。。。
yewuyi 发表于 2012-9-3 09:47 | 显示全部楼层
没有这样的例子。
AppBaby 发表于 2012-9-3 11:25 | 显示全部楼层
属于共享变量,而编译器不知道的.

比如,IO输入状态寄存器. 如果不加声明,在编译器看来,它只属于一个普通的RAM; 而实际上这个RAM是与外部事件共享的(外部电压改变).
 楼主| 谈的元 发表于 2012-9-3 19:22 | 显示全部楼层
本帖最后由 谈的元 于 2012-9-3 19:25 编辑

请继续,


等例子说明,


不然怎么能应用自如,


不然怎么能看出代码问题?
 楼主| 谈的元 发表于 2012-9-4 23:08 | 显示全部楼层
再顶一下
HWM 发表于 2012-9-4 23:19 | 显示全部楼层
volatile 是针对“代码优化”的,即告诉编译系统“此变量可能自变,注意其优化处理”。

如果完全不考虑优化,则不用volatile也无妨。
 楼主| 谈的元 发表于 2012-9-5 22:09 | 显示全部楼层
在特定的应用中必须要用volatile,现在就等大家举应用的事例了
ahgao 发表于 2012-9-5 22:34 | 显示全部楼层
会在中断中被修改的全局变量,裸奔时最常见。
多线程共享的全局变量。
asthathat321 发表于 2012-9-6 00:11 | 显示全部楼层
很好的東西 非常不錯
optical85 发表于 2012-9-6 10:18 | 显示全部楼层
本帖最后由 optical85 于 2012-9-6 10:21 编辑

比如程序将某寄存器可以用作发送数据寄存器(比如UART、I2C的数据发送寄存器TXBUF)。分两次由两个变量a和b分别赋值给这个寄存器TXBUF:{TXBUF = a;TXBUF = b;},每次把数据发送给外部(比如PC或者I2C器件),并且该状态寄存器在程序其他地方没有被赋值。如果不加volatile并且开启了优化,那么编译器可能会默认你的寄存器TXBUF的值只需要被赋值一次。在这种情况下,编译器可能会把你第一次a赋值给寄存器TXBUF的指令a=TXBUF;去除。你在接收端就只能接收到b的数据,而a的数据已经被编译器优化删掉了。
当然不同编译器,指令集不一样,优化处理的方式方法也有差异。并且同一个编译器也有不同的优化级别选项。可能你选低级别的优化选项,上述问题就可以避免。
 楼主| 谈的元 发表于 2012-9-7 22:06 | 显示全部楼层
11楼说了 一个 例子不错,

再等其他的 实例。

相信经过几个实例的说明,理解会更深刻。
21mk 发表于 2013-4-22 10:30 | 显示全部楼层
这个的话就是前后的一种比较吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

98

主题

3872

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部