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

[复制链接]
3344|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 | 显示全部楼层

汇编还有会不会一说吗

只要会搞音片机,汇编花个半天时间就可搞明白了。
machunshui 发表于 2009-5-15 09:54 | 显示全部楼层

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

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

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

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

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

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

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

3.全局变量被不同的线程使用.
machunshui 发表于 2009-5-15 10:02 | 显示全部楼层

使用volatile之后

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

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

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

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

这就是volatile的作用
 楼主| ccjchen 发表于 2009-5-15 17:40 | 显示全部楼层

谢谢machunshui!

总算懂点了
McuIsp 发表于 2009-5-15 17:59 | 显示全部楼层

局部变量也可以volatile

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

本版积分规则

175

主题

446

帖子

1

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