Николай Коровин (11.01.2018 19:26 - 19:54, просмотров: 282) ответил 1111111 на В оживление темы про сбоеустойчивое хранение данных в EEPROM. Теперь на очереди FRAM.
Ну как же. Предполагаем наихудший случай: борнуться может с записью случайного значения. Делаем циклическую запись (сначала записали новое и оставили старое, потом затираем старое, когда дойдёт очередь). Делаем журнал (ой прям ехт4фс йанимагу как горжуся лол). В нём три копии адреса. После записи нового значения обновляем последовательно все три. При стартапе смотрим в журнал, сравниваем все три. В какой бы момент ни прервалась запись, можно понять, в какой именно это произошло и что чем в тот момент перезаписывали, а значит -- найти адрес свежих данных.
Сча распишу логику. Предполагается, что при старте тоже могут рубануть внезапно.
A, B, C -- значения, отстоящие на один размер структуры.
X, Y -- значения, не похожие ни на что.
AAA -- всё в порядке :) Теоретически, последнюю можно рефрешнуть, но не уверен, что есть смысл.
XAA -- правильный адрес B, его надо записать последовательно в 0, 1 и 2 ячейки.
BAA -- то же самое. Освежить тоже не помешает.
BBA -- опять же, B правильный, освежить можно со второго B.
BXA -- та же реакция.
BBX -- Кэп в помощь.
CBX -- недописали последнюю, неустойчивое чтение, и не заметили (ибо прочиталось BBB). Правильный вариант C. Сначала перезаписать X значением B, потом с самого начала записать CCC.
Примерно как-то так. Мог и наврать, но логика такая.
Если может при отрубе недозаписаться куча ячеек, то нужно вставлять задержки :( Естественно, только в трёх местах -- перед каждой копией журнала.