在PSoC中,可以在內存空間mapped to flash中聲明變量。由於閃存讀取速度比RAM讀取速度慢,程序將受益於編譯器優化 - 允許將值存儲在寄存器中或以其他方式緩存。除了修改閃光燈的值時。這可以是即時的done,程序員知道發生的精確時刻。這也是相對較少的事情(爲了防止寫入磨損引起的閃光)並且花費相對較長的時間。如果是這樣的寫,如果變量是從底層內存中恢復它的值(像volatile一樣),然後按照通常的方式進行,所有優化直到下一次寫入。我可以暫時變化一個變量嗎?
所以,實質上,一些強制使用其基礎存儲器單元刷新變量的機制將是有用的;無論是在寫入後不久(限制寫入後)還是某段代碼(在寫入操作後跳轉到「刷新」功能)。在C中一般都有這樣的機制,還是在GCC中有這種機制? (另外,考慮到內存限制(2-4KB RAM),如果將RAM /寄存器分配給優化器 - 將每個變量鏡像到兩個持久版本的簡單方法:volatile(在Flash中)和非易失性(在RAM中),在刷新期間將易失性重寫爲非易失性,然後使用非易失性從此開始將是相當浪費的。)
我想知道如果我明確地重寫它,它是否會更新非易失性'foo':'foo = *(volatile int *)& foo;' – 2014-09-03 05:45:44
@SF。是的,這應該可以工作,但它會以其他方式:'*(volatile int *)&foo = foo;',因爲您需要保證寫入而不是讀取。剩下的一個問題是,即使沒有「易失性」,更新可能仍然頻繁,以至於無法使用閃存單元。 – Potatoswatter 2014-09-03 06:33:56
不是真的;要寫入閃存,你需要跳過一些箍環(用一些專用函數重寫底層閃存);通常你將它們創建爲'volatile const'。只是爲了讓它們變成非const的,但是在flash中你需要應用一些'__attribute()__'魔法。如果您只是寫入變量,寫入不會真正發生,它只是更新其緩存值,以及底層閃存發生的情況。 – 2014-09-03 06:55:29