2012-04-03 85 views
0

我有一個C程序,它總是使用硬編碼的定義語句進行一些設置。例子...C - 保護持久設置

#define TRIGGER_TIMEOUT 50000 

這工作得很好。現在,這個設置是可以調整的。實施例...

g_ulTriggerTimeout = ReadEEPROM(TRIGGER_TIMEOUT_OFFSET); 

如果檢測到持久存儲器(EEPROM),則該值將被讀入並使用。所以,我的安全字面價值現在有被損壞的風險(無意中改寫)。我需要使這個變量保持不變,但是我也需要從EEPROM中讀取初始值。這種情況通常如何解決?

+0

難道你不能設置你的鏈接描述腳本來把這個var放在EEPROM地址嗎? – RedX 2012-04-03 13:39:48

+0

不幸的是,EEPROM是外部的。 – Jason 2012-04-03 13:53:43

回答

1

這是恕我直言,這些情況下,彎曲的規則是確定的。

const int g_ulTriggerTimeout; //declare somewhere making sure it is in a writable section (see comment below from undur) 

/* later */ 

//just for this assignment make it modifiable 
*((int*) &g_ulTriggerTimeout) = ReadEEPROM(TRIGGER_TIMEOUT_OFFSET); 
+0

這不是便攜式的。我甚至猜測這在大多數平臺上都不起作用。 – 2012-04-03 13:34:00

+0

@undur_gongor爲什麼這不是便攜式?請注意,我只是修復它以採用'g_ul ...'的地址' – RedX 2012-04-03 13:38:13

+0

我也想知道爲什麼這不是便攜式?我更喜歡這個解決方案,因爲(對或錯)我通常將我的全局變量放在.c文件的頂部,並且我的所有持久設置都在一個函數調用(GetSettings())中加載。 – Jason 2012-04-03 13:43:50

1

我不喜歡彎曲規則(調用未發現的行爲),比如RedX's answer。因此,我現在給出一個符合C標準的解決方案。價格是一個常數函數,而不是一個常量變量。

int g_ulTriggerTimeout() 
{ 
    static int done; // statically initialized to zero 
    static int value; 
    if(!done) 
    { 
     value = haveEEPROM ? ReadEEPROM(TRIGGER_TIMEOUT_OFFSET) 
             : TRIGGER_TIMEOUT; 
     done = 1; 
    } 
    return value; 
} 

以下是我的第一個答案,但它是隻在C++有效:

const int g_ulTriggerTimeout = haveEEPROM ? ReadEEPROM(TRIGGER_TIMEOUT_OFFSET) 
              : TRIGGER_TIMEOUT; 
+0

這並不能幫助防止程序中稍後修改'g_ulTriggerTimeout'。 – 2012-04-03 13:26:41

+0

@undur_gongor,好吧,讓我添加一個'const' – 2012-04-03 13:28:04

+0

它可能是嵌入式開發,開發似乎像意大利麪代碼+宣佈遠離第一個任務(我是一個嵌入式開發人員)。因此,分配和聲明可能不在同一行。再加上var可能是全球性的。 – RedX 2012-04-03 13:32:37

0

你不能(可攜帶/與C)。

如果您必須修改程序中的變量(通過從EEPROM中讀取),您不能鎖定它以防止程序修改。

雖然可能有平臺具體的手段來實現。