Easyelectronics.ru • Просмотр темы - Вопрос по дублированию данных в EEPROM (защита от краша )

Easyelectronics.ru

Электроника для всех
Текущее время: 17 авг 2018, 14:00

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Вопрос по дублированию данных в EEPROM (защита от краша )
СообщениеДобавлено: 21 мар 2018, 14:25 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 599
Привет!
На второй неделе проверки устройства столкнулся с кратковременным крашем системы при дребезге на контактах питания.
Суть проблемы, данные в\из EEPROM читаются и пишутся при возникновении определенных событий.
Произошел дребезг на контактах питания в момент записи и система рухнула.
Для того чтобы смодулировать ситуацию пришлось на "Обдуринке" писать специальную прогу, но нашел таки причину...
Краш произошел потому, что питание поползло вниз аккурат сразу после начала записи на 26 байте напряжение упало нижу допустимого и вместо 0x0D записалось 0xFD.
Учитывая что это как раз был старший разряд счетчика система рухнула при восстановлении питания.

Вопрос решил кардинально :) заменой кондера по питанию с 10 мк до 33 мк, но осадочек так сказать остался :) да и не факт, что подобная ситуация не возникнет в будующем при высыхании кондера. (Понимаю что случай может быть один на миллион но тут черт возьми лучше не ошибаться)

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

Можете посоветовать какой то другой вариант ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по дублированию данных в EEPROM (защита от краша )
СообщениеДобавлено: 21 мар 2018, 14:35 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 560
Откуда: Германия
sed_alex писал(а):
Организовать 2 или 3 ячейки памяти в которые будет производиться запись данных по кругу, указатель хранить в отдельной ячейке EEPROM. После записи основных данных пишем контрольную сумму и сверяем ее, если все нормально - пишем номер активной ячейки.


Лучше так: указатель не нужен; к ячейке добавляем номер (uint8_t). При записи номер увеличиваем. При старте ищем ячейку с наибольшим номером, при этом: 0 < 1 < 2 < ... < 254 < 255 < 0.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по дублированию данных в EEPROM (защита от краша )
СообщениеДобавлено: 21 мар 2018, 15:28 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 4656
"Вопрос решил кардинально :) заменой кондера по питанию с 10 мк до 33 мк"
Диод то стоит?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по дублированию данных в EEPROM (защита от краша )
СообщениеДобавлено: 21 мар 2018, 19:14 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 599
u37 писал(а):
"Вопрос решил кардинально :) заменой кондера по питанию с 10 мк до 33 мк"
Диод то стоит?


1n5819-ss14 :)

P\S наученный горьким опытом даже выводы RE\DE на MAX487 притянут к земле чтоб при "агонии"он как пулемет не стрелял в сетку всяким мусором.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по дублированию данных в EEPROM (защита от краша )
СообщениеДобавлено: 21 мар 2018, 19:22 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1283
Откуда: Курск
Я как то применял метод мажоритарного резервирования. Реализация с моей стороны была несколько топорной, но работало. Мне понравилось


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по дублированию данных в EEPROM (защита от краша )
СообщениеДобавлено: 21 мар 2018, 21:31 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1377
dev писал(а):
sed_alex писал(а):
Организовать 2 или 3 ячейки памяти в которые будет производиться запись данных по кругу, указатель хранить в отдельной ячейке EEPROM. После записи основных данных пишем контрольную сумму и сверяем ее, если все нормально - пишем номер активной ячейки.


Лучше так: указатель не нужен; к ячейке добавляем номер (uint8_t). При записи номер увеличиваем. При старте ищем ячейку с наибольшим номером, при этом: 0 < 1 < 2 < ... < 254 < 255 < 0.

Совсем правильно добавить столько, что бы никогда не сбрасывалось в 0.
Добавляем контрольную сумму.
Ищем максимальный счетчик и от него пишем дальше.
Хоть в EEPROM, хоть во флэш.
У меня годами так работает, хотя элементы иногда тоже записывается с ошибками.
Всё можно на счетах за пару минут посчитать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по дублированию данных в EEPROM (защита от краша )
СообщениеДобавлено: 22 мар 2018, 01:06 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 560
Откуда: Германия
x893 писал(а):
Совсем правильно добавить столько, что бы никогда не сбрасывалось в 0.


