EEBoom - arduino библиотека для эмуляции EEPROM на ESP32 ESP8266

Всем привет. Появилась новая библиотека для удобной типизированной работы с “EEPROM” эмулированной во flash памяти.

Из очевидных преимуществ:

  • реально удобный и простой интерфейс
  • можно создать несколько независимых объектов с разной структурой в разных областях flash памяти
  • ротация не только между страницами, но и внутри одной страницы - в десятки и сотни раз снижает износ памяти
  • максимально легкая и компактная реализация - функционал вынесен в *.cpp модуль, что хорошо для многофайловых проектов
  • поддержка ESP8266 ESP32 (STM32 планируется)

Если функционал зайдет, можно перетащить принцип и на работу с внешними EEPROM микросхемами и на работу с родной EEPROM у AVR.
Здесь можно задавать вопросы.

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

Страница проекта - EEBoom

#include <eeboom.h>

struct EE {
    int         devID = 0XEFBEADDA;     //установить значение по умолчанию
    short       step;                   //для певрой инициализации
};

EEBoom<EE>      ee;                     //создал объект с типом своей структуры

void setup() {
    ee.begin();                         //инит по умолчанию с 2 секторами
}

void loop() {
    ee.data.step++;                     //сохраняем каждую секунду - с нашей структурой
    ee.commit();                        //страница закончится только через 6 мин!
    delay(1000);
}

Больше примеров и инструкции на странице репозитория.

2 лайка

ради записать во флэш 2-3 инта целая библиотека?
Может кому надо, удаляюсь из темы

Почему BOOM? Чем я провинился? :smiley:

Меньше 10р /шт с доставкой целых 8кб (!)

Ну круто, согласен. Если надо 8кб за 10р в отдельном корпусе - надо брать)
Ну и подключить библиотеку, развести, пару резисторов подкинуть…
А если с десяток параметров сохранить и не греть голову - можно EEBoom подключить :laughing:
Серьезно, я ж не деньги с вас вымогаю)

1 лайк

Лично мне задумка нравится.)))
Только её бы на STM32 бы (Хотя там вроде бы какая-то уже имеется)…

а если не с десяток параметров, у меня вот так к примеру:

 EEPROM.begin(4096);

Изначально всё и было под stm32 - только не ардуино. Код для платформы есть, нужно только в классы завернуть. Если зайдет - перетянем

Не понял, о чем речь

Да, если прям большой объем и не хочется хранить его так же и в RAM - можно делать по старинке.

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

Вы наверное хотели сказать, что НЕ быстрее 5мс? Если интересно, могу засечь.

Вообще-то у флеша лимит записи раз в 10 меньше, чем у EEPROM, емнип 10000 против 100000

1 лайк

EEBoom реализует принцип перезаписи новых данных на новое место. При таком подходе flash или eeprom изнашиваются очень равномерно и в сотни, тысячи и десятки тысяч раз медленнее…

Если писать в стандартную eeprom каждую минуту новые данные - да можно сделать это порядка 100 000 раз - и через месяц-два она умрет. Придется делать ротацию по разным адресам, а это уже не просто запись (хотя сложного тоже не много, но неудобно)

Для примера у меня в одном из проектов есть необходимость точно контролировать время работы устройства - с точностью до четверти минуты. Питание выключается неожиданно. Мне каждые 15 сек нужно делать зарубку - прошло еще 15 сек работы… Тут никакая eeprom не вывезет в лоб. Однако с EEBoom я просто выделил 10 секторов и по ним у меня “ездит” одна переменная uint32_t. В совокупности с полем crc и необходимостью выровняться по 4 байтам - это занимает 8 байт. 4096/8 = 512 раз я могу изменить данные, пока не сотрется страница. 5120 раз я инкрементирую счетчик, пока весь этот объем флеша начнет перезаписываться 2й раз… То есть примерно на сутки хватит!!! И вот у меня есть 10 000 дней до прихода flash в негодность.

Это все понятно, но даже в этом случае EEPROM проживет в 10 раз больше флеша

