访问volatile变量 - 来自LLD3

时间:2013-12-14 11:20:55

标签: c volatile

我正在读LDD3,第7章,我得到了这句话:

“... jiffies被内核头文件声明为volatile,因此,只要某些C代码访问它,就会从内存中获取它。”

我不明白...... 任何人都可以让我更清楚吗?如果变量不是易变的,当C代码访问它时会发生什么呢?

我知道volatile告诉proccessor不要对这个变量进行优化..但访问它有什么用呢?

3 个答案:

答案 0 :(得分:3)

volatile告诉编译器该变量可能由于外部条件而改变其值,这不仅仅是因为程序本身的指令(这是正常情况)。如果没有volatile,编译器会认为该变量的值没有改变,因为它没有被程序修改,即使它可以被另一个线程,内核或外部设备修改。

这种错误的假设可能允许错误的优化,其中编译器发出只加载一次值的代码,而不再从原始位置再次读取它。

答案 1 :(得分:1)

让我们比较两个不带和volatile的代码:

int bla;

bla = 0;
delay_ms(10);  // wait loop
printf("%d\n", bla); 

在这种情况下,编译器知道bla的值为0,因此编译器可以直接使用0进行printf参数,甚至无需读取bla printf被称为。{/ p>

volatile int bla;

bla = 0;
delay_ms(10); // wait loop
printf("%d\n", bla); 

在这种情况下,对象是volatile限定的。这意味着在bla被分配到0后,其值可能会突然改变,并且不再保证为0。它强制编译器在调用bla时对printf进行新的评估。

添加volatile限定符告诉编译器对象可以以他不知道的方式更改其值,因此编译器无法对该对象的值进行任何假设。

答案 2 :(得分:0)

这意味着当任何其他c代码访问数据时,应从原始内存位置获取数据。当我们使用asm代码访问任何内存位置时,它不使用优化技术。但是当我们使用c代码时,它通常是经过优化的,并且由于优化,它不会从原始内存位置获取代码。