Frogfs(快速读取的通用文件系统)是一个专为嵌入式使用的读取文件系统。它可以轻松地与CMAKE项目一起使用,包括ESP-IDF。它具有内置过滤器来节省空间。使用默认过滤器frogfs-clockwise-demo中的文件减少了大约一半。以下是示例存储库的链接:
转换过滤器包括:
压缩过滤器包括:
变换过滤器旨在是编译时间操作,不会产生运行时间成本,而压缩过滤器则预计会产生运行时压缩成本。
对于HTTP服务器,Zlib(Deflate),Brotli(BR)或GZIP压缩文件,这意味着可以通过未触及的!这节省了处理时间和带宽。但是请注意,有些浏览器不接受其他HTTP(仅HTTP)的Brotli内容。
要与ESP-IDF一起使用此组件,在您的项目目录中运行
idf.py add-dependency jkent/frogfs
将frogfs嵌入您的项目二进制中,并带有foring cmake函数:
target_add_frogfs(<target> [CONFIG yaml] [NAME name])
如果未指定配置,将使用frogfs.yaml 。如果未指定名称,则将默认为frogfs 。
作为ESP-IDF的一个例子,在您项目的高级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 。
这是您可以添加到toplevel cmakelists.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)您可以通过运行idf.py frogfs-flash调用闪存过程。
Frogfs期望YAML配置文件。有3个不同的部分:定义,收集和过滤。除了收集外,所有内容都是可选的。
定义是可变定义的列表或dict。有2个预定义的变量: $cwd和$frogfs 。您还可以使用${ENV:varname}语法引用环境变量。
收集“收集”文件和目录,然后将它们放在Frogfs根中。允许在路径的“ basename”组件中允许球形模式。有3种指定资源的方法;他们是字符串,列表或字典。如果是字符串,则路径成为根目录。如果列表,则将路径合并为顺序并成为根目录。如果使用了dict,则将路径合并为选择的目的地;空字符串是根目录。源和目的地都扩展了变量。
过滤器允许您在集成之前对文件进行后处理。过滤器是命令的清单或命令;带有一个全球模式到动词列表。扩展Varibales,并为每个文件或目录评估所有模式,即自上而下。首先应用变换,然后在缓存文件之前进行可选的最终压缩。
动词按降序施加。您可以将变换或compress动词前缀no使用。有几个特殊的动词: discard ,可防止包含和cache (默认),该缓存缓存了构建缓存中的文件。请参阅frogfs_example.yaml ,例如用法。
有两个接口可用:裸露的API或使用IDF时,有VFS接口在裸露的API顶部构建。您应该在IDF项目中使用VFS接口,因为它使用便携式和熟悉的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二进制文件可以嵌入您的应用程序中,也可以使用内存映射的I/O访问。 (目前)不可能使用Frogfs,而没有文件系统二进制文件中存在于数据地址空间中。
Frogfs文件系统的创建由单个工具tools/mkfrogfs.py处理。它使用tools目录中的变换,也可以通过在项目root目录中创建tools目录来添加自己的转换,并以.js或.py结尾的transform-名开始。转换工具在Stdin上获取数据并在Stdout上产生输出。
转换和组合都可以接受参数。有关示例,请参见frogfs_example.yaml 。
Frogfs与Chris Morgan(Chmorgan)的Libesphttpd项目(MPL 2.0)脱离,这是Jeroen Domburg(Sprite_TM)的fork(sprite_tm)的libesphttpd(啤酒软件)。没有他们,这个项目将永远不会存在。
感谢该项目的所有贡献者!