Это как это? Счетчик 4 байта? А зачем?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по дублированию данных в EEPROM (защита от краша )
СообщениеДобавлено: 22 мар 2018, 01:36 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 599
Спасибо всем огромное.
Переписал запись данных, завтра займусь тестированием.

:) не выдержал, любопытство замучало.
В общем удалось закрешить запись только если в момент передачи по RS485 выдернуть шнурок питания. Но вторая защита отрабатывает нормально и просто в ячейку записывается число FFFFFF а в следующем цикле при проверке его тут же процедура меняет на 0 и при запросе Мастера выдает ошибку и запрос на восстановление данных в ячейке, мастер же в свою очеред выплевывает в сторону устройства последними полученными данными - короче вопрос решился.

Спасибо еще раз.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по дублированию данных в EEPROM (защита от краша )
СообщениеДобавлено: 22 мар 2018, 16:37 
Старожил

Зарегистрирован: 23 дек 2012, 16:46
Сообщения: 297
Откуда: Новый Уренгой
Может на питание супервайзер поставить чтобы вовремя предупредил о недопустимо низком напряжении.
Пишем данные в свободную область еепром а не поверх старых. опрашиваем супервайзер, и если напряжение в норме указываем адрес начала актуальных данных.

_________________
vk.com/casusnur


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по дублированию данных в EEPROM (защита от краша )
СообщениеДобавлено: 22 мар 2018, 18:48 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1558
Откуда: Киев
Наподобие как сделано в Yaffs - разбиваем весь EEPROM на блоки. Блок - минимальная единица записи, состоит из заголовка и собсно тела. В данном случае заголовок - это признак используемости блока и контрольная сумма.
0xFF - блок пустой,
0x3F - идет запись,
0x1F - записанный и валидный,
0x0F - удаленный/невалидный

Алгоритм такой - пробегаемся по всем блокам и ищем первый валидный блок. Если нашли - проверяем контрольную сумму. Если вдруг контрольная сумма не сошлась - блок помечается как невалидный и идем дальше. Запоминаем указатель на валидный блок и на первый свободный блок. Если свободных блоков нет/мало - запускаем процедуру стирания EEPROM в свободное время.

При записи - пишем сначала 0x3f в заголовок свободного блока, потом данные, потом контрольную сумму, потом 0x1f (признак занятости блока) и только потом 0x0F во все другие валидные блоки.

Это гарантирует, что в любой момент времени у нас есть как минимум одна копия рабочих данных.

Запись FF-3F-1F-0F возможна в ячейку EEPROM/flash без промежуточных стирания оной, что позволяет избежать лишних стираний.

Есть один тонкий момент - если новый блок записался, а в предыдущем отметка удаления не проставилась, то мы имеем одновременно два валидных блока. Если критично важно получить именно последний блок, то нужно добавить в заголовок счетчик блоков (можно даже задействовать младшие биты признака занятости). Нам главное определить, какой блок старше, а какой младше, для этого хватит и двух бит (00 < 01 < 10 < 11 < 00 ...). Соотвсетственно при старте ищем не самый первый валидный блок, а блок, записанный позже, а более ранние помечаем как невалидные (завершаем предыдущую транзакцию).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по дублированию данных в EEPROM (защита от краша )
СообщениеДобавлено: 23 мар 2018, 01:25 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 4656
А можно как в BIOS - при добавлении данных в память пишется запись (в ней есть и № ячейки и ее данные, длина). Нужно еще добавить - так-же, в конец дописывается (см. выше) и так до тех пор, пока не дойдут до конца. После чего стирают 0 страницу и понеслось дальше. Перед стиранием, естественно, восстанавливается то, что будет тереться.
Теперь, как находится актуальная запись по конкретной ячейке? Да никак - тупо идут от корня и ищут последнюю. Никто флаги занято-свободно-удалено не ставит. Как бесплатная фича - наверняка есть несколько предыдущих версий. Что часто пишется, того точно есть много - легче сделать откат на предыдущее значение.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB