关于volatile变量的问题

[复制链接]
2749|11
 楼主| 南宫云明 发表于 2013-11-13 10:54 | 显示全部楼层 |阅读模式
有时候写延时程序发现逻辑上没问题,但是就是运行结果不一致,最后就是可能是volatile这个关键字的问题,不知道大家对于这个关键字是怎么用的,那些编译器需要这个关键字,或者哪些变量需要这个关键字,更或者干脆所有变量都加上这个关键字好还是怎么样?

因为这个问题出现了好几次,困扰了很久,有没有大神帮忙解答一下?
ayb_ice 发表于 2013-11-13 11:34 | 显示全部楼层
禁止编译器优化
delin17 发表于 2013-11-13 12:25 | 显示全部楼层
易失。。
会被外部条件修改。
中断与程序同时使用的变量,一定要加上,
zhoukes 发表于 2013-11-13 14:02 | 显示全部楼层
1,中断里会用到的全局变量
2,对硬件寄存器的访问
3,多任务系统里几个任务都要用到的全局变量(本质原因同1)
香水城主 发表于 2013-11-13 14:45 | 显示全部楼层
程序运行过程中,每次遇到带有volatile的变量,都要到内存中去取数据,不能使用任何缓存的数据。

比如这个语句:while (ready==0);
如果没有说明ready这个变量是volatile,这句话要么可能被编译器优化掉,要么可能只能执行一次,要么可能永远满足不了,成为死循环。
白日梦啊 发表于 2013-11-13 16:57 | 显示全部楼层
我这两天也在看,给你个例子
XBYTE[2]=0x55;
XBYTE[2]=0x56;
XBYTE[2]=0x57;
XBYTE[2]=0x58;
如果键入volatile,则编译器会逐一的进行编译并产生相应的机器代码(四条)
如果没有volatile的话,只认为XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)
我自己现在也是云里雾里!只是供楼主参考
yewuyi 发表于 2013-11-13 17:14 | 显示全部楼层
volatile:易变,用这个关键字告诉编译器,使用它的时候,必须到变量存储地址取变量数值,例如有一个变量定义为volatile,这个变量在函数中多次参与某一个数**算,C编译器可能会弄一个中间变量来暂存,再使用这个中间变量参与运算,当另一段代码使用这个变量时,编译器会直接从变量地址取数,而不会从中间变量获得数值。

如果在该加的时候没有加这个关键字,则很容易形成临界代码,但如果把所有变量都加上,则可能导致编译后代码量加大,书写复杂,代码执行速度降低等等,而且有一些变量则应该定义为static

评分

参与人数 1威望 +1 收起 理由
南宫云明 + 1 很给力!

查看全部评分

zjxcml 发表于 2013-11-13 22:48 | 显示全部楼层
呵呵,大家说的都很清楚了
江枫渔火 发表于 2013-11-14 09:20 | 显示全部楼层
把你用来while的那个变量加上就可以了
ayb_ice 发表于 2013-11-14 09:56 | 显示全部楼层
早说了
禁止编译器优化
chenyu988 发表于 2013-11-14 11:35 | 显示全部楼层
建议看看《C语言深度解析》
 楼主| 南宫云明 发表于 2013-11-14 11:41 | 显示全部楼层
感谢各位的回答!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

272

帖子

0

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