2014-09-02 63 views
2

PSoC中,可以在內存空間mapped to flash中聲明變量。由於閃存讀取速度比RAM讀取速度慢,程序將受益於編譯器優化 - 允許將值存儲在寄存器中或以其他方式緩存。除了修改閃光燈的值時。這可以是即時的done,程序員知道發生的精確時刻。這也是相對較少的事情(爲了防止寫入磨損引起的閃光)並且花費相對較長的時間。如果是這樣的寫,如果變量是從底層內存中恢復它的值(像volatile一樣),然後按照通常的方式進行,所有優化直到下一次寫入。我可以暫時變化一個變量嗎?

所以,實質上,一些強制使用其基礎存儲器單元刷新變量的機制將是有用的;無論是在寫入後不久(限制寫入後)還是某段代碼(在寫入操作後跳轉到「刷新」功能)。在C中一般都有這樣的機制,還是在GCC中有這種機制? (另外,考慮到內存限制(2-4KB RAM),如果將RAM /寄存器分配給優化器 - 將每個變量鏡像到兩個持久版本的簡單方法:volatile(在Flash中)和非易失性(在RAM中),在刷新期間將易失性重寫爲非易失性,然後使用非易失性從此開始將是相當浪費的。)

回答

2

您應該通過在RAM中明確維護一個變量。 CPU通常不會有可用的寄存器,並且編譯器不會使用堆棧來緩存全局。

您可以嘗試聲明變量non-volatile,然後通過易失性指針訪問它,如* (volatile int *) & foo。就我個人而言,我會稱之爲災難的祕訣。它可能不會更新foo的「緩存」值。

做相反的事情,並聲明它volatile但刪除指針的限定,會產生未定義的行爲。無論如何,編譯器可能不會將指針解引用到寄存器。

+0

我想知道如果我明確地重寫它,它是否會更新非易失性'foo':'foo = *(volatile int *)& foo;' – 2014-09-03 05:45:44

+0

@SF。是的,這應該可以工作,但它會以其他方式:'*(volatile int *)&foo = foo;',因爲您需要保證寫入而不是讀取。剩下的一個問題是,即使沒有「易失性」,更新可能仍然頻繁,以至於無法使用閃存單元。 – Potatoswatter 2014-09-03 06:33:56

+0

不是真的;要寫入閃存,你需要跳過一些箍環(用一些專用函數重寫底層閃存);通常你將它們創建爲'volatile const'。只是爲了讓它們變成非const的,但是在flash中你需要應用一些'__attribute()__'魔法。如果您只是寫入變量,寫入不會真正發生,它只是更新其緩存值,以及底層閃存發生的情況。 – 2014-09-03 06:55:29

0

你可以嘗試使用兩個變量:

int foo; 
volatile int foo_vol; 

使用foo對於大多數程序,但是當進行寫操作時,分配給foo_volfoo

if (there_was_a_write) 
    foo = foo_vol; 
process_data(&foo, bar); 

這將導致foo獲得優化,但仍可以使用新值。我不確定這種方法是否適用於您的特定設置,但無論如何,祝您好運。

+0

正如在最後一段中詳細說明的那樣 - 是的,它會起作用,但它會浪費,像2KB RAM一樣鏡像變量。 – 2014-09-02 06:16:43

+0

看起來我誤解了,對不起。 – McLovin 2014-09-03 01:40:23

相關問題