Easyelectronics.ru • Просмотр темы - Правильный алгоритм сохранения данных в память

Easyelectronics.ru

Электроника для всех
Текущее время: 18 авг 2018, 07:45

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



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

Начать новую тему Ответить на тему  [ Сообщений: 24 ] 
Автор Сообщение
 Заголовок сообщения: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 16:37 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2668
Маячит девайс, где надо сохранять данные во внешнюю память. Сохраняются они часто, самое редкое - раз в секунду (FRAM, так что пофиг на такую частую запись).
Естественно девайс могут отрубить в любой момент, посему возник вопрос, как бы сделать так, чтобы при отключении оно не попало на серединку записи.
Пока вижу лишь следующую штуку:
- допустим у нас во FRAM есть данные SettingsMain, в которой у нас должны сохраняются все нужные данные. Из неё же при включении мы тянем все настройки, контроль целостности обеспечивает CRC.
- делаем во FRAM еще одну структуру SettingsMainSafe, которая является копией SettingsMain. Когда нам нужно что-то сохранить в память, первым делом мы записываем нужные данные в SettingsMainSafe.
- затем, мы начинаем копировать SettingsMainSafe в SettingsMain.
- если всё записалось корректно, то у SettingsMainSafe намеренно портим CRC, тем самым показывая, что данные более не актуальны, данные корректно сохранились.
- при включении питания, первым делом смотрим в SettingsMainSafe - если CRC там неверно, то ничего не делаем.
- если видим там актуальное CRC, то понимаем, что питание отрубилось в процессе перекидывания SettingsMainSafe -> SettingsMain, и еще раз пытаем записать.

Где видятся скользкие моменты:
- если питание отключилось в самом начале, когда мы записывали SettingsMainSafe и не успели дописать CRC, то данные будут считаться не актуальными, потеряем сохранение данных
- если питание отключилось в момент, когда мы портили CRC в SettingsMainSafe, и допустим вообще не успели его затереть - данные при включении еще раз обновятся, не критично.

Что я упустил? Пока такая "атомарность" видится наиболее простой в реализации.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 16:53 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 608
Есть два блока данных, каждый раз пишем в неиспользуемый, по окончанию записи меняем их местами просто сделав текущим другой блок.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 16:54 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2668
Тогда надо как-то проц сказать что именно этот блок используемый. А если байт/флаг который как раз это говорит не запишется?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 16:55 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 608
Если флаг не запишется, значит будет использоваться старый блок.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 16:55 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 1909
Hold писал(а):
Маячит девайс, где надо сохранять данные во внешнюю память. Сохраняются они часто, самое редкое - раз в секунду (FRAM, так что пофиг на такую частую запись).
Естественно девайс могут отрубить в любой момент, посему возник вопрос, как бы сделать так, чтобы при отключении оно не попало на серединку записи.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 17:18 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 1175
Откуда: Китай, Пекин
обсуждалось неоднократно.
надежно спасает только питание через диод и далее конденсатор достаточной емкости, либо ионистор энергии которых хватило бы на время обслуживание реакции на пропадание питания.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 17:35 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2668
2cheblin:
Мне не критично потерять данные, ионистор тут по перебору. Главное - чтобы данные не повредились, и настройки не сбросились в дефолтные при включении, когда CRC не сойдется.
2evsi:
Да, это актуально для логгера, некоего журнала. Тут журнал тоже будет, и такой вариант я рассматриваю. Там точно пофиг если потеряется последняя запись.
UPD: выше описанные алгоритм подсмотрен в TI, у чипа CC26xx, там так обновляется прошивка по воздуху.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 17:39 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 4667
В блоке должно быть два поля - CRC и номер, который увеличивается на 1 при записи нового блока. Теперь, сколько блоков вы будете писать по кольцу - уже не важно.
Если размер памяти не кратен размеру блока, то рекомендуется завести "заголовок блока".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 17:46 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2668
2u37:
Но что будет, когда питалово отрубится в процессе записи такого блока? Включается питание, проц читает блок, видит что CRC не сходится, и сносит все настройки не дефолтные. Нехорошо. А так - некое резервирование, которое даёт гарантию, что блок если и не запишется, то хотя бы не повредится, что более важно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 17:47 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 4667
Взять предыдущий, с номером N-1.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 17:49 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2668
Ну т.е. в любом случае есть второй зеркальный блок, который по сути повторяет рабочий. Тогда это тоже самое, только номер мне ни к чему.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 17:50 
Старожил
Аватара пользователя

