Frogfs (Fogly-Fore-File File-System) представляет собой файловую систему только для чтения, предназначенная для встроенного использования. Его можно легко использовать с помощью проекта Cmake, включая ESP-IDF. Он имеет встроенные фильтры, чтобы сохранить пространство. Файлы в frogfs-clockwise-demo уменьшаются примерно наполовину с помощью фильтров по умолчанию. Вот ссылки на пример репозитории:
Фильтры преобразования включают:
Фильтры сжатия включают:
Фильтры преобразования предназначены для того, чтобы быть операциями по времени компиляции , которые не несут затраты на время выполнения, в то время как фильтры сжатия, как ожидается , понесут затраты на декомпрессию времени выполнения .
Это означает, что для HTTP -сервера, Zlib (Deflate), Brotli (BR) или GZIP, сжатые файлы, могут быть переданы через нетронутые! Это экономит время обработки и пропускную способность. Остерегайтесь, однако, что некоторые браузеры не принимают контент Brotli, другие HTTP (только HTTPS).
Чтобы использовать этот компонент с ESP-IDF, в рамках вашего проекта каталогов.
idf.py add-dependency jkent/frogfs
Встройте Frogfs в ваш проект двоичный файл с функцией Cmake:
target_add_frogfs(<target> [CONFIG yaml] [NAME name])
Если конфигурация не указана, будет использоваться frogfs.yaml . Если имя не указано, оно по умолчанию по умолчанию frogfs .
В качестве примера для ESP-IDF, в Toplevel Cmakelists.txt от вашего проекта:
cmake_minimum_required ( VERSION 3.16)
include ( $ENV{IDF_PATH} /tools/cmake/project.cmake)
project (my_project)
target_add_frogfs( ${PROJECT_NAME} .elf)В C это приводит к тому, что эти два глобальных символа будут доступны для вашего приложения:
extern const uint8_t frogfs_bin [];
extern const size_t frogfs_bin_len ; У вас есть возможность создать двоичный файл, не связывая его с вашим приложением. Функция Cmake предоставляется для вывода бинарного с generate_${name} .
declare_frogfs_bin(path [CONFIG yaml] [NAME name])
Если конфигурация не указана, используется frogfs.yaml . Если имя не указано, используется frogfs .
Вот пример того, что вы можете добавить в свой cmakelists.txt: toplevel.
set (FROGFS_NAME frogfs)
declare_frogfs_bin( NAME ${FROGFS_NAME} )
idf_component_get_property(main_args esptool_py FLASH_ARGS)
idf_component_get_property(sub_args esptool_py FLASH_SUB_ARGS)
esptool_py_flash_target( ${FROGFS_NAME} -flash " ${main_args} " " ${sub_args} " ALWAYS_PLAINTEXT)
esptool_py_flash_to_partition( ${FROGFS_NAME} -flash storage ${BUILD_DIR} /CMakeFiles/ ${FROGFS_NAME} .bin)
add_dependencies ( ${FROGFS_NAME} -flash generate_ ${FROGFS_NAME} _bin) Вы можете вызвать процесс Flash, запустив idf.py frogfs-flash .
Frogfs ожидает файла конфигурации YAML. Есть 3 разных раздела: определить, собирать и фильтр. Все, кроме сбора, не является обязательным.
Определить - это список или определения переменных. Есть 2 предопределенные переменные: $cwd и $frogfs . Вы также можете ссылаться на переменные среды с помощью синтаксиса ${ENV:varname} .
Соберите «собираются» файлы и каталоги и помещают их в корень Frogfs. Глобальные узоры разрешены в компоненте «базовый» пути. Есть 3 способа указать источники; Они являются строкой, списком или словарем. Если это строка, путь (ы) становится корневым каталогом. Если список, пути объединяются по порядку и становятся корневым каталогом. Если используется DICT, пути объединяются в пункт назначения по выбору; Пустая строка является корневым каталогом. Переменные расширены как для источника, так и для пункта назначения.
Фильтр позволяет вам выполнять пост-обработку в файлах до их интеграции. Фильтр - это список или дикты дад; с шаблоном глобуса в список глаголов. Варибалы расширяются, и все шаблоны оцениваются для каждого файла или каталога, сверху вниз. Сначала применяются преобразования, а затем дополнительное окончательное сжатие перед кэшированием файла.
Глаголы применяются в порядке убывания. Вы можете префиксу преобразования А или глагол compress , no отключить его. Существует несколько специальных глаголов: discard , которая предотвращает включение и cache (по умолчанию), которые кэшируют файл в кэше сборки. См. frogfs_example.yaml , например, использование.
Доступны два интерфейса: Bare API или при использовании IDF есть интерфейс VFS, который строит поверх голого API. Вы должны использовать интерфейс VFS в проектах IDF, поскольку он использует с ним портативные и знакомые функции posix и stdio C. Однако ничто не мешает вам смешать и сопоставлять оба одновременно.
Настройки конфигурации определяют структуру frogfs_config_t и передавая ее в frogfs_init . Два разных способа указать файловую систему:
addr : frogfs_config_t frogfs_config = {
. addr = frogfs_bin ,
};part_label : frogfs_config_t frogfs_config = {
. part_label = "storage" ,
}; Тогда это просто вопрос передачи функции frogfs_config к функции frogfs_init и проверки его переменной возврата:
frogfs_fs_t * fs = frogfs_init ( & frogfs_config );
assert ( fs != NULL ); Когда сделано, и все ручки файлов закрыты, вы можете вызвать frogfs_deinit :
frogfs_deinit ( fs ); Интерфейс VFS имеет аналогичный метод инициализации; Вы определяете структуру frogfs_vfs_conf_t :
frogfs_fs_t frogfs_vfs_conf_t frogfs_vfs_conf = {
. base_path = "/frogfs" ,
. fs = fs ,
. max_files = 5 ,
};
frogfs_vfs_register ( & frogfs_vfs_conf );Под капюшоном есть хэш -таблица, состоящая из хэша пути DJB2 для входа, которые позволяют быстро поиск с использованием бинарного алгоритма поиска. Все записи, кроме корневого входа, имеют смещение локатора родителей. У записей каталога есть отсортированный список смещений в детские записи.
Двоирные файлы Frogfs могут быть либо встроены в ваше приложение, либо доступны с использованием отображенного ввода/вывода памяти. Невозможно (в настоящее время) использовать Frogfs без бинарной системы, существующей в адресах данных.
Создание файловой системы Frogfs обрабатывается одним инструментом, tools/mkfrogfs.py . Он использует преобразование в каталоге tools , или вы можете добавить свои собственные преобразования, создав каталог tools в корневом каталоге ваших проектов, с именем файла, начиная с transform- и заканчивая .js или .py . Инструменты преобразования принимают данные на stdin и производят вывод на stdout.
Оба преобразования и комктора могут принять аргументы. См. frogfs_example.yaml для примера.
Frogfs был разделен от проекта Криса Моргана (Chmorgan) Libesphttpd (MPL 2.0), который представляет собой вилку Jeroen Domburg (sprite_tm) libesphttpd (пиво). Этот проект никогда бы не существовал без них.
Спасибо всем участникам этого проекта!