Easyelectronics.ru

Электроника для всех
Текущее время: 16 окт 2018, 19:50

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



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

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

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2688
Маячит девайс, где надо сохранять данные во внешнюю память. Сохраняются они часто, самое редкое - раз в секунду (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
Сообщения: 662
Есть два блока данных, каждый раз пишем в неиспользуемый, по окончанию записи меняем их местами просто сделав текущим другой блок.


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

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


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

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


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

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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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

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


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

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

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

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

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


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

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

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


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

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

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

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


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

Зарегистрирован: 01 июн 2013, 11:15
Сообщения: 370
Откуда: Киев, Украина
Быстрое решение проблемы - 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
Сообщения: 3762
Откуда: г. Липецк
Не бывает правильных и неправильных алгоритмов. Можно лишь констатировать, насколько выбранный алгоритм подходит к той или иной системе команд (МК). И явно об этом надо рассуждать не на примерах с ЯВУ.


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

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

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

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


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

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

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


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

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


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

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


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

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


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

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

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