作業系統與硬體
如上方所示,以記憶體映射I/O(memory-mapped I/O)讀取裝置的狀態暫存器時,加上volatile並將該區域設為不快取,其理由為下列何者?
#define STATUS (*(volatile unsigned int *)0x40001000)
while ((STATUS & 1) == 0)
; /* 等待到裝置準備完成為止 */
- A因為加上volatile後,讀取指令會被合併成只有一次,速度會變快
- B因為放入快取後,裝置暫存器的值會自動回到0
- C因為數值是由裝置改變的,若不每次實際重新讀取,就會漏掉變化
查看答案與解析
正確答案:C. 因為數值是由裝置改變的,若不每次實際重新讀取,就會漏掉變化
裝置暫存器的值是由裝置獨立於程式之外改寫的。若沒有volatile,編譯器會判斷迴圈中的值不會改變而只讀取一次,產生永遠等待下去的程式碼。此外,若將該區域快取,CPU會一直讀取快取中的舊值,看不到裝置的變化。volatile是用來禁止省略讀取的指定,作用與合併成一次正好相反。放入快取也不會使值變成0。
- A. volatile是禁止省略讀取的,與合併成一次相反。
- B. 即使快取,數值也不會回到0。
- C. 正確。數值由裝置改變,所以每次都必須實際讀取。