我正在读LDD3,第7章,我得到了这句话:
“... jiffies被内核头文件声明为volatile,因此,只要某些C代码访问它,就会从内存中获取它。”
我不明白...... 任何人都可以让我更清楚吗?如果变量不是易变的,当C代码访问它时会发生什么呢?
我知道volatile告诉proccessor不要对这个变量进行优化..但访问它有什么用呢?
答案 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代码时,它通常是经过优化的,并且由于优化,它不会从原始内存位置获取代码。