Easyelectronics.ru

Электроника для всех
Текущее время: 24 сен 2020, 20:29

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



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 20 ] 
Автор Сообщение
 Заголовок сообщения: Хранение и версионирование настроек
СообщениеДобавлено: 01 апр 2020, 16:47 
Старожил
Аватара пользователя

Зарегистрирован: 28 янв 2010, 20:18
Сообщения: 591
Задумался над такой задачей. Есть устройство с достаточно сложными программными внутренностями, для примера маршрутизатор сетевой. Чтобы оно работало как надо пользователю, предусмотрена настройка некоторых (многих) параметров, пусть будет около ~100 переменных. При разработке устройства возникают такие вопросы:

1) Хранение настроек в бинарном виде в энергонезависимой памяти; То есть надо уметь преобразовывать структуру с параметрами в поток байт и соответственно обратно;
2) Экспорт-импорт настроек в текстовом виде, частный случай п.1;
3) Версионирование сохранённых настроек, под этим я подразумеваю:
- возможность загрузки старого блока данных в новой версии прошивки;
- возможность загрузки нового блока данных в старой версии прошивки;
- инициализация отсутствующих в блоке данных параметров default значениями;
- определение пригодности блока данных (по наличию "основных" параметров);
добавка: + рефакторинг названий переменных в новых версиях, то есть вместо удаления переменных надо оставлять заглушки для чтения старых версий данных;

Такое получается если сохранять настройки в текстовом виде вместе с названиями переменных. Требуется только обеспечить уникальность названий на всем цикле жизни устройства или в пределах достаточно большого времени. Так сделана например конфигурация linux kernel.

Для экономии памяти хочется сохраняться в бинарном виде, а там текстовые поля неуместны. Можно давать числовые идентификаторы каждой переменной, но непонятно как было бы удобно назначать их. Да и проставить номер каждой переменной это уже увеличение размера бинаря в 2 раза.

У меня есть свой велосипед на эту тему. Переход между версиями делаю через экспорт в текстовый вид, а затем импорт в новой версии. Сохранение во внутренней памяти работает только пока не прошьём новую версию. Задумался над улучшениями.

Кто как решает подобные задачи?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хранение и версионирование настроек
СообщениеДобавлено: 01 апр 2020, 17:08 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 377
Я как-то давно задавал тут вопрос на эту тему. Искал уже готовые либы. Ничего полезного так и не посоветовали.
В итоге написал свою либу для хранения любых данных в eeprom по типу ключ->значение. Ключ - целое число, значение может быть любым и иметь любой размер. Внутри всё устроено как односвязанный список в eeprom. Либа решает вопросы 1 и частично 3.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хранение и версионирование настроек
СообщениеДобавлено: 01 апр 2020, 17:43 
Старожил
Аватара пользователя

Зарегистрирован: 28 янв 2010, 20:18
Сообщения: 591
Чтобы не хранить идентификаторы переменных вместе с данными, можно хранить лишь таблицы переменных (порядок и состав переменных в бинаре) для каждой версии. В самом лёгком варианте нужно хранить таблицу только для текущего и предыдущего формата данных. В этом варианте много возни (пусть даже и автоматизированной) во время сборки прошивки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хранение и версионирование настроек
СообщениеДобавлено: 01 апр 2020, 17:46 
Старожил
Аватара пользователя

Зарегистрирован: 28 янв 2010, 20:18
Сообщения: 591
ArtDen писал(а):
Я как-то давно задавал тут вопрос на эту тему. Искал уже готовые либы. Ничего полезного так и не посоветовали.
В итоге написал свою либу для хранения любых данных в eeprom по типу ключ->значение. Ключ - целое число, значение может быть любым и иметь любой размер. Внутри всё устроено как односвязанный список в eeprom. Либа решает вопросы 1 и частично 3.


Ключ вручную назначается? Надо гарантировать, что один и тот же ключ не будет переиспользован для другой переменной.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хранение и версионирование настроек
СообщениеДобавлено: 01 апр 2020, 17:52 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 377
amaora писал(а):
Ключ вручную назначается? Надо гарантировать, что один и тот же ключ не будет переиспользован для другой переменной.


Ключ - обычный enum. Слежение за тем, что не будет двух одинаковых ключей в enum-е - на совести программиста.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хранение и версионирование настроек
СообщениеДобавлено: 01 апр 2020, 18:31 
Старожил
Аватара пользователя

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

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

