Как уместить базу данных в 10 килобайт памяти и не сойти с ума
Представьте, что вы пишете прошивку для датчика полива или умного замка. У вас в распоряжении микроконтроллер с крошечным объемом Flash-памяти и еще меньшим запасом RAM. Ставить полноценную базу данных — безумие, писать свои велосипеды для хранения настроек и логов в сырых секторах памяти — мучение, которое обычно заканчивается битыми данными после очередного отключения питания.
Я наткнулся на FlashDB, когда искал способ хранить историю показаний сенсоров без боли. Это проект от разработчика armink, и он решает ровно две задачи: хранение пар «ключ-значение» (KV) и работу с временными рядами (Time Series). Все это работает прямо на Flash-чипах и весит сущие копейки.
Что это вообще такое
FlashDB — это встраиваемая база данных для эмбеддед-систем. Она работает по принципу NoSQL и заточена под специфику Flash-памяти: учитывает ограниченное количество циклов перезаписи и необходимость стирать память блоками.
Основная фишка в том, что автор не стал раздувать проект. Здесь нет SQL-парсеров, сложных транзакций или сетевого стека. Зато есть поддержка почти всех популярных типов Flash: от встроенной в MCU до внешней SPI Flash.
Две стороны одной медали
Библиотека разделена на два больших модуля, и чаще всего вам понадобятся оба.
KVDB: прощай, EEPROM
Обычно настройки хранят в структурах и пишут в EEPROM или эмуляцию на Flash. Проблема возникает, когда настроек становится много или они меняются в разных версиях прошивки.
FlashDB позволяет просто сохранять объекты по именам. Она поддерживает автоматическое управление версиями: если вы обновили прошивку и структура данных изменилась, база может сама разобраться с миграцией. Это экономит кучу времени при поддержке парка устройств.
TSDB: логи без страданий
Если вам нужно записывать температуру каждые 5 минут, FlashDB предлагает режим временных рядов. Данные пишутся последовательно, что идеально ложится на физику Flash-памяти.
Главное удобство — встроенный механизм очистки. Вы задаете максимальный объем логов, и база сама затирает старые записи, когда место заканчивается. Больше не нужно считать смещения секторов вручную, чтобы не затереть код программы или важные конфиги.
Как это выглядит в коде
Для работы с базой нужно сначала инициализировать объект. Вот пример того, как просто сохранить и прочитать значение:
/* Указываем имя таблицы и путь (если есть файловая система) */
static struct fdb_kvdb kvdb = { 0 };
void user_data_init(void) {
fdb_kvdb_init(&kvdb, "env", "fdb_kvdb1", NULL, NULL);
}
void save_config(int brightness) {
fdb_kv_set_int(&kvdb, "brightness", brightness);
}
int load_config(void) {
int brightness = 0;
fdb_kv_get_int(&kvdb, "brightness", &brightness);
return brightness;
}
Все максимально лаконично. Для временных рядов логика похожая, только вместо ключей используются временные метки.
Почему это стоит попробовать
Я выделил несколько моментов, которые отличают FlashDB от типичного «костыля на коленке»:
- Бережное отношение к железу. Алгоритмы записи минимизируют износ Flash-памяти. Это критично, если ваше устройство должно прожить 5-10 лет без замены чипа.
- Невероятная компактность. Библиотека требует около 10 КБ Flash и меньше 1 КБ RAM. Она влезет даже в старенькие STM32F103 или дешевые китайские аналоги.
- Готовность к сбоям. Если питание пропадет в момент записи, структура базы останется целостной. Для промышленных или уличных устройств это маст-хэв.
- Кроссплатформенность. Есть готовые порты под RT-Thread, FreeRTOS и даже «голое железо» через слой абстракции FAL (Flash Abstraction Layer).
Архитектурные нюансы
FlashDB не работает в вакууме. Под капотом она опирается на библиотеку FAL от того же автора. Это слой, который говорит базе: «по адресу 0x0800C000 у нас сектор на 4 КБ».
Если вы используете RT-Thread, интеграция займет пару минут. Если у вас чистый C на каком-нибудь AVR или ESP32 без RTOS, придется чуть-чуть дописать функции работы с драйвером Flash, но API там интуитивно понятное.
Где это применить
В моей практике FlashDB идеально подходит для:
- Хранения сетевых настроек (SSID, пароли, токены) в IoT-устройствах.
- Логирования ошибок и состояний системы для последующей диагностики.
- Сбора статистики работы оборудования, которую потом нужно выгрузить по Bluetooth или Wi-Fi.
- Хранения калибровочных коэффициентов датчиков.
Вердикт
Проект живой, у него почти 3 тысячи звезд на GitHub и активное сообщество. Да, документация местами заставляет использовать Google Translate с китайского, но кода там больше, чем текста, а примеры в папке samples покрывают 90% задач.
Если вы устали от того, что при добавлении одной переменной в конфиг у вас «едет» вся разметка памяти, FlashDB определенно стоит того, чтобы потратить на неё вечер. Это тот редкий случай, когда инструмент действительно упрощает жизнь эмбеддед-разработчика, не требуя взамен гору ресурсов.
Начать можно прямо с репозитория на GitHub, там есть подробная инструкция по быстрой установке.
