C - Защита постоянных настроек - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть программа на Си, которая всегда использовала жестко заданные операторы определения для нескольких настроек.Пример ...

#define TRIGGER_TIMEOUT 50000

Это сработало просто отлично.Теперь этот параметр должен стать регулируемым.Пример ...

g_ulTriggerTimeout = ReadEEPROM(TRIGGER_TIMEOUT_OFFSET);

Если обнаружено постоянное хранилище (EEPROM), то значение будет считано и использовано.Таким образом, мое безопасное буквальное значение теперь может быть испорчено (непреднамеренно написано изменено).Мне нужно сделать эту переменную постоянной, однако мне также нужно прочитать начальные значения из EEPROM.Как обычно решается этот сценарий?

Ответы [ 3 ]

1 голос
/ 03 апреля 2012

Это ИМХО один из тех случаев, когда смена правил в порядке.

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);
1 голос
/ 03 апреля 2012

Мне не нравится отклонять правила (вызывая неопределенное поведение), как RedX-ответ . Поэтому сейчас я даю решение, совместимое со стандартом 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 голосов
/ 03 апреля 2012

Вы не можете (переносимо / с C).

Если вам нужно изменить переменную в вашей программе (читая ее из EEPROM), вы не можете заблокировать ее для изменения вашей программой.

Хотя для достижения этой цели могут использоваться специальные средства для платформы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...