发新帖我要提问
12
返回列表
打印

C的关键字volatile有一条没有理解,请教

[复制链接]
楼主: misra
手机看帖
扫描二维码
随时随地手机跟帖
21
ayb_ice| | 2012-8-1 13:57 | 只看该作者 回帖奖励 |倒序浏览
中断中使用了外部的变量,而且const修饰了的,如果不加volatile修饰,编译器自然不用多次加载这个变量的值,因为它认为是不会改变的,但这又是个外部变量,外部怎么控制这个变量你我都不知道,编译器更不可能知道(即使知道也可能是错的),别看是常变量,实际情况是可能很多地方都可能改变它的值,那么加volatile表示它很容易变化,而且你不知道规律,每次使用这个值,都必须老实的重新加载,这恰恰符合某些实际情况(特别符合有些代码是别人写的,没有源代码,只能是库,可能是汇编,别人需要保密的情况)

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
yiucing + 1
22
yiucing| | 2012-8-1 13:58 | 只看该作者
尽管你的话我理解,用大白话来说,就是编译器 处理有些数据 是放到了寄存器 有些是放固定内存。你的意思是用了volatile就放固定内存。
misra 发表于 2012-7-31 09:05

我怎么感觉全局变量和局部静态变量用没有volatile都是放在固定内存中呢。。

使用特权

评论回复
23
ayb_ice| | 2012-8-1 14:35 | 只看该作者
中断中的局部变量只在中断在使用,什么时候改变,可能改变编译器是能分析出来的,但中断中的外部变量,情况就不同了,尽管也能分析,但很可能分析是错的(因为是外部控制的,而且定义和声明可以不一致的,比如定义时不加const,而声明时使用const,还可以类型都不一致的(汇编定义,C声明)等),所以加volatile修饰,告诉编译器不要分析,优化,直接使用最可靠的方法,不做任何优化。。。

这和变量放在哪里没有关系

使用特权

评论回复
24
misra|  楼主 | 2012-8-2 11:14 | 只看该作者
例子!!谁能举个好使的例子

使用特权

评论回复
25
ayb_ice| | 2012-8-2 11:34 | 只看该作者
饭给你煮熟,还巴不得喂你吃

使用特权

评论回复
26
misra|  楼主 | 2012-8-2 12:17 | 只看该作者
饭给你煮熟,还巴不得喂你吃
ayb_ice 发表于 2012-8-2 11:34


大虾  你敢侮辱你YY?

使用特权

评论回复
27
ayb_ice| | 2012-8-2 13:31 | 只看该作者
大虾  你敢侮辱你YY?
misra 发表于 2012-8-2 12:17


林子大了,什么都有

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
misra + 1
28
lyi619| | 2012-8-2 14:22 | 只看该作者
比如说,单片机外部引脚的电平。这就是第二条的一个例子

使用特权

评论回复
29
zqxat2007| | 2012-8-2 15:04 | 只看该作者

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
misra + 1
30
反质子| | 2012-8-2 15:51 | 只看该作者
固执的跟块石头一般

使用特权

评论回复
31
qiujiahongde| | 2012-8-3 08:23 | 只看该作者
前面同学说得很详细了,我帮顶!

使用特权

评论回复
32
hotyong| | 2012-8-3 11:20 | 只看该作者
10楼说得很详细了。。
其实第2点与第3点其实也是一样的。
如果你懂第3点的话,你把前台与后台看成是两个任务。。用第3点来看也很容易了。。

使用特权

评论回复
33
misra|  楼主 | 2012-8-3 15:51 | 只看该作者
http://blog.21ic.com/user1/5877/archives/2012/91360.html

这个貌似是解释
zqxat2007 发表于 2012-8-2 15:04


多谢各位,有时间好好看看 keil的说明。本来还以为keil没有说明呢。

看样子很有可能 这三条说了一个意思,只是场合不同而已。

使用特权

评论回复
34
P0.0| | 2012-8-30 13:33 | 只看该作者
1# misra

我认为在Keil uVision 中,加不加volatile都没影响。如:
include<reg52.h>
sbit LED=P3^3;
volatile unsigned char a;
// unsigned char a;
void main()
{



TMOD=0X01;
   


TH0=75;
      


TL0=255;
   


EA=1;
   


ET0=1;
   


TR0=1;
  


a=0;


while(!a)


{


//...




}


LED=0;


while(1);

}



void time0 () interrupt 1
{

TH0=75;


TL0=255;


a=1;



}
//加不加volatile           LED都能被点亮,已试过。

使用特权

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

本版积分规则