打印

关于volatile变量的问题

[复制链接]
2099|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)

使用特权

评论回复
5
香水城主| | 2013-11-13 14:45 | 只看该作者
程序运行过程中,每次遇到带有volatile的变量,都要到内存中去取数据,不能使用任何缓存的数据。

比如这个语句:while (ready==0);
如果没有说明ready这个变量是volatile,这句话要么可能被编译器优化掉,要么可能只能执行一次,要么可能永远满足不了,成为死循环。

使用特权

评论回复
6
白日梦啊| | 2013-11-13 16:57 | 只看该作者
我这两天也在看,给你个例子
XBYTE[2]=0x55;
XBYTE[2]=0x56;
XBYTE[2]=0x57;
XBYTE[2]=0x58;
如果键入volatile,则编译器会逐一的进行编译并产生相应的机器代码(四条)
如果没有volatile的话,只认为XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)
我自己现在也是云里雾里!只是供楼主参考

使用特权

评论回复
7
yewuyi| | 2013-11-13 17:14 | 只看该作者
volatile:易变,用这个关键字告诉编译器,使用它的时候,必须到变量存储地址取变量数值,例如有一个变量定义为volatile,这个变量在函数中多次参与某一个数**算,C编译器可能会弄一个中间变量来暂存,再使用这个中间变量参与运算,当另一段代码使用这个变量时,编译器会直接从变量地址取数,而不会从中间变量获得数值。

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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
南宫云明 + 1 很给力!
8
zjxcml| | 2013-11-13 22:48 | 只看该作者
呵呵,大家说的都很清楚了

使用特权

评论回复
9
江枫渔火| | 2013-11-14 09:20 | 只看该作者
把你用来while的那个变量加上就可以了

使用特权

评论回复
10
ayb_ice| | 2013-11-14 09:56 | 只看该作者
早说了
禁止编译器优化

使用特权

评论回复
11
chenyu988| | 2013-11-14 11:35 | 只看该作者
建议看看《C语言深度解析》

使用特权

评论回复
12
南宫云明|  楼主 | 2013-11-14 11:41 | 只看该作者
感谢各位的回答!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

272

帖子

0

粉丝