0%
  
    
  
  
  
  
    
    
      
      
      
    
    
      
    
      
    
    
    
    
        C/C++ volatile
introduction
- 用它宣告的型別變量表示可以被某些編譯器未知的因素更改,比如:作業系統、硬體或者其它執行緒等。
 
- 遇到這個關鍵字宣告的變數,編譯器對訪問該變數的程式碼就不再進行優化,從而可以提供對特殊地址的穩定訪問。
 
- 宣告時語法:volatile int vInt;
 
- 當要求使用 volatile 宣告的變數的值的時候,系統總是重新從它所在的記憶體讀取資料,即使它前面的指令剛剛從該處讀取過資料。而且讀取的資料立刻被儲存。
- e.g.  
1 2 3 4
   | volatile int i=10; int a = i; ( 其他程式碼,並未明確告訴編譯器,對 i 進行過操作) int b = i;
   | 
 
- volatile 指出 i 是隨時可能發生變化的,每次使用它的時候必須從 i的地址中讀取,因而編譯器生成的彙編程式碼會重新從i的地址讀取資料放在 b 中
usage
 
 
 
- 有2兩個場合(I/O & multithread program) 會使用到
 
e.g.
- I/O, 假設有一程式片斷如下  
1 2 3 4 5 6 7 8
   | U8   *pPort; U8   i, j, k;
  pPort = (U8 *)0x800000;
  i = *pPort;      j = *pPort;      k = *pPort;     
   | 
 
- 以上的i, j, k很有可能被compiler最佳化而導致產生 
i = j = k = *pPort; 的code, 也就是說只從pPort讀取一次, 而產生 i = j = k 的結果 
- 但是原本的程式的目的是要從同一個I/O port讀取3次的值給不同的變數, i, j, k的值很可能不同(例如從此 I/O port 讀取溫度), 因此i = j = k 的結果不是我們所要的
 
- 改為 
volatile U8   *pPort; 告訴compiler, pPort變數具有揮發性的特性, 所以與它有關的程式碼請不要作最佳化動作. 因而   
 
Global variables in Multithread program
reference
 
- C++ volatile用法 - IT閱讀
 
- C/C++中的volatile使用時機? @ Everything Will Flow :: 痞客邦 ::