при необходимости такой "пакет настроек" может быть отправлен в сеть/uart или прочитан из сети.
а также легко разобран и отредактирован на любой платформе.

поддерживаемые языки C,C#,C++, Rust, Kotlin, TypeScript

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хранение и версионирование настроек
СообщениеДобавлено: 01 апр 2020, 18:41 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6946
Храните данные в структурах. В каждой структуре заведите специальное поле = тип+версия(редакция).
После чего, останется лишь где-нибудь у себя в архиве держать преобразователи с существующими (и устаревшими) идентификаторами и трансляция из-в особых хлопот вызывать не должна. )) IMHO.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хранение и версионирование настроек
СообщениеДобавлено: 01 апр 2020, 18:46 
Старожил
Аватара пользователя

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

как побыстрому-наколеночный вариант - вполне.
а если хочется и предполагается больше функционала.. не очень

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хранение и версионирование настроек
СообщениеДобавлено: 01 апр 2020, 18:49 
Старожил
Аватара пользователя

Зарегистрирован: 28 янв 2010, 20:18
Сообщения: 591
cheblin писал(а):
в частности для таких целей создавался adhoc protocol.
можно создавать структуры данных любой сложности. простые и многомерные массивы, вложенные структуры.
максимально эффективное хранение....


Громоздко. Да и не понятно как тут дела с версионированием.

Мне тоже приходится использовать генерацию, хотя и в меньшем объёме, но мне это не нравится. В приоритете простое решение на plain C.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хранение и версионирование настроек
СообщениеДобавлено: 01 апр 2020, 18:51 
Старожил
Аватара пользователя

Зарегистрирован: 28 янв 2010, 20:18
Сообщения: 591
u37 писал(а):
Храните данные в структурах. В каждой структуре заведите специальное поле = тип+версия(редакция).
После чего, останется лишь где-нибудь у себя в архиве держать преобразователи с существующими (и устаревшими) идентификаторами и трансляция из-в особых хлопот вызывать не должна. )) IMHO.


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хранение и версионирование настроек
СообщениеДобавлено: 01 апр 2020, 19:01 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 377
u37 писал(а):
Храните данные в структурах. В каждой структуре заведите специальное поле = тип+версия(редакция).
После чего, останется лишь где-нибудь у себя в архиве держать преобразователи с существующими (и устаревшими) идентификаторами и трансляция из-в особых хлопот вызывать не должна. )) IMHO.

Как вариант. Но лично мне лень писать преобразование из одной структутры в другую. Предпочтительнее, чтобы версионированием занималась сама библиотека.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хранение и версионирование настроек
СообщениеДобавлено: 01 апр 2020, 19:06 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 3559
Откуда: Китай, Пекин
amaora писал(а):
Громоздко. Да и не понятно как тут дела с версионированием.


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

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

Цитата:
В приоритете простое решение на plain C.

так там в списке и есть С, plain-ее не бывает.

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хранение и версионирование настроек
СообщениеДобавлено: 01 апр 2020, 19:18 
Старожил
Аватара пользователя

Зарегистрирован: 28 янв 2010, 20:18
Сообщения: 591
cheblin писал(а):
в том смысле, что под этим подразумеваете вы. всё просто, заранее создается необходимое количество необязательных полей.

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


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

То есть при разработке прикладного кода нужно как можно реже вспоминать особенности хранения конфигурации.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хранение и версионирование настроек
СообщениеДобавлено: 01 апр 2020, 19:38 
Старожил
Аватара пользователя

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

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хранение и версионирование настроек
СообщениеДобавлено: 01 апр 2020, 20:37 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4335
Откуда: г. Липецк
Хранение максимума информации при минуме занимаемой памяти. Так попытались сделать в медиаформате *.MKV. Разбирался недавно с ним, почитайте, может пригодится. Хотя не думаю, слишком геморойно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хранение и версионирование настроек
СообщениеДобавлено: 14 июн 2020, 15:16 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1799
Откуда: Новокузнецк
amaora писал(а):
cheblin писал(а):
в том смысле, что под этим подразумеваете вы. всё просто, заранее создается необходимое количество необязательных полей.

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


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

То есть при разработке прикладного кода нужно как можно реже вспоминать особенности хранения конфигурации.

Попробуй посмотреть в сторону BSON. Это как JSON, только бинарный.
Разные типы данных: инты, булевы, массивы, списки, объекты, массивы объектов.
У каждого поля свое имя (ключ) - нуль-терминированная строка
Накладные расходы небольшие.
Это стандартная штука, а значит на ПК ты можешь стандартными питоновскими библиотеками подготавливать, парсить, редактировать настройки девайса.

