frogfs(高速読み取り専用ファイルシステム)は、組み込み用に設計された読み取り専用ファイルシステムです。 ESP-IDFを含むCmakeプロジェクトで簡単に使用できます。スペースを節約するためのフィルターが組み込まれています。 frogfs-clockwise-demoのファイルは、デフォルトのフィルターを使用して約半分削減されます。以下は、リポジトリの例へのリンクです。
変換フィルターは次のとおりです。
圧縮フィルターは次のとおりです。
変換フィルターは、コンパイル時間操作であることを目的としています。コンパイル時間操作は、実行時コストが発生しない間、圧縮フィルターには実行時の減圧コストが発生すると予想されます。
これは、HTTPサーバーの場合、ZLIB(DEFLATE)、BROTLI(BR)、またはGZIP圧縮ファイルを手付かずに渡すことができることを意味します。これにより、処理時間と帯域幅が節約されます。ただし、一部のブラウザはBrotliコンテンツの他のHTTPを受け入れないことに注意してください(HTTPSのみ)。
このコンポーネントをESP-IDFで使用するには、プロジェクトディレクトリ内で実行されます
idf.py add-dependency jkent/frogfs
folowing cmake関数を使用して、プロジェクトバイナリ内にfrogfsを埋め込みます。
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では、これにより、これら2つのグローバルシンボルがアプリケーションが使用できます。
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に追加できるものの例です。
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ルートに配置します。パスの「ベースネーム」コンポーネントでは、グローブパターンが許可されています。ソースを指定するには3つの方法があります。それらは、文字列、リスト、または辞書です。文字列の場合、パスはルートディレクトリになります。リストの場合、パスは順番にマージされ、ルートディレクトリになります。 DICTが使用される場合、パスは選択の目的地に統合されます。ルートディレクトリである空の文字列。変数は、ソースと宛先の両方に対して拡張されます。
フィルターを使用すると、ファイルが統合される前に後処理を行うことができます。フィルターは、dictのリストまたはdictです。動詞のリストにグローブパターンがあります。バリバレは拡張され、すべてのパターンが各ファイルまたはディレクトリの上下で評価されます。最初に変換が適用され、次にファイルをキャッシュする前にオプションの最終圧縮を適用します。
動詞は降順で適用されます。無効にするnoなく、変換またはcompress動詞を接頭することができます。いくつかの特別な動詞があります:包含とcache (デフォルト)を防ぐdiscard 、ビルドキャッシュでファイルをキャッシュします。 frogfs_example.yamlを参照してください。
2つのインターフェイスが利用可能です。ベアAPIまたはIDFを使用する場合、ベアAPIの上に構築されるVFSインターフェイスがあります。 IDFプロジェクトでVFSインターフェイスを使用する必要があります。これは、ポータブルで馴染みのあるposixおよびstdio C機能を使用しているためです。ただし、両方を同時に混ぜたり一致させることを妨げるものはありません。
frogfs_config_t構造を定義し、それをfrogfs_initに渡す構成requries。ファイルシステムを指定する2つの異なる方法:
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を使用してアクセスできます。データアドレス空間に存在するファイルシステムバイナリなしでFROGFを使用することはできません。
Frogfsファイルシステムの作成は、単一のツール、 tools/mkfrogfs.pyで処理されます。 tools DirectoryでTransformsを使用するか、プロジェクトルートディレクトリにtoolsディレクトリを作成することで独自の変換を追加することができます。ファイル名はtransform-から始まり、 .jsまたは.pyで終了します。 Transform ToolsはStdinのデータを取得し、Stdoutで出力を生成します。
変換とコンプレッサーの両方が議論を受け入れることができます。例については、 frogfs_example.yamlを参照してください。
Frogfsは、Chris Morgan(Chmorgan)のLibesphttpdプロジェクト(MPL 2.0)から分割されました。このプロジェクトは彼らなしでは決して存在しなかったでしょう。
このプロジェクトへのすべての貢献者に感謝します!