Spiffs(SPIフラッシュファイルシステム)
V0.3.7
Copyright(c)2013-2017 Peter Andersson(Pelleplutt1976 at gmail.com)
法的項目については、ライセンスを参照してください。基本的に、ソースでやりたいことは何でもすることができます。私が責任を負わない限り、使用、変更、販売、印刷、ロールアウト、ロールアウト、喫煙。
でもフィードバックを聞くのが大好きです!
導入
Spiffsは、埋め込まれたターゲット上のSPIまたはフラッシュデバイス用のファイルシステムです。
Spiffsは、次の特性を念頭に置いて設計されています。
- 小さな(埋め込まれた)ターゲット、ヒープのないスパースラム
- データの大きな領域(ブロック)のみを消去できます
- 消去はブロック内のすべてのビットをリセットします
- 書くことは1つをゼロに引きます
- ゼロは消去することによってのみ引っ張ることができます
- レベリングを着用します
建物
mkdir build; make
それ以外の場合は、デフォルトのbuildに反対するものとして、 makefileのトップに向かってbuilddir変数を構成します。公式の詳細なテスト手順については、ホストをmake test 、 .travis.ymlを参照してください。 Spiffsをプロジェクトに統合するにはWikiを参照してください。NodemcuのSpiffsimgは、このテーマに関する良い例です。
特徴
Spiffsがすること:
- RAMの使用量が少ないために特別に設計されています
- ファイルの数とは無関係に、静的にサイズのRAMバッファーを使用します
- POSIX-LIKE API:オープン、クローズ、読み取り、書き込み、シーク、統計など
- SPIフラッシュだけでなく、任意のフラッシュで実行できます - 理論的には、マイクロプロセッサの埋め込みフラッシュにも実行できます
- 複数のSPIFFS構成は、同じターゲット、および同じSPIフラッシュデバイスでも実行できます
- 静的な摩耗レベリングを実装します
- 組み込みファイルシステムの一貫性チェック
- 高度に構成可能
Spiffsがしないこと:
- 現在、Spiffsはディレクトリをサポートしていません。フラットな構造を生成します。 PATH TMP/myfile.txtを使用してファイルを作成すると、ディレクトリTMPの下のmyfile.txtの代わりにTMP/myfile.txtというファイルが作成されます。
- リアルタイムスタックではありません。 1つの書き込み操作は、別の操作よりもはるかに長持ちする場合があります。
- スケーラビリティが悪い。 Spiffsは、小さなメモリデバイスを対象としています - SPIフラッシュ用の通常のサイズ。 〜128mbyteを超えることは、おそらく悪い考えです。これは、設計目標の副作用であり、可能な限り少ないRAMを使用します。
- 現在、悪いブロックを検出または処理しません。
- 1つの構成、1つのバイナリ。すべてのタイプの構成を処理する汎用Spiffsバイナリはありません。
知らせ
0.4.0が建設中です。これは完全な書き直しであり、基礎となる構造を変更します。したがって、ファイルシステムの以前のバージョンと互換性はありません。 APIは同じで、マイナーな変更があります。一部の構成フラグは削除され(0.4.0で必須であるため)、一部の機能は0.4.1まで脱落する可能性があります。心配や質問がある場合は、第179号で議論することができます
詳細
Spiffsの構成、統合、使用、最適化については、Wikiを参照してください。
設計については、docs/tech_specを参照してください。
一般的なSPIフラッシュドライバーについては、これを参照してください。
歴史
0.3.7
- ネガティブオフセット#158を求めることを防ぐことを修正しました
- 同じファイルで複数のFDについて更新されていないファイル記述子オフセット#157
- 削除されたファイルのために閉じていないキャッシュページを固定しました#156
- 完全にインデックス付きの最初のレベルの終了を正確に求めているときに、LSEEKバグを修正しましたlut#148
- 固定摩耗レベリングの問題#145
- Flash#130の境界外の書き込みの試みを修正しました、
- 終了#121を探すときにファイルオフセットを設定します(@sensslenに感謝します)
- Virgin Files#120でのシークを修正しました(@sensslenに感謝します)
- オプションのファイルメタデータ#128(ありがとう@cesAnta)
- AFLテストフレームワーク#100#143(@PJSGありがとう)
- テストフレームの更新
新しいAPI関数:
-
SPIFFS_update_meta, SPIFFS_fupdate_metaファイルのメタデータを更新します
新しい構成定義:
-
SPIFFS_OBJ_META_LENファイルに追加のメタデータを追加する可能性を有効にします
0.3.6
- インデックスメモリマッピング#98の範囲バグを修正します
- インデックスメモリマッピング#97を追加します
- 大規模ファイルのspiffs_readを最適化#96
- ファイルを開くために時間キャッシュを追加#95
- より堅牢なGC#93(ありがとう@dismirlian)
- 特定のキャッシュ状況で同じデータの二重書き込みを修正しました
- read_onlyビルドのオープンバグを修正しました
- spiffs_readdir#90に表示されていないファイル( @benpicco-tmpに感謝)
- キャッシュロードコードクリーンアップ#92(@niclashに感謝)
- 修正ロック/ロック解除非対称#88#87(@jackjefferson、@dpruessnerに感謝します)
- テストフレームの更新
新しいAPI関数:
-
SPIFFS_ix_mapファイルのメモリへのインデックスメタデータをマップ SPIFFS_ix_unmapファイルのUNMAPSインデックスメタデータSPIFFS_ix_remapインデックスメタデータマップのファイルオフセットを変更しますSPIFFS_bytes_to_ix_map_entriesユーティリティ、与えられた量のバイトに対して必要なベクトルの長さを取得するSPIFFS_ix_map_entries_to_bytesユーティリティ、ベクトルが与えられた長さを表すことができるバイト数を取得する
新しい構成定義:
-
SPIFFS_IX_MAPインデックスメタデータをメモリにマッピングする可能性を有効にして、より速く読む SPIFFS_TEMPORAL_FD_CACHEファイルをより速く開くための時間キャッシュを有効にしますSPIFFS_TEMPORAL_CACHE_HIT_SCORE時間的キャッシュを調整するため
0.3.5
- FSチェックのバグを修正しました
- APIは実際のエラーコード#84を返します)(@nailsありがとう)
- 非GCC#83#81のコンパイラ警告を修正(@nailsありがとう)
- フルFS#82から回復できません(@rojerに感謝)
- spiffs_o_*フラグ#80を定義します
- 長いファイル名#79の問題(@psjgありがとう)
- ファイル名バグ修正#74(@igrrありがとう)
- spiffs_eofとspiffs_tellは間違った値を返します#72(@artempisarenkoありがとう)
- テストフレームの更新の束#77#78#86(@dpreussner、@psjg aoありがとう)
0.3.4
- ユーザーコールバックファイルFUNCを追加しました。
- OBJ IDを使用した統計バグを修正しました。
- spiffs_probe_fsが追加されました
- Spiffsの読み取り専用バージョンをコンパイルする可能性を追加します
- 必要に応じて、FSの長さに依存して魔法をかけます(#59&#66を参照)(@hreintkeありがとう)
- Exposed spiffs_open_by_page_function
- ゼロサイズのファイルは#57を求めることができません( @lishen2に感謝します)
- tellおよびeof関数#54を追加します(@raburtonに感謝します)
- API文字列パラメーションconst#53を作成する(@Raburtonに感謝)
- Mount()#51()際にuser_dataを保持します(@rojerに感謝します)
新しいAPI関数:
-
SPIFFS_set_file_callback_funcファイルイベントについて通知するコールバックを登録します SPIFFS_probe_fs -fsのサイズを把握しようとするSPIフラッシュをプローブSPIFFS_open_by_pageページインデックスごとにファイルを開きますSPIFFS_eofファイルの終了に到達したかどうかをチェックしますSPIFFS_tell現在のファイルオフセットを返します
新しい構成定義:
-
SPIFFS_READ_ONLY -
SPIFFS_USE_MAGIC_LENGTH
0.3.3
0.3.2構造と互換性がない場合があります。問題#40を参照してください
- ファイルハンドルに整数オフセットを追加する可能性
- 切り捨て関数は、無料ページ#49が少なすぎると仮定します
- TRUNCATE機能#48のバグ(@paweldefeeありがとう)
- spiffs_gc.cを更新 - 不要なパラメーターを削除します(@paweldefeeに感謝します)
- 統合ドキュメントを更新します(@paweldefeeに感謝)
- 64ビットプラットフォームでポインター切り捨てを修正します(@igrrに感謝)
- ゼロサイズのファイルは読み取れません#44(@rojerに感謝)
- (詳細)obj_lu_find#42#41のmax_idの正しい計算( @lishen2に感謝)
- obj_lu_find_free#41で正しいエラーコードを確認します( @lishen2に感謝します)
- spiffs_lseekに対するmoarコメント(@igrrに感謝)
- spiffs_page_object_ix#40のパディングを修正しました(@jmattsson @lishen2に感謝します)
- GC_QUICKテストを修正しました(@jmattssonに感謝)
- spiffs_exclフラグ#36を追加します
- キャッシュが有効になっている場合、spiffs_closeは静かに失敗する可能性があります#37
- コールバック#34のユーザーデータ
- シングルトンビルドのキャッシュセットアップを無視する(ルカに感謝)
- コンピレーションエラー修正#32(@ChotaSanjivに感謝)
- AlignCand_scores(ありがとう@hefloryd)
- spiffs_cacheが0の場合はビルド警告を修正します(@ajaybhargavに感謝します)
新しい構成定義:
0.3.2
- キャッシュが多すぎる場合はキャッシュサイズを制限します(pgeiemに感謝)
- 新機能 - 制御された消去。 #23
- spiffs_renameリークファイル記述子#28(ベンピッコに感謝)
- 移動したDBGプリントは、テストフレームワークでPARAMS_TEST.Hに定義します
- lseekは結果のオフセットを返す必要があります(Heflorydに感謝)
- dbg ifdefsの固定タイプ
- spiffs_obj_idが32ビットの場合の署名/符号なしの比較についての沈黙の警告(ベンピッコに感謝)
- test_spiffs.c#21の可能性のあるエラー(yihcdaso-yeskelaに感謝)
- キャッシュは、#16の頻繁に書く可能性があります
- Moar TestRunnerの更新でさえ
- テストフレームワークの更新といくつかの追加テスト
- 次の世代のためのいくつかの考え
- セクター#13が多すぎるときにsigsevsをテストします(ありがとうwolfx2)
- GCは最適ではない場合があります#11
- 最後のブロックでobjheaderが最後にエントリーしたときに永遠のreaddirを修正
新しいAPI関数:
-
SPIFFS_gc_quick -intrusive gcを呼び出します SPIFFS_gcフルスケールの貫入GCを呼び出します
0.3.1
- 2つの返品警告を削除し、リリース時にあまりにもトリガーハッピーでした
0.3.0
- ファイルを作成するときに既存のNamecheckを追加しました
- 多くの静的分析バグ#6
- funcを変更しました
- ファイルサイズを超えて読み取るときにspiffs_readの長さを修正します
- ファイル長のテストケースを超えて読み取りを追加しました
- もう少し構成可能になりました
- MINGWでコンパイルされた競合により、「errno」から「errno」から「err_code」にスピフの名前を変更しました
- GCチェックの改善、付録バグの修正、非常に特別なケースのためのより堅牢な切り捨て
- GCはGCを先取りし、さらにうるさくすることをチェックします
- いくつかのターゲットに必要な構造アライメント、spiffs config#10で定義する
- Spiffs Files -System Magic、configで定義できます
新しい構成定義:
-
SPIFFS_USE_MAGICマウント時にマジックチェックを有効または無効にします SPIFFS_ALIGNED_OBJECT_INDEX_TABLES特定のターゲットのアライメント
新しいAPI関数:
-
SPIFFS_renameファイルの名前を変更します SPIFFS_clearerr最後のerrnoをクリアしますSPIFFS_info fsの中古バイトと合計バイトに関する情報を返しますSPIFFS_formatファイルシステムをフォーマットしますSPIFFS_mountedファイルシステムがマウントされているかどうかを確認します