static 和volatile

Static

static在C語言中是一個多義的關(guān)鍵字。
它的含義取決于它的上下文。
Static關(guān)鍵字一共有三種用途:

  1. 用于函數(shù)內(nèi)部聲明局部變量。
    此時static關(guān)鍵字的作用是改變局部變量的存儲類型,從自動變量修改為靜態(tài)變量。也就是說,這個局部變量不再存儲在堆棧或者寄存器中了,而是存儲在編譯時編譯器分配的一個靜態(tài)空間地址中。這個變量的作用域沒變,只有聲明它的函數(shù)內(nèi)部才能訪問。同時擁有靜態(tài)變量和局部變量的特征。
  2. 用于函數(shù)定義。
    此時這個函數(shù)就只能在該函數(shù)的C文件中引用了,其他的C文件不能調(diào)用這個函數(shù)。這種做可以起到封裝的效果,將局部的、私有的函數(shù)或變量聲明為static。
  3. 用于聲明全局變量。
    與用于函數(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è)計了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容