打印

C语言中的volatile是什么意思?哪位大侠能指点一下?

[复制链接]
2634|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ccjchen|  楼主 | 2009-5-15 09:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在书上看到说“volatile关键字用来定义一个变量,保证该变量不被优化器优化。”
可是我还是有点看不懂,比如下面一个例子,循环等待直到地址0XFF被读取。
unsigned int *ctrl;
while(*ctrl !=0XFF);
在此例中,*ctrl是一个循环变量表达式,因此循环被优化成单一的内存读取。为了纠正这一点,必须用以下方式说明。
volatile unsigned int *ctrl
此时,*ctrl指针表示指向一个硬件地址,例如中断标志等。

上面这个例子是书上的例子,但我没有看懂,请各位高手给指点一下!

相关帖子

沙发
HWM| | 2009-5-15 09:28 | 只看该作者

就是可能被“第三者插足”——改变内容的意思。

此类变量,编译一般拿不定其性子,所以不敢冒然行事。

使用特权

评论回复
板凳
chunk| | 2009-5-15 09:41 | 只看该作者

所有的C编译器都允许把C源码编译成汇编源码输出

怎么就没有人重视呢?

你加上VOLATILE,去掉VOLATILE,打开C编译器优化选项,关闭C编译器优化选项,4次编译都输出汇编源代码,然后比较4个汇编源码的差异,总会有所心得的。这个东西让我们靠嘴说说到你满意?

不会这个CPU的汇编语言??你会哪个CPU的汇编语言?在那个CPU上试验。

使用特权

评论回复
地板
耕在此行| | 2009-5-15 09:48 | 只看该作者

汇编还有会不会一说吗

只要会搞音片机,汇编花个半天时间就可搞明白了。

使用特权

评论回复
5
machunshui| | 2009-5-15 09:54 | 只看该作者

能明确volatile的含义,是编写嵌入式程序的必要条件

能明确volatile的含义,是编写嵌入式程序的必要条件啊.

volatile英文意思是:易变的, 反复无常的,易挥发的.

用在变量前面来告诉编译器,此变量是"易变的".

所谓"易变的"变量,实际上是3种情况下的全局变量:

1.全局变量是地址映射的外部输入寄存器,

2.全局变量被中断处理程序和用户程序其他部分使用.

3.全局变量被不同的线程使用.

使用特权

评论回复
6
machunshui| | 2009-5-15 10:02 | 只看该作者

使用volatile之后

使用volatile之后,
被volatile修饰的变量,
编译器编译的时候,每次使用这样的变量,就会直接到该变量的地址出,取变量值.

如果普通变量,
编译器有可能会上次运算的时候,
缓存该变量的值到mcu通用的寄存器,这样速度比较快.

但是由于易变的的变量,
可能在中断服务程序,
其他线程,
或者是外部输入寄存器被外部输入改变,

所以,不能进行寄存器缓存优化!

这就是volatile的作用

使用特权

评论回复
7
ccjchen|  楼主 | 2009-5-15 17:40 | 只看该作者

谢谢machunshui!

总算懂点了

使用特权

评论回复
8
McuIsp| | 2009-5-15 17:59 | 只看该作者

局部变量也可以volatile

使用特权

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

本版积分规则

175

主题

446

帖子

1

粉丝