O Frogfs (sistema de arquivos de uso geral rápido rápido) é um sistema de arquivos somente leitura projetado para uso incorporado. Pode ser facilmente usado com um projeto CMake-incluindo ESP-IDF. Possui filtros embutidos para economizar espaço. Os arquivos no frogfs-clockwise-demo são reduzidos pela metade usando os filtros padrão. Aqui estão os links para os repositórios de exemplo:
Os filtros de transformação incluem:
Os filtros de compressão incluem:
Os filtros de transformação devem ser operações de tempo de compilação que não incorrem em um custo de tempo de execução, enquanto os filtros de compressão devem incorrer em um custo de descompressão em tempo de execução .
Isso significa para um servidor HTTP, ZLIB (Deflate), Brotli (BR) ou arquivos compactados GZIP podem ser passados por meio de intocados! Isso economiza tempo de processamento e largura de banda. Cuidado, no entanto, que alguns navegadores não aceitam o Brotli Content Outro HTTP (apenas HTTPS).
Para usar este componente com o ESP-IDF, dentro do seu diretório de projetos, execução
idf.py add-dependency jkent/frogfs
Incorporar Frogfs em seu projeto binário com a função CMake.
target_add_frogfs(<target> [CONFIG yaml] [NAME name])
Se a configuração não for especificada, frogfs.yaml será usado. Se o nome não for especificado, ele será padrão para frogfs .
Como exemplo para o ESP-IDF, nos cmakelists de Toplevel do seu projeto.txt:
cmake_minimum_required ( VERSION 3.16)
include ( $ENV{IDF_PATH} /tools/cmake/project.cmake)
project (my_project)
target_add_frogfs( ${PROJECT_NAME} .elf)Em C, isso resulta nesses dois símbolos globais disponíveis para o seu aplicativo:
extern const uint8_t frogfs_bin [];
extern const size_t frogfs_bin_len ; Você tem a opção de criar um binário sem vinculá -lo ao seu aplicativo. Uma função cmake é fornecida para produzir um binário com o alvo generate_${name} .
declare_frogfs_bin(path [CONFIG yaml] [NAME name])
Se a configuração não for especificada, frogfs.yaml será usado. Se o nome não for especificado, frogfs será usado.
Aqui está um exemplo do que você pode adicionar aos seus 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) Você pode invocar o processo flash executando idf.py frogfs-flash .
O Frogfs espera um arquivo de configuração da YAML. Existem 3 seções diferentes: Defina, colete e filtra. Todos, exceto o coleção, são opcionais.
Definir é uma lista ou ditado de definições variáveis. Existem 2 variáveis predefinidas: $cwd e $frogfs . Você também pode referenciar variáveis de ambiente com a sintaxe ${ENV:varname} .
Colete os arquivos e os diretórios 'reúne' e os coloca na raiz dos sapos. Os padrões globais são permitidos no componente 'base basenas' do caminho. Existem 3 maneiras de especificar fontes; Eles são uma string, lista ou dicionário. Se for uma string, os caminhos se tornam o diretório raiz. Se uma lista, os caminhos são mesclados em ordem e se tornam o diretório raiz. Se um ditado for usado, os caminhos serão mesclados no destino de escolha; String vazia sendo o diretório raiz. As variáveis são expandidas para fonte e destino.
O filtro permite que você faça o pós-processamento nos arquivos antes que eles sejam integrados. O filtro é uma lista ou ditado de ditos; com um padrão global para uma lista de verbos. As varibalas são expandidas e todos os padrões são avaliados para cada arquivo ou diretório, de cima para baixo. As transformações são aplicadas primeiro, depois uma compactação final opcional antes de armazenar o arquivo.
Os verbos são aplicados em ordem decrescente. Você pode prefixar a transformação ou o verbo compress no desativá -lo. Existem alguns verbos especiais: discard o que impede a inclusão e cache (padrão), que armazenam o arquivo no cache de construção. Consulte frogfs_example.yaml , por exemplo, uso.
Duas interfaces estão disponíveis: a API nua ou ao usar o IDF, existe a interface VFS que se baseia no topo da API nua. Você deve usar a interface VFS em projetos IDF, pois ela usa as funções posix e stdio C portáteis e familiares. No entanto, não há nada impedindo que você misture e combine ambos ao mesmo tempo.
RECIMENTO DE CONFIGURAÇÃO Definindo uma estrutura frogfs_config_t e passando -a para frogfs_init . Duas maneiras diferentes de especificar o sistema de arquivos:
addr : frogfs_config_t frogfs_config = {
. addr = frogfs_bin ,
};part_label : frogfs_config_t frogfs_config = {
. part_label = "storage" ,
}; Então é apenas uma questão de passar o frogfs_config para a função frogfs_init e verificar sua variável de retorno:
frogfs_fs_t * fs = frogfs_init ( & frogfs_config );
assert ( fs != NULL ); Quando terminar, e todas as alças de arquivo são fechadas, você pode ligar para frogfs_deinit :
frogfs_deinit ( fs ); A interface VFS possui um método semelhante de inicialização; Você define uma estrutura 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 );Sob o capô, existe uma tabela de hash composta por hashes do caminho do DJB2 nas compensações de entrada, que permitem pesquisas rápidas usando um algoritmo de pesquisa binária. Todas as entradas, exceto a entrada da raiz, têm um deslocamento do localizador de pais. As entradas de diretório têm uma lista classificada de compensações em entradas infantis.
Os binários de Frogfs podem ser incorporados no seu aplicativo ou acessados usando a E/S mapeada de memória. Não é possível (neste momento) usar o Frogfs sem o sistema de arquivos binário existente no espaço de endereço de dados.
A criação de um sistema de arquivos Frogfs é tratada por uma única ferramenta, tools/mkfrogfs.py . Ele usa transformações no diretório tools , ou você pode adicionar suas próprias transformações criando um diretório tools no diretório raiz de seus projetos, com um nome de arquivo começando com transform- e terminando com .js ou .py . As ferramentas de transformação pegam dados sobre o stdin e produzem saída no stdout.
Ambas as transformadas e os compositores podem aceitar argumentos. Consulte frogfs_example.yaml para um exemplo.
O Frogfs foi dividido no projeto Libesphttpd de Chris Morgan (Chmorgan) (MPL 2.0), que é um garfo de Jeroen Domburg (Sprite_TM) Libesphttpd (ware). Este projeto nunca teria existido sem eles.
Obrigado a todos os colaboradores deste projeto!