C語言中的關鍵字“ volatile”的用法
volatile 這個ANSI C 關鍵字在經典的C 教程中很少提及,高層程式設計的人也可能永遠都
不會用到,但是作為嵌入式開發者來說,這個關鍵字使用頻率應該很高。volatile 的字面意
思為“不穩定的,易變的”。一般用它定義一些IO 埠的變數。現在假定我們要對一個裝置
進行初始化,此裝置的某一個暫存器地址為0xff800000。我們先看一段程式:
int *output = (int *)0xff800000; /* 定義一個IO 埠*/
int init(void)
{
int i;
for(i=0; i<10; i++)
{
*output = i;
}
}
一般的編譯器都帶有優化功能,那麼這段程式碼被優化會是什麼結果呢?編譯器認為前面
迴圈半天都是廢話,對最後的結果毫無影響,因為最終只是將output 這個指標賦值為9,所
以編譯器最後給你編譯的程式碼結果相當於為:
int init(void)
{
*output = 9;
}
試想一下,如果你對此外部裝置進行初始化的過程是必須是像上面程式碼一樣順序的對其
賦值,顯然優化後的程式並不能達到目的。反之如果你不是對此埠反覆寫操作,而是反覆
讀操作,其結果是一樣的,編譯器在優化後,也許你的程式碼對此地址的讀操作了只做了一次。
然而從程式碼角度看是沒有任何問題的。這時候就是volatile 出場的時候了,volatile 就是通知
編譯器,這個宣告的變數是一個不穩定的,在遇到此變數時候不要優化。對於上面的程式碼只
需在宣告時加上volatile 即可。
volatile int *output = (volatile int *)0xff800000; /* 定義一個IO 埠*/
不會用到,但是作為嵌入式開發者來說,這個關鍵字使用頻率應該很高。volatile 的字面意
思為“不穩定的,易變的”。一般用它定義一些IO 埠的變數。現在假定我們要對一個裝置
進行初始化,此裝置的某一個暫存器地址為0xff800000。我們先看一段程式:
int *output = (int *)0xff800000; /* 定義一個IO 埠*/
int init(void)
{
int i;
for(i=0; i<10; i++)
{
*output = i;
}
}
一般的編譯器都帶有優化功能,那麼這段程式碼被優化會是什麼結果呢?編譯器認為前面
迴圈半天都是廢話,對最後的結果毫無影響,因為最終只是將output 這個指標賦值為9,所
以編譯器最後給你編譯的程式碼結果相當於為:
int init(void)
{
*output = 9;
}
試想一下,如果你對此外部裝置進行初始化的過程是必須是像上面程式碼一樣順序的對其
賦值,顯然優化後的程式並不能達到目的。反之如果你不是對此埠反覆寫操作,而是反覆
讀操作,其結果是一樣的,編譯器在優化後,也許你的程式碼對此地址的讀操作了只做了一次。
然而從程式碼角度看是沒有任何問題的。這時候就是volatile 出場的時候了,volatile 就是通知
編譯器,這個宣告的變數是一個不穩定的,在遇到此變數時候不要優化。對於上面的程式碼只
需在宣告時加上volatile 即可。
volatile int *output = (volatile int *)0xff800000; /* 定義一個IO 埠*/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-553558/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C語言中volatile關鍵字的作用C語言
- c語言中的關鍵字C語言
- C語言中關鍵字typedef、enum的使用C語言
- C語言中容易混淆的const關鍵字C語言
- C語言中static關鍵字詳解C語言
- C語言中,FILE是關鍵字嗎?C語言
- c語言中的&的用法C語言
- 【C#】as關鍵字的用法C#
- C語言中extern的用法C語言
- C語言中的關鍵字有哪些,分別代表什麼意思C語言
- Volatile關鍵字
- C/C++中volatile關鍵字詳解C++
- C語言中qsort函式的用法C語言函式
- Java關鍵字volatile的理解Java
- volatile關鍵字的作用、原理
- 回應《C語言中typedef用法的疑惑》C語言
- volatile關鍵字解析
- c語言static關鍵字的理解C語言
- C語言的幾個關鍵字C語言
- 深入瞭解 Java 的 volatile 關鍵字Java
- 面試官最愛的volatile關鍵字面試
- volatile 關鍵字的工作機制
- 快速理解 volatile 關鍵字
- Java volatile關鍵字作用Java
- 深入解析volatile關鍵字
- Java volatile關鍵字解析Java
- java中this關鍵字的用法Java
- 詳解C++的模板中typename關鍵字的用法C++
- 詳解 C++ 的模板中 typename 關鍵字的用法C++
- 【轉】C#中base關鍵字的幾種用法C#
- 資料庫SQL語句中關於explain關鍵字的用法資料庫SQLAI
- C語言之static關鍵字C語言
- C語言中typedef用法的疑惑——解惑公佈版C語言
- 深入理解Java中的volatile關鍵字Java
- 兩張圖理解volatile關鍵字
- C++11 noexcept 關鍵字用法學習C++
- Volatile關鍵字&&DCL單例模式,volatile 和 synchronized 的區別單例模式synchronized
- C語言中函式printf()和函式scanf()的用法C語言函式