Как предотвратить «частичную запись» повреждения данных во время потери мощности?

StackOverflow https://stackoverflow.com//questions/21051614

Вопрос

В встроенной среде (с использованием MSP430) я видел некоторые повреждения данных, вызванные частичными буквами для ненутрительной памяти.Это, кажется, вызвано потерей мощности во время записи (в формате Fram или Info Segments).

Я проверяю данные, хранящиеся в этих местах с CRC.

Мой вопрос в том, какой правильный способ предотвращения коррупции «Частичная запись»?В настоящее время я изменил свой код, чтобы написать двум отдельным локациям FRAM.Итак, если одна запись прерывается, вызывая неверный CRC, другое место должно оставаться действительным.Это обычная практика?Нужно ли реализовать это двойное писать поведение для любой ненутрительной памяти?

Это было полезно?

Решение

Простое решение - это поддерживать два версиях данных данных (на отдельных страницах флэш-памяти), текущей версии и предыдущей версии. Каждая версия имеет заголовок, содержащий порядковый номер, и слово, которое проверяет порядковый номер - просто дополнение 1-го уровня последовательности, например:

---------
|  seq  |
---------
| ~seq  |
---------
|       |
| data  |
|       |
---------
.

Критические вещи заключаются в том, что когда данные написаны генеракодицетагкод и слова seq, записаны LAST .

При запуске вы прочитайте данные, которые имеют наибольшую допустимую последовательность (бухгалтерский учет, возможно, - особенно для коротких слов последовательности). Когда вы пишете данные, вы перезаписываете и проверяете более старые .

Решение, которое вы уже используете, действителен до тех пор, пока CRC записан последним, но ему не хватает простоты и налагает накладные расчета CRC, которые могут не быть необходимыми или желательными.

на Фракте, у вас нет беспокойства о выносливости, но это проблема для флэш-памяти и EEPROM. В этом случае я использую метод кэша заднего записи, где данные сохраняются в оперативной памяти, и когда модифицирован таймер запускается или перезапускается, если он уже работает - когда истекает таймер, данные написаны - это предотвращает Из перемагивания памяти и полезен даже на FRAM, поскольку он минимизирует накладные расходы программного обеспечения данных.

Другие советы

Наша инженерная команда принимает два болевых подхода к этой проблеме: решите его в аппаратном и программном обеспечении!

Первый - это диодное и конденсаторное расположение для обеспечения нескольких миллисекундов мощности во время броска. Если мы заметим, что мы потеряли внешнюю мощность, мы помешаем код ввода любого не нарушенного пишета.

Во-вторых, наши данные особенно важны для работы, она часто обновляет, и мы не хотим носить нашу не нарушенную вспышку вспышки (он только поддерживает так много пишетов.) Итак, мы на самом деле сохраняем данные 16 раз в Flash и защитить каждую запись с кодом CRC. При загрузке мы находим новейшие действительные записи, а затем начните наши циклы стирания / записи.

Мы никогда не видели повреждение данных, поскольку реализация нашей откровенной параноидной системы.

<Сильное> Обновление:

Я должен отметить, что наша вспышка наружается нашему процессору, поэтому CRC помогает проверить данные, если есть коммуникационный глюк между CPU и Flash Chip. Кроме того, если мы испытываем несколько глюков подряд, множественные записи защищают от потери данных.

Мы использовали что-то похожее на ответ Клиффорда, но написанные в одной операции записи.Вам нужны две копии данных и чередуются между ними.Используйте инкрементный порядковый номер, так что эффективно одно местоположение имеет даже числа последовательности, и один имеет нечетную.

Напишите такие данные, как это (в одной команде записи, если вы можете):

---------
|  seq  |
---------
|       |
| data  |
|       |
---------
| seq   |
---------
.

Когда вы прочитаете его, убедитесь, что оба номера последовательности одинаковы - если они не тогда, данные недействительны.При запуске прочитайте оба места, и работают, какой из них более свежий (с учетом порядкового номера, прокаживающего).

Всегда хранить данные в каком-то протоколе, например, start_byte, общие байты для записи, данные, конечный байт. Перед воспоминанием на внешнюю / внутреннюю память всегда проверяйте регистры Power Moniter / ADC. В любом случае, данные повреждены, конечный байт также поврежден.Так что вход не будет Vaild после проверки всего протокола. Контрольная сумма не является хорошей идеей, вы можете выбрать CRC16 вместо этого, если вы хотите включить CRC в свой протокол.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top