| 問: 本人新手,看到最新的貼在上,大家在定義變量的時候常常加上volatile,請問加上這個目的是什么,是否加上這個后,變量存 放的位置就會發生變化,謝謝大家 答: volatile的本意是“易變的” 由于訪問寄存器的速度要快過RAM,所以編譯器一般都會作減少存取外部RAM的優化。比如: static int i=0; int main(void) { ... while (1) { if (i) dosomething(); } } /* Interrupt service routine. */ void ISR_2(void) { i=1; } 程序的本意是希望ISR_2中斷產生時,在main當中調用dosomething函數,但是,由于編譯器判斷在main函數里面沒有修改過i,因此 可能只執行一次對從i到某寄存器的讀操作,然后每次if判斷都只使用這個寄存器里面的“i副本”,導致dosomething永遠也不會被 調用。如果將將變量加上volatile修飾,則編譯器保證對此變量的讀寫操作都不會被優化(肯定執行)。此例中i也應該如此說明。 一般說來,volatile用在如下的幾個地方: 1、中斷服務程序中修改的供其它程序檢測的變量需要加volatile; 2、多任務環境下各任務間共享的標志應該加volatile; 3、存儲器映射的硬件寄存器通常也要加volatile說明,因為每次對它的讀寫都可能由不同意義; 另外,以上這幾種情況經常還要同時考慮數據的完整性(相互關聯的幾個標志讀了一半被打斷了重寫),在1中可以通過關中斷來實 現,2中可以禁止任務調度,3中則只能依靠硬件的良好設計了。 [fzq21ic]答: 簡單點: 就是該變量會以編譯器無法預知的方式發生變化,請編譯器不要做優化(所有的編譯器的優化均假設編譯器知道變量的變化規律) |