2013-10-04 28 views
1

我在我的嵌入式固件中使用了很多volatile變量,但大多數情況下,在函數中只有一個點需要確定該值是最近的值(在開始時)。但函數的其餘部分引用了相同的變量名稱,並且可以同時更改該值,從而產生非常意外的代碼流/結果。我知道這可以通過在函數內部使用臨時變量來解決,但我正在尋找更好的解決方案。替代波動嗎?

現在我想知道,不是將整個變量標記爲volatile,有沒有一種方法可以指示編譯器(gcc)使用一個特殊的關鍵字,我想讀取變量,就像它標記爲volatile一樣,所以我在函數的開頭只能使用該關鍵字一次?

+3

解決方案以何種方式比使用臨時變量更好?這似乎是一個明顯的完美解決方案。 –

+0

@DavidSchwartz我必須修改每個使用這些volatile變量的函數,以便在函數開始時「緩存」它,並確保所有代碼都是指臨時變量而不是真實變量。如果我可以完全刪除'volatile'關鍵字,那麼我所要做的就是找到實際需要進行易失性讀取的位置,而不是相反。 – Muis

+1

單獨進行訪問。更改易失性變量的名稱。 –

回答

0

我有點困惑的場景 - 如果它是你想一個特定的接入向被視爲volatile變量,可以使用

dest = *(volatile TYPE *)&src; 

其中TYPE是src類型。您可能還需要

asm volatile ("" ::: "memory"); 
在嚴格控制的位置

,以防止編譯器來自全國各地的揮發性讀取移動存儲的其他位置加載/存儲。

也調查C11的_Atomic類型。 (我不確定GCC是否支持這些。)

+0

是的,我想要一個特定的訪問變量被視爲易失性。 – Muis

+2

我不認爲這會起作用,至少不能保證。如果最終的寫入不是通過'volatile'完成的,他需要的值可能還沒有存在於內存中。例如,它可以被緩存在一個寄存器中。 –

+0

@DavidSchwartz這是與一些變量相關的風險之一,但不是所有對變量的訪問都是volatile,是的。 – zwol

0

如果你的變量在內存中並且你的嵌入式系統支持它,你可以使用內存屏障。確保在讀取值時沒有任何內容訪問內存。