Так что ставить отдельный чип - идея вполне резонная. А если ставить чип fram, то и про лимиты записи можно забыть

Для ESP32 использую - Preferences - - — Arduino ESP32 latest documentation
Все необходимое есть.

Перед ответом хочу пояснить, что я не огульно всё подряд обругиваю.
NVS нормальная либа, которой можно пользоваться - просто мне не подошла. Есть ряд плюсов и минусов.
Из плюсов - из коробки работает, можно динамические объекты пихать, всё не так строго, как с EEBoom.
Из минусов - большой оверхед по использованию flash, работает только в nvs partition - а это 5-6 секторов всего, разметить больше можно, но, наверное, не под ардуино, интерфейс - не очень удобный и лаконичный (но и не EEPROM.h), есть только под esp32.
Ну и я предпочитают полный контроль, а там всё динамически в кучу на 5 страницах и вроде ядро тоже использует под свои нужды…

Есть такая мысль - это довольно логично, так как 100 000 записей - тоже весьма немного для специфичных применений. И обертка с типизированным доступом и ротацией по всей поверхности выглядит привлекательно. Но нужен отклик, понимание, что кому-то это надо.

По поводу изучения. Понимаю вас. Выше уже писал про золотой молоток. Но я постарался сделать интерфейс максимально простым. По умолчанию - там всего 3-4 строчки добавить в код и всё работает…

4мб у вас, я думаю. Ваш прибор при каждой диагностике сохраняет данные в постоянную память? Если так, нужно понимать объем сохраняемых данных и объем свободной флеш памяти (можно посмотреть в результатах компиляции - если занято 25%, например, то это 1мб. Значит 3 свободно).
Положим у вас данных 128 байт сохраняется (считаем всё приблизительно) и вы под работу с ними выделяете все 3 мб (вообще конечно столько не понадобится). Считаем 3x1024x1024= 3 145 728 байт в 3мб. 3145728/128 = 24756 раз нужно воспользоваться вашим прибором, чтобы просто 1 раз записать весь этот объем флеша. И таких записей у нас до износа - 10 000. Итого вашим прибором можно будет воспользоваться около 25млн раз!
Причем делается это в несколько строк:

struct MyData{
    uint8_t    arr[128];
};

EEBoom<MyData>    ee;

ee.begin(750);                          //домашний сектор по умолчанию, 750 секторов всего (3мб)

на С3 не тестировал. Начните с примера basic, чтобы проверить работоспособность.

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

1 лайк

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

Upd. Сильно апчистил.

5 лайков

Хватит опять срацца. Все, что не по теме, буду удалять

1.Удобство и неудобство библиотеки связана с ее интерфейсом. Как раз на внешний интерфейс и приклеиваются сторонние программисты. Интерфейс не должен быть большим или маленьким, должен быть удобным. Последнее можно узнать со временем.
2. Но наличие только одной библиотеки под одно железо это не серьезно. Скорее должно быть семейство разных библиотек с одинаковым интерфейсом под разное железо. Например еще одно под внешнюю микросхему, а еще на съемную флешку
3. Ну и ваш проект слишком маленький, что бы быть заметным. Так что советую сделать еще несколько проектов с применением Вашей библиотеки. Например регистратор сколько открывали холодильник, сколько входили в дверь и наконец сколько кур в курятнике.

Спасибо за хороший комментарий.

  1. Согласен. Я здесь, в том числе, чтобы получить обратную связь по интерфейсу.
  2. Согласен. Но в одно лицо не потяну. И смысла нет - нужны контрибьютеры. А это после того, как проверим по факту модель и необходимость.
  3. Спасибо за совет. Буду продвигать по мере сил.

Я потратил неделю, чтобы все завернуть, описать, обрисовать, чтобы людям приятно было посмотреть и попробовать. Предпринял ряд шагов (в том числе этот форум) чтобы можно было почитать/спросить. Это минимум, чтобы понять, будет отклик или нет. Если еще кому-то кроме меня это нужно - можно будет подумать над развитием.