jcxz 235 26 октября, 2017 Опубликовано 26 октября, 2017 · Жалоба Признаться да, такой защиты у меня нет, новые данные пишутся поверх старых. Единственный способ отследить ошибку - несоответствие 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). После первого запуска состояние бэкап-области однозначно определяется по флагу валидности бэкапа. Для файловой системы безопасная модификация у меня устроена немного по-другому (без использования бэкап-области), так как файловая система позволяет оптимальнее это сделать с меньшим количеством операций. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться