假設我有下面的C代碼:C:使用靜態揮發與「吸氣」功能和中斷
/* clock.c */
#include "clock.h"
static volatile uint32_t clock_ticks;
uint32_t get_clock_ticks(void)
{
return clock_ticks;
}
void clock_tick(void)
{
clock_ticks++;
}
現在我打電話clock_tick
(即:增加clock_ticks
變量)的中斷內,而從打電話get_clock_ticks()
main()
功能(即:在中斷之外)。
我的理解是,clock_ticks
應被聲明爲volatile
,因爲否則編譯器可以優化其接入,並main()
覺得值沒有改變(雖然它實際上是從中斷的更改)。
不知使用get_clock_ticks(void)
功能那裏,而不是訪問變量直接形成main()
(即:不聲明爲static
)實際上可以強制編譯器從存儲器加載變量,即使它沒有被聲明爲揮發性的。
我想知道有人告訴我這可能會發生。這是真的嗎?在哪些條件下?無論如何,如果我使用「吸氣」功能,我應該總是使用volatile
嗎?
您的案例中的'volatile'是必不可少的。當從中斷訪問變量時它正在發揮作用。這樣編譯器就知道有一些東西在訪問和修改它不知道的變量。否則,你的「getter」將(可能)返回一個常量,變量的初始值。 –
https://stackoverflow.com/questions/5822386/the-volatile-keyword-in-c-language –
getter函數可能會被內聯。可能存在緩存一致性問題,這些問題可能表現爲非確定性行爲。 – jxh