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(啤酒軟件)。沒有他們,這個項目將永遠不會存在。
感謝該項目的所有貢獻者!