2013-12-14 65 views
3

我讀LDD3,第7章,和我這句話:訪問volatile變量 - 從LLD3

」 ...的jiffies被聲明爲內核頭文件揮發,因此,從取任何時候一些C代碼都可以訪問內存。「

我不明白... 任何人都可以讓我更清楚嗎?如果一個變量不是不穩定的,當C代碼訪問它時會發生什麼?

我知道volatile告訴處理器不要對這個變量進行優化..但是訪問它的處理是什麼?

+0

- >「,因此,只要某些C代碼訪問它,就會從內存中提取內存。」「 –

回答

0

這意味着數據應該從原始內存位置被任何其他c代碼訪問時提取。當我們使用asm代碼訪問任何內存位置時,它不使用優化技術。但是當我們使用c代碼時,它通常被優化,並且由於優化,它不會從原始存儲器位置獲取代碼。

3

volatile告訴編譯器,由於外部條件,變量可能會改變它的值,這不僅是因爲程序本身的指令(這是正常情況)。如果沒有volatile,編譯器會假定該變量的值沒有改變,因爲程序沒有修改它,即使它可以被另一個線程,內核或外部設備修改。

這種錯誤的假設可能會導致錯誤的優化,其中編譯器發出的代碼只加載一次該值,並且從不再從原始位置讀取它。

1

讓我們比較兩個代碼,而與volatile

int bla; 

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

在這種情況下,編譯器知道的bla0所以編譯器可以直接使用0printf說法,甚至沒有閱讀blaprintf被稱爲。

volatile int bla; 

bla = 0; 
delay_ms(10); // wait loop 
printf("%d\n", bla); 
在這種情況下

對象是volatile合格。這意味着在bla已被分配到0後,其值可能會突然變化,並不能保證爲0了。它會強制編譯器在調用printf時對bla進行新的評估。

添加volatile限定符告訴編譯器,對象的值可能以他未知的方式改變,因此編譯器無法對該對象的值做任何假設。