ra9ust, структурируйте код.
Хотим сохранять конфигурацию в EEPROM. Отлично. Зачем? Чтобы при сбросе/включении начать работать с сохраненной конфигурацией.
1) Пользователю не интересно видеть сообщение "TEST EEPROM OK! " Зачем оно? Если при включении самотестирование проходит - молча начинаем работать. Представьте, включаете Вы телевизор, а там:
Код: Выделить всё
Тestng flash memory...Ok
Testing SRAM...Ok
Testing EEPROM...Ok
Testing power supply voltages...Ok
....
2) У вас есть конфигурация устройства. Так? Не вижу причин не зафиксировать это средствами языка программирования (объявить соотвктствующую структуру):
Код: Выделить всё
typedef struct _device_config_t {
// здесь все параметры конфигурации
} device_config_t;
3) mass[] - конфигурация в SRAM eep_mass[] - конфигурация в EEPROM. Так?
Непонятно, зачем их сравнивать. mass откуда берется? Читается из EEPROM?
Т.е. Вы прочитали EEPROM, работаете-работаете, а затем обнаруживаете,
что EEPROM (или конфигурация в SRAM) странным образом изменилась.
При старте устройства желательно бы проверить целостность конфигурации в EEPROM (например, питание устройства может быть отключено в момент записи конфигурации), выбирайте:
a) в EEPROM хранить контрольную сумму
б) в EEPROM держать несколько копий
в) комбинация двух методов
г) что-то еще
3) Раз есть конфигурация, то нужны:
a) функция сброса параметров конфигурации в значения по умолчанию. Т.е. если обнаружено, что в EEPROM лежит каая-то фигня, то надо привести
конфигурацию в заведомо правильное состояние (значения по умолчанию, заводские установки - называйте как хотите)
Код: Выделить всё
void device_default_config (device_config_t* c) {
// устанавливаем значения по умолчанию
}
б) функцию загрузки конфигурационных параметров:
Спойлер
Код: Выделить всё
/* например, есть функции чтение байта из EEPROM по указанному адресу */
uint8_t eeprom_read_byte (unsigned addr);
/* мы хотим контолировать целестность сохраненной конфигурации посредсвом контрольной суммы */
uint16_t cksum_update (uint16_t cksum, uint8_t);
/* возвращает 0, если в EEPROM лежит плохая конфигурация, и значения конфигурационных
параметров установлены в начальное состояние */
bool_t device_load_config (device_config_t* c) {
uint8_t data;
uint16_t cksum = CKSUM_INIT_VALUE; /* начальное значение контрольной суммы */
uint16 addr = DEVICE_CONFIG_ADDR; /* начиная с DEVICE_CONFIG_ADDR лежит конфигурация устройства */
uint8_t *p = (uint8_t *) (c);
uint8_t *limit = p + sizeof (*c);
while (p < limit) {
data = eeprom_read_byte (addr++);
cksum = cksum_update (cksum, data);
*p++ = data;
}
/* читаем дополнительно байты контрольной суммы */
cksum = cksum_update (cksum, eeprom_read_byte (addr++));
cksum = cksum_update (cksum, eeprom_read_byte (addr));
if (cksum != CKSUM_GOOD) { /* контрольная сумма плохая */
device_default_config (c); /* сбрасываем конфигурацию */
return 0;
}
return 1;
};
функция device_load_config () будет нормально работать во ВСЕХ ваших проектах,
достаточно чтобы была определена device_config_t, функции чтения EEPROM, функции контрольной суммы.
в) функцию сохранения конфигурационных параметров.
г) ...