Цитата:
2) Экспорт-импорт настроек в текстовом виде, частный случай п.1;

Есть готовые конвертеры из JSON в BSON и обратно. Например для питона.

Цитата:
3) Версионирование сохранённых настроек, под этим я подразумеваю:
- возможность загрузки старого блока данных в новой версии прошивки;

Из BSONа значения вычитываются по ключу. Если параметр не найден (старая прошивка еще не знала такого ключа) - ты получишь ошибку. В обработке этой ошибки можно взять значение по умолчанию.

Цитата:
- возможность загрузки нового блока данных в старой версии прошивки;

Старая прошивка возьмет только те параметры. которые знает. Новые незнакомые параметры ей не помешают.
Цитата:
- инициализация отсутствующих в блоке данных параметров default значениями;

Это нужно сделать вручную. Если не удалось прочитать параметр - берешь значение по умолчанию.

Цитата:
- определение пригодности блока данных (по наличию "основных" параметров);

Контрольных сумм у BSON нет. Тут нужно добавить их самому. Например одна CRC на весь блок.

Цитата:
добавка: + рефакторинг названий переменных в новых версиях, то есть вместо удаления переменных надо оставлять заглушки для чтения старых версий данных;

Такого тоже нет.

Небольшие библиотеки для микроконтроллера есть, но большинство из них не поддерживает все возможности BSON.
Я остановился на этой - https://github.com/thestoics/bson_arduino
Хорошая библиотека, сделана на основе libbson

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хранение и версионирование настроек
СообщениеДобавлено: 14 июн 2020, 18:01 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 3559
Откуда: Китай, Пекин
elisey писал(а):
у BSON нет.

BSON
прежде чем начать использовать
посмотрите это видео

ну да, это чуть получше, чем JSON но всё то-же раздутое недоразумение
каждый(!) пакет содержит в себе полную метаинформацию !!!!

да-да, помимо самих данных, содержит названия полей и идентификаторы их типов данных

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

в моём протоколе вся метаинформация хранится у участников обмена.

передаются ТОЛЬКО данные

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

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хранение и версионирование настроек
СообщениеДобавлено: 14 июн 2020, 19:48 
Старожил
Аватара пользователя

Зарегистрирован: 28 янв 2010, 20:18
Сообщения: 591
Будь контроллер потолще я бы наверно предпочёл текстовый "человекоредактируемый" формат сжатый каким-нибудь gzip-ом. Да и хранить лучше в файловой системе. Но пока это выглядит неоправданно сложно.

Добавка: можно попытаться одни решением охватить и конфигурацию и сетевые протоколы, много общего, это надо подумать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хранение и версионирование настроек
СообщениеДобавлено: 14 июн 2020, 21:15 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 3559
Откуда: Китай, Пекин
amaora писал(а):
одни решением охватить и конфигурацию и сетевые протоколы, много общего, это надо подумать.


Именно!

Цитата:
"человекоредактируемый" формат

работает, но только в простейших случаях. проходили.
всё что сделано на коленке, и работает через колено.

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хранение и версионирование настроек
СообщениеДобавлено: 18 июн 2020, 04:26 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1799
Откуда: Новокузнецк
cheblin писал(а):
elisey писал(а):
у BSON нет.

BSON
прежде чем начать использовать
посмотрите это видео

ну да, это чуть получше, чем JSON но всё то-же раздутое недоразумение
каждый(!) пакет содержит в себе полную метаинформацию !!!!

да-да, помимо самих данных, содержит названия полей и идентификаторы их типов данных

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

в моём протоколе вся метаинформация хранится у участников обмена.

передаются ТОЛЬКО данные

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

Так изначально весь вопрос был не о передаче данных, а о хранении настроек в энергонезависимой памяти. А хранить нужно всю метаинформацию. Плюс автор сказал что хочет строковые ключи, а не индексы, чтобы проще поддерживать. Мне кажется BSON сюда идеально подходит почти по всем требованиям. Оверхеда в нем практически нет, так как в нем минимум служебной информации, только ключи, данные, и еще чуть-чуть кое-чего. Очень гибкий и расширяемый, что дает легкую поддержку обратной совместимости.

_________________
elisey.su


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


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


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

Сейчас этот форум просматривают: siarzhuk, Пельмень Мясной


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

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

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