Цитата(Oleg_DI @ May 5 2011, 13:53)

В любом моём приборе требуется сохранение настроек пользователя, имеем блок данных которые требуется сохранить.В одних приборах используется внутренняя ЕЕПРОМ в других внешняя FROM.... Вот я и спрашивал кто как делает в этих случаях.
Я делаю всегда так.
Конфигурационная структура, которая лежит в ОЗУ всё время жизни устройства.
Код
typedef struct tagDEVICE_CONFIG
{
U8 status;
<поля данных>
U32 reserved[ x ]; // <-- резерв для расширения, часто просто padding до кратного странице флеш числа, либо до ближайшего кратного 2^n
U16 crc16;
} TDEVICE_CONFIG, *PDEVICE_CONFIG;
В EEPROM либо FRAM, при сохранении конфигурации пишется всегда две копии по одним и тем же адресам. Далее при включении устройства:
1. в конфигурационную структуру та что в ОЗУ загружаются параметры по-умолчанию;
2. читаются обе копии из EEPROM/FRAM, увеличивается счетчик чтений конфигурации на 1 и проверяется CRC каждой записи;
3. если CRC обеих записей неверная, тогда просто сохраняются параметры по-умолчанию в обе EEPROM записи;
4. если CRC хотя бы одной записи верно, и счетчик чтений конфигурации меньше 3 (трех), тогда данные уцелевшей копии перезаписываются в "битую" копию в EEPROM, и происходит чтение с п.2;
5. если после 3-й попытки восстановить битую запись неудалось в поле status выставляется флажек read-only - запрещающий запись конфигурации, и в структуру в ОЗУ копируется уцелевшая копия.
5. если CRC обеих копий верно, тогда данные любой копии (пусть первой) копируются в структуру в ОЗУ;
6. в процессе работы устройство работает с данными из структуры в ОЗУ, по мере необходимости/обновления в процессе работы устройства вся структура из ОЗУ записывается в обе копии EEPROM (если флажек Read-only в поле статус не установлен).
Работает железно. Расширяется элементарно, допустим в новой прошивке нужно хранить еще два параметра U8, структура принимает вид:
Код
typedef struct tagDEVICE_CONFIG
{
U8 status;
<поля данных>
U8 new_param1;
U8 new_param2;
U16 reserved_U16;
U32 reserved[ x - 1] // <-- резерв для расширения
U16 crc16;
} TDEVICE_CONFIG, *PDEVICE_CONFIG;