Adept (03.10.2017 14:10 - 14:38, просмотров: 386) ответил ASDFS на Для повышения надежности записи в ЕЕПРОМ применяю дублирование, размазывание по площадям и контроль целостности.
дублирование не катит (если только с подсчётом КС блока) у меня сделана мажоритарная логика (для mega16). Ну да... тройной расход памяти :( зато надёжность выше на порядок. Правда если по уму, конечно нужно ремап делать и карту битых секторов байт но как-то всё сильно "лохмато" получается, да и где хранить карту битых секторов? в памяти программ?
Мажоритарная логика (примитивная, только на чтение) работает без нареканий: пишем в три байта, без проверок, читаем тоже три байта, верное значение выбираем "голосованием" по критерию не хуже, чем 2 из 3-х :)
Одиночные байты почему-то иногда сбоили при записи (аналогичные п/п работают в tiny2313 без сбоев). Пытался победить несколько дней ( не вкурил, где собака зарылась :(( сделал мажоритарное чтение, т.к. проект "горел" по срокам. А сохранять нужно было всего-то десяток байт настроек. Потом, когда будет время покопаться более вдумчиво - попробую победить (думаю где-то подкладывает свинью логика работы контроллера EEPROM, или при выключении питания (просту обрубаем питание), управление каким-то образом передаётся на процедуру записи, т.к. именно во время чтения при включении (или при выключении питания) портится значение ячейки. Может с питанием какая фигня (там 4,8 вольта и 16МГц) но питание падает медленно (там ёмкости в парутыщмкФ). brownout detector настроен как надо, головки адресный регистр "паркуется" (записывается нулями сразу после чтения), нулевая ячейка не используется. Но сбой возникает примерно так. Запрограммировали настроечные константы в приборе (установили их с клавиатуры на передней панели), выключаем, включаем - работает. Выключаем, включаем - работает. Выключаем.... и так много раз (дней). На энный раз включаем - и упс... константы слетели (одна, но рандомно любая). Думаю дело действительно в медленно падающем питании, когда при определённых условиях контроллеру "сносит крышу" и он начинает выполнять абы какой код (но как же тогда BD, который вроде как должен затыкать его сбросом?? На tiny2313 такой проблемы нет, но там в устройстве нет и таких ёмкостей на питании.
Нужно будет пожалуй ещё сделать обновление (запись) сбойного байта, если таковой обнаружится при чтении, ну и вообще процедуру записи доработать по типу "запись-проверка" (чтение-то делается быстро, много времени не займёт. ) Правда непонятно, что делать со сбойным байтом?? Пытаться прописать его энное, заданное количество раз??? так при записи массива в EEPROM на этом можно потерять время, а бывают сценарии, когда нужно быстро сохранить массив в EEPROM (пусть даже какой-то байт будет и битый, зато остальные запишутся). А бывает нужно наоборот, - можно неспешно, но гарантированно сохранить все. Видать для этих случаев нужно две процедуры записи сделать. Одну - без проверок (или просто запись/проверка), а вторую с заданным количеством повторных попыток записи и ремапом в резервную ячейку, если не получилось (но там ещё нужно продумать и понять как быть с обработкой ошибок) :((( Так вот тривиальная задача обрастает множеством граблей, как только отходим от варианта "ну и фиг с ним, - работает же" :))
...делать нужно так, как нужно. А как ненужно - делать не нужно (С) Винни-Пух :)