Frogfs (sistema de archivos de uso general de solo lectura rápida) es un sistema de archivos de solo lectura diseñado para uso integrado. Se puede usar fácilmente con un proyecto CMake, incluido ESP-IDF. Tiene filtros incorporados para ahorrar espacio. Los archivos en frogfs-clockwise-demo se reducen a la mitad utilizando los filtros predeterminados. Aquí hay enlaces a los repositorios de ejemplo:
Los filtros de transformación incluyen:
Los filtros de compresión incluyen:
Los filtros de transformación están destinados a ser operaciones en tiempo de compilación que no incurren en un costo de tiempo de ejecución, mientras que se espera que los filtros de compresión incurran en un costo de descompresión en tiempo de ejecución .
¡Esto significa que para un servidor HTTP, ZLIB (Deflate), Brotli (BR) o archivos comprimidos GZIP se pueden pasar sin tocar! Esto ahorra tiempo de procesamiento y ancho de banda. Sin embargo, tenga cuidado de que algunos navegadores no acepten contenido brotli otros http (solo https).
Para usar este componente con ESP-IDF, dentro de su directorio de proyectos se ejecuta
idf.py add-dependency jkent/frogfs
Incrustar a Frogfs dentro de su binario de Project con la función CMake Folowing:
target_add_frogfs(<target> [CONFIG yaml] [NAME name])
Si no se especifica la configuración , se utilizará frogfs.yaml . Si no se especifica el nombre , se predeterminará a frogfs .
Como ejemplo para ESP-IDF, en el toplevel CMakelists.txt de su proyecto.
cmake_minimum_required ( VERSION 3.16)
include ( $ENV{IDF_PATH} /tools/cmake/project.cmake)
project (my_project)
target_add_frogfs( ${PROJECT_NAME} .elf)En C, esto da como resultado estos dos símbolos globales disponibles para su aplicación:
extern const uint8_t frogfs_bin [];
extern const size_t frogfs_bin_len ; Tiene la opción de crear un binario sin vincularlo con su aplicación. Se proporciona una función CMake para emitir un binario con Target generate_${name} .
declare_frogfs_bin(path [CONFIG yaml] [NAME name])
Si no se especifica la configuración , se usa frogfs.yaml . Si el nombre no se especifica, se usa frogfs .
Aquí hay un ejemplo de lo que puede agregar a sus cmakelists de nivel superior. Txt:
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) Puede invocar el proceso Flash ejecutando idf.py frogfs-flash .
Frogfs espera un archivo de configuración YAML. Hay 3 secciones diferentes: definir, recoger y filtrar. Todo pero recolectar es opcional.
Definir es una lista o dict de definiciones variables. Hay 2 variables predefinidas: $cwd y $frogfs . También puede hacer referencia a variables de entorno con la sintaxis ${ENV:varname} .
Recopile archivos y directorios de Up 'reún' y los coloca en la raíz de Frogfs. Los patrones del globo están permitidos en el componente 'Basename' de la ruta. Hay 3 formas de especificar fuentes; Cn serán una cadena, lista o diccionario. Si es una cadena, la (s) ruta (s) se convierte en el directorio raíz. Si es una lista, las rutas se fusionan en orden y se convierten en el directorio raíz. Si se usa un dict, las rutas se fusionan en el destino de elección; La cadena vacía es el directorio raíz. Las variables se amplían tanto para la fuente como para el destino.
Filtro le permite realizar un postprocesamiento en los archivos antes de que se integren. El filtro es una lista o dict de dicts; con un patrón global en una lista de verbos. Los varibales se expanden y todos los patrones se evalúan para cada archivo o directorio, de arriba hacia abajo. Las transformaciones se aplican primero, luego una compresión final opcional antes de almacenar en caché el archivo.
Los verbos se aplican en orden descendente. Puede prefijo un transformaciones o el verbo compress con no para deshabilitarlo. Hay un par de verbos especiales: discard que evita la inclusión y cache (predeterminado), que almacena en caché el archivo en el caché de compilación. Consulte frogfs_example.yaml , por ejemplo, el uso.
Hay dos interfaces disponibles: la API desnuda o cuando se usa IDF hay la interfaz VFS que se acumula en la parte superior de la API desnuda. Debe usar la interfaz VFS en proyectos IDF, ya que utiliza las funciones portátiles y familiares posix y stdio C con ella. Sin embargo, no hay nada que le impida mezclar y combinar al mismo tiempo.
Requries de configuración que definen una estructura frogfs_config_t y la pasan a frogfs_init . Dos formas diferentes de especificar el sistema de archivos:
addr : frogfs_config_t frogfs_config = {
. addr = frogfs_bin ,
};part_label : frogfs_config_t frogfs_config = {
. part_label = "storage" ,
}; Entonces es solo una cuestión de pasar la función frogfs_config a frogfs_init y verificar su variable de retorno:
frogfs_fs_t * fs = frogfs_init ( & frogfs_config );
assert ( fs != NULL ); Cuando se realiza, y todos los mangos de archivo están cerrados, puede llamar a frogfs_deinit :
frogfs_deinit ( fs ); La interfaz VFS tiene un método similar de inicialización; Defina una estructura 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 );Debajo del capó hay una tabla de hash que consiste en hashes de ruta DJB2 a las compensaciones de entrada, que permiten búsqueda rápida utilizando un algoritmo de búsqueda binario. Todas las entradas, excepto la entrada de la raíz, tienen una compensación de localización principal. Las entradas de directorio tienen una lista ordenada de compensaciones a las entradas infantiles.
Los binarios de Frogfs se pueden integrar en su aplicación o acceder mediante E/S mapeada de memoria. No es posible (en este momento) usar Frogfs sin el sistema de archivos binario existente en el espacio de direcciones de datos.
La creación de un sistema de archivos FrogFS se maneja mediante una sola herramienta, tools/mkfrogfs.py . Utiliza transformaciones en el directorio tools , o puede agregar sus propias transformaciones creando un directorio tools en su directorio raíz de proyectos, con un nombre de archivo que comienza con transform- y finalización con .js o .py . Las herramientas de transformación toman datos en stdin y producen salida en stdout.
Tanto la transformación como los compresores pueden aceptar argumentos. Consulte frogfs_example.yaml para un ejemplo.
Frogfs se dividió del proyecto LibesphTTPD de Chris Morgan (Chmorgan) (MPL 2.0), que es una horquilla de LibesphTPD (cerveza) de Jeroen Domburg (Sprite_TM). Este proyecto nunca habría existido sin ellos.
¡Gracias a todos los contribuyentes a este proyecto!