的易失性的關鍵字是型別限定符防止從編譯器optimization.according至c標準的物件,具有揮發性限定型別可以以實施方式未知進行修改或具有其他未知側effects.you也可以說,乙個物件可以隨時更改volatile限定物件的值,而不需要**執行任何操作。
是的,我們可以用c語言建立乙個易失性指標。
int * volatile pidata; // pidata是乙個指向整數的易失性指標。
在這裡,我指出了一些需要使用volatile關鍵字的重要位置。 1
2345
6789
1011
1213
1415
#define com_status_bit 0x00000006
uint32_t
const
volatile
*const
pstatusreg=(
uint32_t*)
0x00020000;
unit32_t
getrecvdata()
return
recvdata; }
1234567
891011
1213
1415
1617
volatile
intgiflag=0
; isr(
void)
intmain
(void)
return0;
} const關鍵字是編譯器強制執行的,並且表示程式無法更改物件的值,這意味著它使物件成為不可修改的型別。
例如,const int a = 0;
如果你試圖修改「a」的值,你將得到編譯器錯誤,因為「a」符合const關鍵字,阻止更改整數變數的值。
在另一方面,volatile阻止任何編譯器優化,並且表示物件的值可以通過程式無法控制的內容進行更改,因此編譯器不會對該物件做出任何假設。
例如,volatile int a;
當編譯器看到上述宣告時,它避免對「a」做出任何假設,並且在每次迭代中從分配給變數的位址中讀取值。
是的,我們可以同時使用常量和常量。volatile和const關鍵字的最大用途之一是訪問gpio暫存器時。對於gpio,如果將其配置為輸入,則可以通過「外部因素」(如果交換機或任何輸出裝置與gpio連線)更改其值。在這種情況下,volatile起著重要作用,並確保編譯器始終從gpio位址讀取值並避免做出任何假設。
使用volatile關鍵字後,無論何時訪問埠,都會得到正確的值,但是這還有乙個問題,因為指標不是const型別,因此可能是程式更改了指標的指向位址。所以我們必須用volatile關鍵字建立乙個常量指標。
宣告的語法,
int volatile * const portregister;
如何閱讀上述宣告,
1234
567int
volatile
*const
portregister; |
||||
||||
+------
>
portregister isa
|||+
----
----
--->
constant ||
+------
----
----
->
pointer toa
|+----
----
----
----
----
->
volatile
+------
----
----
----
----
----
->
integer
考慮乙個簡單的下面例子:
#define portx 0x00020000 // gpio的位址
uint32_t volatile * const pcportreg =(uint32_t *)portx;
pcportreg是乙個指向易失性無符號整數的常量指標,使用* pcportreg我們可以訪問記憶體對映暫存器。
* pcportreg = value; //將值寫入埠
value = * pcportreg; //從埠讀取值
Volatile相關知識
volatile是區分c程式設計師和嵌入式系統程式設計師最基本的問題。嵌入式系統程式設計師經常同硬體 中斷 rtos等打交道,所有這些都要求volatile變數。不懂volatile很可能會帶來災難。volatile的作用 作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,要求每次直接讀值.非常...
Volatile相關知識
volatile相關知識 區分c程式設計師和嵌入式系統程式設計師的最基本的問題。嵌入式系統程式設計師經常同硬體 中斷 rtos等等打交道,所用這些都要求volatile變數。不懂得volatile內容將會帶來災難。volatile的作用 volatile的作用 作為指令關鍵字,確保本條指令不會因編譯...
volatile的知識點
三 記憶體屏障 由於cpu讀取記憶體的速度遠遠高於從磁碟讀取資料到記憶體的速度,因此從磁碟獲取資料到記憶體成為cpu執行效率的瓶頸。jmm中為了提高效率,提出記憶體中的快取協議。每個虛擬機器中的執行緒都有自己的工作緩衝區,乙個叫做l1 cache,該緩衝去的資料僅僅有本執行緒可見,另乙個叫做l2 c...