ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
20 апреля
808910 Топик полностью
Николай Коровин (11.01.2018 19:26 - 19:54, просмотров: 246) ответил 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. Примерно как-то так. Мог и наврать, но логика такая. Если может при отрубе недозаписаться куча ячеек, то нужно вставлять задержки :( Естественно, только в трёх местах -- перед каждой копией журнала.