Перейти к содержанию
    

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

Да пускай сбрасывается хоть 1000 раз - всё будет ок.

Атомарная модификация объектов во FRAM/FLASH у меня реализована примерно так:

Во FRAM имеется некая бэкап-область. При необходимости выполнить опасную операцию (перезапись объекта), в бэкап-область заносится полная инфа о планируемой операции (она журналируется): кто, куда, чего и сколько. Также, если операция планируется во flash и требуется модифицировать часть сектора (т.е. - выполнить стирание всего сектора, а потом запись новые данные + старые), то в бэкап-область заносится целевое содержимое всего сектора (новые записываемые данные + старые уже имеющиеся на странице). Потом в бэкап-области ставится флажок, что она содержит данные бэкапа (флаг валидности бэкапа). Далее - производится собственно сама опасная операция. Далее - стирается флаг валидности бэкапа.

Вот и всё - операция становится безопасной, атомарной.

При старте Службы хранения (старт МК), считывается флаг валидности бэкапа и, если он установлен, то выполняется указанная в бэкапе операция и после этого флаг сбрасывается.

МК может перезапуститься сколько угодно раз в любом месте этой процедуры - данные останутся атомарными и валидными.

Естественно область бэкапа должна иметь размер достаточный для хранения максимально возможного объекта хранения во FRAM/FLASH (вся инфа во FRAM/FLASH у меня разбита на независимые объекты хранения) и для хранения одного объекта стирания FLASH (сектор).

Для примера:

Если производится модификация объекта во FRAM, то в бэкап-области появится запись: "начиная с адреса XXXX записываются данные DD,DD,...DD".

Если производится модификация сектора во FLASH, то в бэкап-области появится запись: "производится стирание сектора SSSS, затем запись в него со смещения XXXX данных DD,DD,...DD".

Если производится дозапись (без стирания во FLASH), то в бэкап-области появится запись: "производится запись в сектор SSSS со смещения XXXX данных DD,DD,...DD".

 

CRC тут никакой почти не надо. Единственное в чём CRC может помочь - обнаружить начальное состояние бэкап-области до первого запуска firmware (мусор во FRAM). После первого запуска состояние бэкап-области однозначно определяется по флагу валидности бэкапа.

 

Для файловой системы безопасная модификация у меня устроена немного по-другому (без использования бэкап-области), так как файловая система позволяет оптимальнее это сделать с меньшим количеством операций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...