Зарегистрирован: 28 янв 2010, 20:18
Сообщения: 419
Не надо отдельный флаг, можно в каждом блоке хранить ID который каждый раз увеличивается на 1. При включении читаем все блоки (можно сделать больше двух) и берем блок с максимальным ID. При записи пишем в любое место за исключением этого блока с максимальным ID. Проще всего писать в следующий по адресам блок.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 17:54 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 4667
Без номера вы не будете знать, какой блок =последний=.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 17:56 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2668
Учитывая что их два - всегда же буду знать?) Один рабочий, другой только для безопасной перезаписи первого. В любом случае, не может возникнуть такой ситуации, кроме как самого первого включения, что оба блока повреждены.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 18:04 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1558
Откуда: Киев
Hold писал(а):
Учитывая что их два - всегда же буду знать?) Один рабочий, другой только для безопасной перезаписи первого. В любом случае, не может возникнуть такой ситуации, кроме как самого первого включения, что оба блока повреждены.

исключается дублирующая операция записи блока. Это же тоже время, зачем его тратить попусту?


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

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 1175
Откуда: Китай, Пекин
Изображение
Изображение

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

а стоит вот это все 30 рублей.

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


Последний раз редактировалось cheblin 11 июн 2018, 18:25, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 18:31 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2668
Еще раз - никакой аварии нет. Никакой катастрофы от того что пропадёт питание и мы не сохраним данные нет. Вы предлагаете воткнуть ионистор (с хорошим сопротивлением еще надо поискать), добавить комплектухи, втыкать компаратор/вход АЦП чтобы мониторить пропажу питания и не сохранять данные когда с питаловом беда. Ну нафига? Памяти вагон, требований к быстродействию нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 19:12 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2668
u37 писал(а):
Ой.
Вы же железками занимаетесь, откуда эти программистские закосы?
Вопрос на обдумать - сколько перезаписей вы произведете, пока идет процесс "отрубить в любой момент"? Если это не проняло, то другой - что отвалится раньше при снижении напряжения (специально повторяю, при плавном снижении напряжения) - FRAM или STM32.
Алгоритм я привел, глубина буфера намазывается по вкусу.

Не понимаю сакрального смысла в сохранении cfg чаще 2 раз в секунду. Если его вытаскивают/отключают, то cfg "на последнюю микросекунду" - это сильно. (сарказм) Тогда, достаточно двух блоков, без какого-либо арбитража. Считывать по загрузке всегда первый, если в нем корректная CRC.

Не совсем понял про "программистские закосы" - это к чему было сказано?
Конфиг не конфиг, есть задача сохранять часто. Надо продумать, чтобы при этом не попортить уже сохраненные данные. Я не могу дать гарантии, что отрубится быстрее, проц или память.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 20:02 
Старожил
Аватара пользователя

Зарегистрирован: 01 июн 2013, 11:15
Сообщения: 364
Откуда: Киев, Украина
Быстрое решение проблемы - EEram.
Если на пальцах и коротко, то это статическая память с автоматической записью содержимого в ЕЕ при отключении питания. Быстрая, ресурс не ограничен, стоит дешевле FRAM..

http://www.microchip.com/design-centers ... rial-eeram

_________________
Микроконтроллеры - это наше всё!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 23:04 
Только пришел

Зарегистрирован: 11 мар 2016, 01:40
Сообщения: 10
cheblin писал(а):
обсуждалось неоднократно.
надежно спасает только питание через диод и далее конденсатор достаточной емкости, либо ионистор энергии которых хватило бы на время обслуживание реакции на пропадание питания.

Пять раз спасет если процессор просбоит от ЭМИ или иных гадостей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 11 июн 2018, 23:46 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 3721
Откуда: г. Липецк
Не бывает правильных и неправильных алгоритмов. Можно лишь констатировать, насколько выбранный алгоритм подходит к той или иной системе команд (МК). И явно об этом надо рассуждать не на примерах с ЯВУ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 12 июн 2018, 01:49 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2530
Откуда: КЧР, поселок Нижний Архыз
cheblin писал(а):
либо ионистор

Какой ионистор? Кондера в 10мкФ хватит, чтобы пару сотен килобайт в EEPROM записать, да еще "I'll be back" в USART чиркануть…
PostLast писал(а):
Пять раз спасет если процессор просбоит от ЭМИ или иных гадостей

Да и черт с ним: один раз на миллиард — меньший шанс, нежели он тупо сдохнет от какой-нибудь нелепой фигни...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 12 июн 2018, 07:16 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 1175
Откуда: Китай, Пекин
Цитата:
Кондера в 10мкФ хватит

зависит от нагрузки
Изображение
достаточно небольшой допустимый диапазон для STM32 максимум 3.6V минимум 2V...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Правильный алгоритм сохранения данных в память
СообщениеДобавлено: 12 июн 2018, 08:04 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 2981
Откуда: Тольятти
Eddy71 писал(а):
Быстрое решение проблемы - EEram.
Спасибо, дружище! Не знал про это, делал тоже на конденсаторе и ЕЕпроме, а оказывается можно проще и лучше.


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

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


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

Сейчас этот форум просматривают: Google [Bot]


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

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

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