Static
static在C語言中是一個多義的關(guān)鍵字。
它的含義取決于它的上下文。
Static關(guān)鍵字一共有三種用途:
- 用于函數(shù)內(nèi)部聲明局部變量。
此時static關(guān)鍵字的作用是改變局部變量的存儲類型,從自動變量修改為靜態(tài)變量。也就是說,這個局部變量不再存儲在堆棧或者寄存器中了,而是存儲在編譯時編譯器分配的一個靜態(tài)空間地址中。這個變量的作用域沒變,只有聲明它的函數(shù)內(nèi)部才能訪問。同時擁有靜態(tài)變量和局部變量的特征。 - 用于函數(shù)定義。
此時這個函數(shù)就只能在該函數(shù)的C文件中引用了,其他的C文件不能調(diào)用這個函數(shù)。這種做可以起到封裝的效果,將局部的、私有的函數(shù)或變量聲明為static。 - 用于聲明全局變量。
與用于函數(shù)類似,這個全局變量的作用于將局限在聲明該變量的C語言內(nèi)部。
volatile
volatile 關(guān)鍵字告訴編譯器該變量是隨時可能發(fā)生變化的,每次使用它的時候必須從原內(nèi)存中取出他的值,因而編譯器生成的匯編代碼會從原內(nèi)存地址中讀取數(shù)據(jù)使用。
編譯器在優(yōu)化的過程中可能會把頻繁使用的變量備份一份,放在CPU內(nèi)部寄存器中,這樣可以快速訪問,但是當(dāng)原內(nèi)存地址中的值被修改時(比如DMA直接修改內(nèi)存中的值),CPU內(nèi)部寄存器的值卻沒有修改,這樣就會產(chǎn)生意想不到的結(jié)果。這時就需要使用volatile了。
一般來說都會忘記加volatile,記得加volatile的也是非常了解volatile的,這里的建議是,在調(diào)試的時候遇到了意想不到的結(jié)果是可以嘗試一下添加volatile
volatile一般用在如下的幾個地方:1、中斷服務(wù)程序中修改的供其它程序檢測的變量需要加volatile;2、多任務(wù)環(huán)境下各任務(wù)間共享的標(biāo)志應(yīng)該加volatile;3、存儲器映射的硬件寄存器通常也要加volatile說明,因為每次對它的讀寫都可能由不同意義;另外,以上這幾種情況經(jīng)常還要同時考慮數(shù)據(jù)的完整性(相互關(guān)聯(lián)的幾個標(biāo)志讀了一半被打斷了重寫),在1中可以通過關(guān)中斷來實現(xiàn),2中可以禁止任務(wù)調(diào)度,3中則只能依靠硬件的良好設(shè)計了。