FatFs R0.11a, released September 5, 2015

This commit is contained in:
Christopher Williams
2015-10-19 08:53:27 -07:00
parent 095cc0fc01
commit 95374bbf12
81 changed files with 5038 additions and 4673 deletions
+22 -21
View File
@@ -43,10 +43,10 @@ FatFsモジュールはANSI C(C89)準拠で記述されているので、普通
<p>下に示す依存関係図は、FatFsモジュール利用の組み込みシステムにおける代表的な構成を示します。</p>
<p><img src="../img/modules.png" width="580" height="280" alt="システム構成図"></p>
<p>(a) FatFs用に書かれたディスク モジュールがある場合は、そのまま追加するだけです。 (b) しかし、多くの既存のディスク モジュールはそのAPIをFatFsに合わせるため、グルー関数が必要になるでしょう。</p>
<p><img src="../img/funcs.png" width="680" height="430" alt="functional diagram"></p>
<p><img src="../img/funcs.png" width="680" height="420" alt="functional diagram"></p>
<h4>ユーザの作成する関数</h4>
<p>ポーティング作業は、要求されるデバイス制御関数を用意することが全てで、それ以外にすることは何もありません。既に動作しているデバイス制御モジュールがあるなら、そのAPIをFatFsに合わせるかグルー関数を介してつなぐだけで済みますが、無い場合はほかから移植するか最初から書くかする必要があります。定義されている全ての関数が常に必要なわけではありません。例えば、リード オンリ構成では書き込み系関数は必要ありません。次の表に構成オプションと要求される関数の対応を示します。</p>
<p>ポーティング作業は、要求されるデバイス制御関数を用意することが全てで、それ以外にすることは何もありません。既に動作しているデバイス制御モジュールがあるなら、そのAPIをFatFsに合わせるかグルー関数を介してつなぐだけで済みますが、無い場合はほかから移植するか最初から書くかする必要があります。定義されている全ての関数が常に必要なわけではありません。例えば、リード オンリ構成では書き込み系関数は必要ありません。次の表に構成オプションと要求される関数の対応を示します。</p>
<table class="lst2">
<tr><th>必要な関数</th><th>必要となる条件</th><th>備考</th></tr>
<tr><td>disk_status<br>disk_initialize<br>disk_read</td><td>常時</td><td rowspan="5">ffsample.zip (サンプル)<br>その他web上に多数</td></tr>
@@ -54,7 +54,7 @@ FatFsモジュールはANSI C(C89)準拠で記述されているので、普通
<tr><td>disk_ioctl (GET_SECTOR_COUNT)<br>disk_ioctl (GET_BLOCK_SIZE)</td><td>_USE_MKFS == 1</td></tr>
<tr><td>disk_ioctl (GET_SECTOR_SIZE)</td><td>_MAX_SS != _MIN_SS</td></tr>
<tr><td>disk_ioctl (CTRL_TRIM)</td><td>_USE_TRIM == 1</td></tr>
<tr><td>ff_convert<br>ff_wtoupper</td><td>_USE_LFN &gt;= 1</td><td>option/unicode.c</td></tr>
<tr><td>ff_convert<br>ff_wtoupper</td><td>_USE_LFN != 0</td><td>option/unicode.cをプロジェクトに<br>加えればよい</td></tr>
<tr><td>ff_cre_syncobj<br>ff_rel_grant<br>ff_req_grant<br>ff_del_syncobj</td><td>_FS_REENTRANT == 1</td><td rowspan="2">option/syscall.c (サンプル)</td></tr>
<tr><td>ff_mem_alloc<br>ff_mem_free</td><td>_USE_LFN == 3</td></tr>
</table>
@@ -101,9 +101,9 @@ _WORD_ACCESS 0 or 1 (Set by processor architecture)
<div class="para doc" id="reduce">
<h3>モジュール サイズの縮小</h3>
<p>次の表は構成オプションの設定値によりどの機能が削除されるかを示します。使用するAPI関数の行にxが無ければその関数は使用可能です。</p>
<p>次の表は<a href="config.html">構成オプション</a>の設定値によりどの機能が削除されるかを示します。使用するAPI関数の行にxが無ければその関数は使用可能です。</p>
<table class="lst2">
<tr><td rowspan="2">Function</td><td colspan="4">_FS_MINIMIZE</td><td colspan="2">_FS_READONLY</td><td colspan="2">_USE_STRFUNC</td><td colspan="3">_FS_RPATH</td><td colspan="2">_FS_LABEL</td><td colspan="2">_USE_MKFS</td><td colspan="2">_USE_FORWARD</td><td colspan="2">_MULTI_PARTITION</td></tr>
<tr><td rowspan="2">Function</td><td colspan="4">_FS_MINIMIZE</td><td colspan="2">_FS_READONLY</td><td colspan="2">_USE_STRFUNC</td><td colspan="3">_FS_RPATH</td><td colspan="2">_USE_LABEL</td><td colspan="2">_USE_MKFS</td><td colspan="2">_USE_FORWARD</td><td colspan="2">_MULTI_PARTITION</td></tr>
<tr><td>0</td><td>1</td><td>2</td><td>3</td><td>0</td><td>1</td><td>0&nbsp;&nbsp;</td><td>1/2</td><td>0</td><td>1</td><td>2</td><td>0</td><td>1</td><td>0</td><td>1</td><td>0</td><td>1</td><td>0/1</td><td>2</td></tr>
<tr class="lst3"><td>f_mount</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>f_open</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
@@ -140,7 +140,7 @@ _WORD_ACCESS 0 or 1 (Set by processor architecture)
<div class="para doc" id="lfn">
<h3>長いファイル名</h3>
<p>FatFsモジュールは、長いファイル名(LFN)をサポートします。ファイルに付けられた2つの異なる名前(短いファル名と長いファイル名)は、<tt>f_readdir</tt>関数を除くファイル操作関数において透過です。デフォルト構成では、LFN機能はOFFになっています。LFN機能を有効にするには、<tt>_USE_LFN</tt>を1,2または3に設定し、<tt>option/unicode.c</tt>をプロジェクトに追加します。LFN機能は、加えてある程度のワーク エリア(LFN操作バッファ)を必要とします。バッファ長は使用できるメモリに応じて<tt>_MAX_LFN</tt>オプションで構成されることができます。LFNの長さは最大255文字に達するので、LFN完全対応のためには<tt>_MAX_LFN</tt>は255に設定されるべきです。与えられたファイル名に対してバッファ長が不足した場合、ファイル関数は<tt>FR_INVALID_NAME</tt>で失敗します。</p>
<p>FatFsモジュールは、長いファイル名(LFN)をサポートします。ファイルに付けられた2つの異なる名前(短いファル名と長いファイル名)は、<tt>f_readdir</tt>関数を除くファイル操作関数において透過です。デフォルト構成では、LFN機能はOFFになっています。LFN機能を有効にするには、<tt><a href="config.html#use_lfn">_USE_LFN</a></tt>を1,2または3に設定し、<tt>option/unicode.c</tt>をプロジェクトに追加します。LFN機能は、加えてある程度のワーク エリア(LFN操作バッファ)を必要とします。バッファ長は使用できるメモリに応じて<tt><a href="config.html#max_lfn">_MAX_LFN</a></tt>オプションで構成されることができます。LFNの長さは最大255文字に達するので、LFN完全対応のためには<tt>_MAX_LFN</tt>は255に設定されるべきです。与えられたファイル名に対してバッファ長が不足した場合、ファイル関数は<tt>FR_INVALID_NAME</tt>で失敗します。</p>
<p>ファイル関数に再入を行う条件の下でLFN機能を使用する場合は、<tt>_USE_LFN</tt>は2または3に設定されなければなりません。この場合、ファイル関数はワーク エリアを動的に確保(スタックまたはヒープ)します。ワーク エリアのサイズは、<tt>(_MAX_LFN + 1) * 2</tt>バイトになるので、スタック等のサイズはそれを考慮した十分な余裕がなければなりません。</p>
<table class="lst2 rset">
<caption>LFN構成 at CM3</caption>
@@ -157,21 +157,22 @@ _WORD_ACCESS 0 or 1 (Set by processor architecture)
<div class="para doc" id="unicode">
<h3>Unicode入出力への対応</h3>
<p>FatFs API上におけるファイル名等の文字列データの入出力は、デフォルトではANSI/OEMコードで行われますが、これをUnicode(UTF-16)に切り替えることもできます(<tt>_LFN_UNICODE</tt>オプションで設定)。つまり、これはFatFsがLFN機能に完全対応していることを意味します。Unicodeのファイル名に関する詳細は、<a href="filename.html#uni">パス名のフォーマット</a>を参照してください。</p>
<p>FatFs API上におけるファイル名等の文字列データの入出力は、デフォルトではANSI/OEMコードで行われますが、これをUnicode(UTF-16)に切り替えることもできます(<tt><a href="config.html#lfn_unicode">_LFN_UNICODE</a></tt>オプションで設定)。つまり、これはFatFsがLFN機能に完全対応していることを意味します。Unicodeのファイル名に関する詳細は、<a href="filename.html#uni">パス名のフォーマット</a>を参照してください。</p>
</div>
<div class="para doc" id="reentrant">
<h3>リエントランシー</h3>
<p>互いに異なるボリュームに対するファイル操作はリエントラントで、常に同時平行に動作できます。同じボリュームに対してはデフォルトではリエントラントではありませんが、<tt>_FS_REENTRANT</tt>オプションでリエントラント(スレッド セーフ)にすることはできます。この場合、OS依存の同期オブジェクト操作関数<tt>ff_cre_syncobj, ff_del_syncobj, ff_req_grant, ff_rel_grant</tt>関数もまたプロジェクトに追加されなければなりません。サンプル コードと解説は<tt>option/syncobj.c</tt>にあります。</p>
<p>この場合、あるタスクがボリュームを使用中に他のタスクからそのボリュームに対するファイル関数が呼び出されると、そのアクセスは先のタスクがファイル関数を抜けるまでブロックされます。もし、待ち時間が<tt>_TIMEOUT</tt>で指定された期間を越すと、その関数<tt>FR_TIMEOUT</tt>でアボートします。いくつかのRTOSではタイムアウト機能はサポートされないかも知れません</p>
<p>ひとつの例外が<tt>f_mount, f_mkfs, f_fdisk</tt>関数にあります。これらの関数は同じボリューム(または関連する物理ドライブ)に対してリエントラントではありません。これらの関数を使用するときは、アプリケーション レベルで排他制御しなければなりません。</p>
<p>注: このセクションはFatFsモジュールそれ自体のリエントランシーについて説明しています。その下位のディスクI/Oモジュールのリエントランシーに関しては何の前提もありません。</p>
<p>互いに異なるボリュームに対するファイル操作は構成にかかわらずリエントラントで、常に同時平行に動作できます。</p>
<p>同じボリュームに対してはデフォルトではリエントラントではありませんが、<tt><a href="config.html#fs_reentrant">_FS_REENTRANT</a></tt>オプションでリエントラント(スレッド セーフ)にすることはできます。この場合、OS依存の同期オブジェクト操作関数<tt>ff_cre_syncobj, ff_del_syncobj, ff_req_grant, ff_rel_grant</tt>関数もまたプロジェクトに追加されなければなりません。サンプル コードと解説は<tt>option/syncobj.c</tt>にあります</p>
<p>この場合、あるタスクがボリュームを使用中に他のタスクからそのボリュームに対するファイル関数が呼び出されると、そのアクセスは先のタスクがファイル関数を抜けるまでサスペンドされます。待ち時間が<tt>_TIMEOUT</tt>で指定された期間を越えた場合、その関数は<tt>FR_TIMEOUT</tt>でアボートします。いくつかのRTOSではタイムアウト機能はサポートされないかも知れません。</p>
<p>ひとつの例外が<tt>f_mount, f_mkfs, f_fdisk</tt>関数にあります。これらのボリューム制御関数は同じボリューム(または関連する物理ドライブ)に対してリエントラントではありません。これらの関数を使用するときは、アプリケーション レベルで排他制御しなければなりません。</p>
<p>注: このセクションはFatFsモジュールそれ自体のリエントランシーについて説明しています。その下位のディスクI/Oモジュールについては、FatFs APIに再入を行う条件では少なくともスレッド セーフである必要があります。</p>
</div>
<div class="para doc" id="dup">
<h3>多重ファイル アクセス</h3>
<p>FatFsモジュールではデフォルトでは多重アクセス制御機能をサポートしていません。ファイルに対する多重アクセスは、そのアクセス モードによって制限されます。一つのファイルに対する多重オープンは、それらが全てリード モードのときに限って許可されます。書き込みモードを含む多重オープン、また開かれているファイルに対するリネームや削除を行ってはなりません。さもないと、そのボリュームのFAT構造が破壊される可能性があります。</p>
<p><tt>_FS_LOCK</tt>に1以上の値(値は同時に管理できるファイル数)をセットすることで多重アクセス制御機能が有効になり、ファイル単位のアクセス制御を自動で行うこともできます。この場合、上記のルールを破ったオープン・リネーム・削除を試みると、その関数は<tt>FR_LOCKED</tt>で失敗します。また、<tt>_FS_LOCK</tt>を越える数のファイルやサブ ディレクトリを同時にオープンしようとすると、<tt>FR_TOO_MANY_OPEN_FILES</tt>で失敗します。</p>
<p><tt><a href="config.html#fs_lock">_FS_LOCK</a></tt>に1以上の値(値は同時に管理できるファイル数)をセットすることで多重アクセス制御機能が有効になり、ファイル単位のアクセス制御を自動で行うこともできます。この場合、上記のルールを破ったオープン・リネーム・削除を試みると、その関数は<tt>FR_LOCKED</tt>で失敗します。また、<tt>_FS_LOCK</tt>を越える数のファイルやサブ ディレクトリを同時にオープンしようとすると、<tt>FR_TOO_MANY_OPEN_FILES</tt>で失敗します。</p>
</div>
<div class="para doc" id="fs1">
@@ -186,7 +187,7 @@ _WORD_ACCESS 0 or 1 (Set by processor architecture)
<p>図3. セクタ アラインド リード<br>
<img src="../img/f3.png" width="490" height="119" alt="fig.3">
</p>
<p>ファイルI/Oバッファはセクタの一部のデータを読み書きするためのセクタ バッファを意味します。セクタ バッファは、それぞれのファイル オブジェクト内のプライベート セクタ バッファまたはファイル システム オブジェクト内の共有セクタ バッファのどちらかです。バッファ構成オプションの<tt>_FS_TINY</tt>は、データ転送にどちらを使うかを決定します。タイニー バッファ(1)が選択されるとデータ メモリの消費はそれぞれのファイル オブジェクトで<tt>_MAX_SS</tt>バイト減少されます。この場合、FatFsモジュールはファイル データの転送とFAT/ディレクトリ アクセスにファイル システム オブジェクト内のセクタ バッファだけを使用します。タイニー バッファの欠点は、セクタ バッファにキャッシュされたFATデータがファイル データの転送により失われ、クラスタ境界の毎にリロードされなければならないことです。でも、悪くない性能と少ないメモリ消費の視点から多くのアプリケーションに適するでしょう。</p>
<p>ファイルI/Oバッファはセクタの一部のデータを読み書きするためのセクタ バッファを意味します。セクタ バッファは、それぞれのファイル オブジェクト内のプライベート セクタ バッファまたはファイル システム オブジェクト内の共有セクタ バッファのどちらかです。バッファ構成オプションの<tt><a href="config.html#fs_tiny">_FS_TINY</a></tt>は、データ転送にどちらを使うかを決定します。タイニー バッファ(1)が選択されるとデータ メモリの消費はそれぞれのファイル オブジェクトで<tt>_MAX_SS</tt>バイト減少されます。この場合、FatFsモジュールはファイル データの転送とFAT/ディレクトリ アクセスにファイル システム オブジェクト内のセクタ バッファだけを使用します。タイニー バッファの欠点は、セクタ バッファにキャッシュされたFATデータがファイル データの転送により失われ、クラスタ境界の毎にリロードされなければならないことです。でも、悪くない性能と少ないメモリ消費の視点から多くのアプリケーションに適するでしょう。</p>
<p>図1はセクタの一部のデータがファイルI/Oバッファを経由で転送されることを示します。図2に示される長いデータの転送では、転送データの中間の1セクタまたはそれ以上のセクタにまたがる転送データがアプリケーション バッファに直接転送されています。図3は転送データ全体がセクタ境界にアライメントされている場合を示しています。この場合、ファイルI/Oバッファは使用されません。直接転送においては最大の範囲のセクタが<tt>disk_read</tt>関数で一度に読み込まれますが、クラスタ境界を越えるマルチ セクタ転送はそれが隣接であっても行われません。</p>
<p>このように、セクタにアライメントしたファイルの読み書きへの配慮はバッファ経由のデータ転送を避け、読み書き性能は改善されるでしょう。その効果に加え、タイニー構成でキャッシュされたFATデータがファイル データの転送によりフラッシュされず、非タイニー構成と同じ性能を小さなメモリ フットプリントで達成できます。</p>
</div>
@@ -202,7 +203,7 @@ _WORD_ACCESS 0 or 1 (Set by processor architecture)
<p>フラッシュ メモリ メディアの書き込み速度はシングル セクタ書き込みの時に最も低いものになり、一回のトランザクションで転送されるセクタ数が大きくなるほど書き込み速度は向上します(図6)。この効果はバス速度が高速になるほど大きく、10倍以上の差が現れることも珍しくありません。<a href="../img/rwtest2.png">テスト結果</a>は、マルチ セクタ書き込み(W:16K, 32 sectors)がシングル セクタ書き込み(W:100, 1 sector)よりどの程度速いかを明確に示しています。大容量メディアほどシングル セクタ書き込みが遅くなる点もまた重要です。書き込みトランザクションの回数はまた、メディアの寿命にも影響してきます。つまり、同じ量のデータを書き込む場合、図6上のシングル セクタ書き込みは、図6下のマルチ セクタ書き込みに比べて16倍早くフラッシュ メモリ メディアを消耗させてしまうということです。</p>
<p>このように、アプリケーションはなるべく大きなブロック(クラスタ サイズまたは2の累乗セクタ境界にアライメントした)で読み書きを行う必要があります。もちろん、アプリケーションからメディアに至る全てのレイヤがマルチ セクタ転送に対応していないと意味がありません。残念ながら、既存のオープン ソースのドライバの多くはマルチ セクタ転送に未対応です。なお、FatFsモジュールおよびサンプル ドライバはマルチ セクタ転送に対応しています。</p>
<h4>明示的なメモリ消去</h4>
<p>通常のファイル消去では、記録されたデータに対して何らかの制御が行われるわけではなく、単にFAT上に未使用クラスタとして記録されているだけです。このため、ファイルが消去されたあともそれらは有効なメモリ ブロックとしてフラッシュ メモリ上に残ります。そこで、ファイルを消去するとき、占有していたデータ セクタを明示的に消去(つまり未使用ブロックにする)することにより、メディア内の空きブロックを増やすことができます。これにより、次にそのブロックに書き込むときの消去動作が無くなり、書き込み性能が向上する可能性があります。また、ウェアレベリングに使えるブロックが増え、メディアの耐久性も向上するかも知れません。この機能を有効にするには、構成オプションの<tt>_USE_TRIM</tt>に1を設定します。これはフラッシュ メモリ メディアの内部動作に期待した制御なので、効果があるとは限りません。また、ファイル消去の時間が延びることも考慮に入れるべきです。</p>
<p>通常のファイル消去では、記録されたデータに対して何らかの制御が行われるわけではなく、単にFAT上に未使用クラスタとして記録されているだけです。このため、ファイルが消去されたあともそれらは有効なメモリ ブロックとしてフラッシュ メモリ上に残ります。そこで、ファイルを消去するとき、占有していたデータ セクタを明示的に消去(つまり未使用ブロックにする)することにより、メディア内の空きブロックを増やすことができます。これにより、次にそのブロックに書き込むときの消去動作が無くなり、書き込み性能が向上する可能性があります。また、ウェアレベリングに使えるブロックが増え、メディアの耐久性も向上するかも知れません。この機能を有効にするには、構成オプションの<tt><a href="config.html#use_trim">_USE_TRIM</a></tt>に1を設定します。これはフラッシュ メモリ メディアの内部動作に期待した制御なので、効果があるとは限りません。また、ファイル消去の時間が延びることも考慮に入れるべきです。</p>
</div>
<div class="para doc" id="critical">
@@ -217,15 +218,15 @@ _WORD_ACCESS 0 or 1 (Set by processor architecture)
<img src="../img/f5.png" width="320" height="436" alt="fig.5">
</div>
<br class="clr">
<p>赤で示したセクションを実行中に障害が発生した場合、クロス リンクが発生して操作対象のファイル ディレクトリが失われる可能性があります。黄色で示したセクションを実行中に障害が発生した場合、つぎのうちいずれかまたは複数の結果が生じる可能性があります。</p>
<p>赤で示したセクションを実行中に中断が発生した場合、クロス リンクが発生して操作のファイルディレクトリが失われる可能性があります。黄色で示したセクションを実行中に中断が発生した場合、のうちいずれかまたは複数の結果が生じる可能性があります。</p>
<ul>
<li>書き換え中のファイルのデータが破壊される。</li>
<li>追記中のファイルがオープン前の状態に戻る。</li>
<li>新規作成されたファイルが消える。</li>
<li>新規または上書きで作成されたファイルの長さがゼロになって残る。</li>
<li>ロストチェーンの発生によりボリュームの利用効率が悪化する。</li>
<li>ファイルの一部を書き換え中: 書き換えが中途半端な状態となり、結果データが破壊される。</li>
<li>追記モードでデータ記録中: ファイルが記録開始の前の状態に戻る。</li>
<li>新規作成したファイルに記録中: そのファイルが消える。</li>
<li>新規または上書きで作成したファイルに記録中: ファイルの長さがゼロになって残る。</li>
<li>これらの障害の結果、ロスト クラスタが発生してボリュームの利用効率が悪化する。</li>
</ul>
<p>いずれも書き込み中や操作の対象でないファイルには影響はありません。これらのクリチカル セクションは、ファイルを書き込みモードで開いている時間を最小限にするか、<tt>f_sync</tt>関数を適宜使用することで図5のようにリスクを最小化することができます。</p>
<p>いずれの場合も操作の対象でないファイルには影響はありません。これらのクリチカル セクションは、ファイルを書き込みモードで開いている時間を最小限にするか、<tt>f_sync</tt>関数を適宜使用することで図5のようにリスクを最小化することができます。</p>
</div>
<div class="para doc" id="fs3">
-1
View File
@@ -36,7 +36,6 @@ FRESULT f_close (
<a href="rc.html#ok">FR_OK</a>,
<a href="rc.html#de">FR_DISK_ERR</a>,
<a href="rc.html#ie">FR_INT_ERR</a>,
<a href="rc.html#nr">FR_NOT_READY</a>,
<a href="rc.html#io">FR_INVALID_OBJECT</a>,
<a href="rc.html#tm">FR_TIMEOUT</a>
</p>
+225
View File
@@ -0,0 +1,225 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<link rel="up" title="FatFs" href="../00index_j.html">
<link rel="alternate" hreflang="en" title="English" href="../en/config.html">
<link rel="stylesheet" href="../css_j.css" type="text/css" media="screen" title="ELM Default">
<style type="text/css" media="screen" title="ELM Default">
div.doc h3 {margin-top: 4em }
div.doc h4 {margin-top: 2em }
</style>
<title>FatFs - 構成オプション</title>
</head>
<body>
<h1>構成オプション</h1>
<p>FatFsには多くの構成オプションがあり、それぞれのプロジェクトの要求に応じて柔軟に機能を構成することができます。構成オプションは、<tt>ffconf.h</tt>に記述されます。</p>
<div class="para doc" id="func">
<h3>基本機能の設定</h3>
<h4 id="fs_readonly">_FS_READONLY</h4>
<p>0:リード/ライト or 1:リード オンリ。リード オンリ構成では、<tt>f_write</tt><tt>f_sync</tt><tt>f_unlink</tt><tt>f_mkdir</tt><tt>f_chmod</tt><tt>f_rename</tt><tt>f_truncate</tt><tt>f_getfree</tt>の基本API関数およびオプションの書き込み系API関数が削除されます。</p>
<h4 id="fs_minimize">_FS_MINIMIZE</h4>
<p>基本API関数を段階的に削除します。</p>
<table class="lst1">
<tr><th></th><th>解説</th></tr>
<tr><td>0</td><td>全ての基本API関数が利用可能。</td></tr>
<tr><td>1</td><td><tt>f_stat</tt><tt>f_getfree</tt><tt>f_unlink</tt><tt>f_mkdir</tt><tt>f_chmod</tt><tt>f_utime</tt><tt>f_truncate</tt><tt>f_rename</tt>関数が削除される。</td></tr>
<tr><td>2</td><td>1に加え、<tt>f_opendir</tt><tt>f_readdir</tt><tt>f_closedir</tt>関数が削除される。</td></tr>
<tr><td>3</td><td>2に加え、<tt>f_lseek</tt>関数が削除される。</td></tr>
</table>
<h4 id="use_strfunc">_USE_STRFUNC</h4>
<p>文字列入出力API関数<tt>f_gets</tt>, <tt>f_putc</tt>, <tt>f_puts</tt> and <tt>f_printf</tt>の構成。</p>
<table class="lst1">
<tr><th></th><th>解説</th></tr>
<tr><td>0</td><td>文字列入出力API関数を使用しない。</td></tr>
<tr><td>1</td><td>文字列入出力API関数を使用する。データのLF-CRLF変換はしない。</td></tr>
<tr><td>2</td><td>文字列入出力API関数を使用する。データのLF-CRLF変換をする。</td></tr>
</table>
<h4 id="use_find">_USE_FIND</h4>
<p>フィルタ付きディレクトリ読み出し機能の構成(0:無効 または 1:有効)。有効にすると、<tt>f_findfirst</tt><tt>f_findnext</tt>関数が利用可能になります。</p>
<h4 id="use_mkfs">_USE_MKFS</h4>
<p>ボリューム作成機能の構成(0:無効 または 1:有効)。有効にすると<tt>f_mkfs</tt>関数が利用可能になります。</p>
<h4 id="use_fastseek">_USE_FASTSEEK</h4>
<p>高速シーク機能の構成(0:無効 または 1:有効)。有効にすると、<tt>f_lseek</tt><tt>f_read</tt><tt>f_write</tt>関数の高速化モードが利用可能になります。詳しくは、<a href="lseek.html">こちら</a>を参照してください。</p>
<h4 id="use_label">_USE_LABEL</h4>
<p>ボリューム ラベル操作機能の構成(0:無効 または 1:有効)。有効にすると、<tt>f_getlabel</tt><tt>f_setlabel</tt>関数が利用可能になります。</p>
<h4 id="use_forward">_USE_FORWARD</h4>
<p>ストリーミング読み出し機能の構成(0:無効 または 1:有効)。これと<tt>_FS_TINY</tt>を有効にすると、<tt>f_forward</tt>関数が利用可能になります。</p>
</div>
<div class="para doc" id="name">
<h3>名前空間とロケールの設定</h3>
<h4 id="code_page">_CODE_PAGE</h4>
<p>パス名等の文字列データのコード ページを指定します。不適切な設定は、ファイル オープン エラーの原因になる可能性があります。拡張文字が全く使われない場合は、どれを選んでも同じです。</p>
<table class="lst1">
<tr><th></th><th>解説</th></tr>
<tr><td>1</td><td>ASCII (非LFN構成でのみ有効)</td></tr>
<tr><td>437</td><td>U.S.</td></tr>
<tr><td>720</td><td>Arabic</td></tr>
<tr><td>737</td><td>Greek</td></tr>
<tr><td>771</td><td>KBL</td></tr>
<tr><td>775</td><td>Baltic</td></tr>
<tr><td>850</td><td>Latin 1</td></tr>
<tr><td>852</td><td>Latin 2</td></tr>
<tr><td>855</td><td>Cyrillic</td></tr>
<tr><td>857</td><td>Turkish</td></tr>
<tr><td>860</td><td>Portuguese</td></tr>
<tr><td>861</td><td>Icelandic</td></tr>
<tr><td>862</td><td>Hebrew</td></tr>
<tr><td>863</td><td>Canadian French</td></tr>
<tr><td>864</td><td>Arabic</td></tr>
<tr><td>865</td><td>Nordic</td></tr>
<tr><td>866</td><td>Russian</td></tr>
<tr><td>869</td><td>Greek 2</td></tr>
<tr><td>932</td><td>日本語 (DBCS)</td></tr>
<tr><td>936</td><td>簡体字中国語 (DBCS)</td></tr>
<tr><td>949</td><td>韓国語 (DBCS)</td></tr>
<tr><td>950</td><td>繁体字中国語 (DBCS)</td></tr>
</table>
<h4 id="use_lfn">_USE_LFN</h4>
<p>LFN(長いファイル名)対応を設定します。LFN機能を有効にするときは、Unicode操作関数<tt>option/unicode.c</tt>をプロジェクトに加える必要があります。また、LFN操作バッファ(<tt>(_MAX_LFN + 1) * 2</tt>バイトを占有)を使用します。バッファをスタックに確保するときは、スタック オーバ フローに注意する必要があります。ヒープに確保するときは、メモリ操作関数、<tt>ff_memalloc</tt><tt>ff_memfree</tt>(<tt>option/syscall.c</tt>にサンプルあり)、をプロジェクトに加える必要があります。</p>
<table class="lst1">
<tr><th></th><th>解説</th></tr>
<tr><td>0</td><td>LFN機能を使わない。8.3形式の名前のみ使用可能。</td></tr>
<tr><td>1</td><td>LFN機能を使う。LFN操作バッファは静的に確保。常にスレッド セーフではない。</td></tr>
<tr><td>2</td><td>LFN機能を使う。LFN操作バッファはスタックから確保。</td></tr>
<tr><td>3</td><td>LFN機能を使う。LFN操作バッファはヒープから確保。</td></tr>
</table>
<h4 id="max_lfn">_MAX_LFN</h4>
<p>LFN操作バッファのサイズを文字単位で指定(12~255)します。LFN機能が無効のときは意味を持ちません。</p>
<h4 id="lfn_unicode">_LFN_UNICODE</h4>
<p>ファイルAPI上におけるUnicode対応機能を設定します。非LFN構成のときは、0でなければなりません。LFN構成のときに1を選択すると、ファイルAPI上の文字列データ<tt>TCHAR</tt>型の定義が切り替わり、パス名等にUnicodeを使用するようになります。この機能は、文字列入出力関数にも影響します。詳しくは、<a href="filename.html#uni">こちら</a>を参照してください。</p>
<h4 id="strf_encode">_STRF_ENCODE</h4>
<p>Unicode API構成のとき、文字列入出力関数、<tt>f_gets</tt><tt>f_putc</tt><tt>f_puts</tt><tt>f_printf</tt>、におけるファイル上のエンコーディングを指定します。非Unicode API構成のときは意味を持ちません。</p>
<table class="lst1">
<tr><th></th><th>解説</th></tr>
<tr><td>0</td><td>ANSI/OEM</td></tr>
<tr><td>1</td><td>UTF-16LE</td></tr>
<tr><td>2</td><td>UTF-16BE</td></tr>
<tr><td>3</td><td>UTF-8</td></tr>
</table>
<h4 id="fs_rpath">_FS_RPATH</h4>
<p>相対パス機能を設定します。この機能は、ディレクトリ読み出し関数の出力にも影響します。詳しくは、<a href="filename.html#nam">こちら</a>を参照してください。</p>
<table class="lst1">
<tr><th></th><th>解説</th></tr>
<tr><td>0</td><td>相対パス機能を使わない。パス名は常にルート ディレクトリから辿る。</td></tr>
<tr><td>1</td><td>相対パス機能を使う。<tt>f_chdir</tt><tt>f_chdrive</tt>関数が利用可能になる。</td></tr>
<tr><td>2</td><td>1に加え、<tt>f_getcwd</tt>関数が利用可能になる。</td></tr>
</table>
</div>
<div class="para doc" id="volume">
<h3>ボリューム/物理ドライブの設定</h3>
<h4 id="volumes">_VOLUMES</h4>
<p>利用するボリューム(論理ドライブ)の数を1~9の範囲で設定します。</p>
<h4 id="str_volume_id">_STR_VOLUME_ID</h4>
<p>文字列ボリュームIDの設定(0:無効 または 1:有効)。パス名中のボリュームIDに数字に加え任意の文字列も使用できるようにするオプションです。ボリュームID文字列は<tt>_VOLUME_STRS</tt>で定義します。</p>
<h4 id="volume_strs">_VOLUME_STRS</h4>
<p>ボリュームID文字列を定義します。<tt>_VOLUMES</tt>で設定された個数の文字列を<tt>"RAM","SD","CF",...</tt> のように挙列します。使用可能な文字はA~Zおよび0~9で、先頭の項目が論理ドライブ0に対応します。</p>
<h4 id="multi_partition">_MULTI_PARTITION</h4>
<p>マルチ区画機能の設定(0:無効 または 1:有効)。無効のときは、個々の論理ドライブは同じ番号の物理ドライブに1:1で対応し、それぞれの物理ドライブ中の最初の区画に結びつけられます。マルチ区画機能を有効にすると、論理ドライブはそれぞれ任意の物理ドライブの任意の区画に結びつけることができます。マッピングは、ユーザ定義の変換テーブル<tt>VolToPart[]</tt>によって行います。また、<tt>f_fdisk</tt>関数が利用可能になります。詳しくは、<a href="filename.html#vol">こちら</a>を参照してください。</p>
<h4 id="max_ss">_MIN_SS、_MAX_SS</h4>
<p>使用する物理ドライブのセクタ サイズ(データの読み書きの最小単位)を設定します。有効な値は、512、1024、2048、4096です。<tt>_MIN_SS</tt>は最小サイズ、<tt>_MAX_SS</tt>は最大サイズを設定します。メモリ カードやハードディスクでは、常に両方に512を設定しますが、オンボード メモリや一部の光学メディアでは大きな値を設定する必要があるかも知れません。<tt>_MAX_SS &gt; _MIN_SS</tt>に設定したときは可変セクタ サイズ構成となり、<tt>disk_ioctl</tt>関数には<tt>GET_SECTOR_SIZE</tt>コマンドを実装する必要があります。</p>
<h4 id="use_trim">_USE_TRIM</h4>
<p>ATA-TRIM機能の使用の設定(0:無効 または 1:有効)。この機能を有効にしたときは、<tt>disk_ioctl</tt>関数に<tt>CTRL_TRIM</tt>コマンドを実装するべきです。</p>
<h4 id="fs_nofsinfo">_FS_NOFSINFO</h4>
<p>FAT32ボリュームのFSINFOの使用の設定(0~3)。FAT32ボリュームで必ず正確な空き容量を取得する必要があるとき、設定値のビット0をセットすると<tt>f_getfree</tt>関数はFSINFOの情報を使わずに全FATスキャンを行って空き容量を得ます。ビット1は最終割り当てクラスタ番号の利用の制御です。</p>
<table class="lst1">
<tr><th></th><th>解説</th></tr>
<tr><td>bit0=0</td><td>FSINFOの空きクラスタ情報が有効なときはそれを利用する。</td></tr>
<tr><td>bit0=1</td><td>FSINFOの空きクラスタ情報を利用しない。</td></tr>
<tr><td>bit1=0</td><td>FSINFOの最終割り当てクラスタ番号が有効なときはそれを利用する。</td></tr>
<tr><td>bit1=1</td><td>FSINFOの最終割り当てクラスタ番号を利用しない。</td></tr>
</table>
</div>
<div class="para doc" id="system">
<h3>システムの設定</h3>
<h4 id="fs_tiny">_FS_TINY</h4>
<p>ファイル データ転送バッファの構成(0:ノーマル または 1:タイニ)。タイニ構成では、ファイル オブジェクト<tt>FIL</tt>内のプライベート セクタ バッファが削除され、<tt>_MAX_SS</tt>バイト小さくなります。ファイル データの転送には、代わりにファイル システム オブジェクト<tt>FATFS</tt>内のボリューム共有セクタ バッファが使われます。</p>
<h4 id="fs_nortc">_FS_NORTC</h4>
<p>RTC機能の使用の設定(0:使用する または 1:使用しない)。システムがRTC(カレンダ時計)をサポートしない場合は、1をセットします。この場合、FatFsが変更を加えたオブジェクトのタイムスタンプはデフォルトの日時を持ちます。RTCが使用可能なときは、0を設定し、<tt>get_fattime</tt>関数をプロジェクトに加えます。リード オンリ構成ではこのオプションは意味を持ちません。</p>
<h4 id="nortc_time">_NORTC_MON、_NORTC_MDAY、_NORTC_YEAR</h4>
<p>デフォルト日時の設定。<tt>_FS_NORTC</tt>が1のとき、固定して与えられる日付を指定します。<tt>_FS_NORTC</tt>が0のとき、およびリード オンリ構成ではこれらのオプションは意味を持ちません。</p>
<h4 id="fs_lock">_FS_LOCK</h4>
<p>ファイル ロック機能の設定。このオプションは、開かれたオブジェクトに対する不正な操作の制御機能を設定します。リード オンリ構成では0に設定しなければなりません。なお、ファイル ロック機能はリエントランシーとは関係ありません。</p>
<table class="lst1">
<tr><th></th><th>解説</th></tr>
<tr><td>0</td><td>ファイル ロック機能を使わない。ボリュームの破損を防ぐため、アプリケーションは不正なファイル操作を避けなければならない。</td></tr>
<tr><td>&gt;0</td><td>ファイル ロック機能を使う。数値は同時にオープンできるファイルやサブ ディレクトリの数を設定します。</td></tr>
</table>
<h4 id="fs_reentrant">_FS_REENTRANT</h4>
<p>リエントランシーの設定(0:無効 または 1:有効)。このオプションは、FatFsモジュール自体のリエントランシー(スレッド セーフ)の設定をします。異なるボリュームに対するファイル アクセスはこのオプションに関係なく常にリエントラントで、<tt>f_mount</tt><tt>f_mkfs</tt><tt>f_fdisk</tt>などのボリューム操作関数はこのオプションに関係なく常にリエントラントではありません。同じボリュームに対するファイル アクセス(つまり、ファイル システム オブジェクトの排他使用)のみがこのオプションの制御下にあります。このオプションを有効にしたときは、同期関数である<tt>ff_req_grant</tt><tt>ff_rel_grant</tt><tt>ff_del_syncobj</tt><tt>ff_cre_syncobj</tt>をプロジェクトに追加する必要があります。サンプルが<tt>option/syscall.c</tt>にあります。</p>
<h4 id="fs_timeout">_FS_TIMEOUT</h4>
<p>タイムアウト時間の設定。待ち合わせ時間が長いときに<tt>FR_TIMEOUT</tt>でファイル関数をアボートする時間を設定します。<tt>_FS_REENTRANT</tt>が0のときは意味を持ちません。</p>
<h4 id="sync_t">_SYNC_t</h4>
<p>O/S定義の同期オブジェクトの型を設定します。例: <tt>HANDLE</tt><tt>ID</tt><tt>OS_EVENT*</tt><tt>SemaphoreHandle_t</tt>など。また、O/S機能のヘッダ ファイルを<tt>ff.c</tt>のスコープ内にインクルードする必要があります。<tt>_FS_REENTRANT</tt>が0のときは意味を持ちません。</p>
<h4 id="word_access">_WORD_ACCESS</h4>
<p>ボリューム上のワード データへのアクセス方法を設定します。唯一のプラットフォーム依存オプションです。</p>
<table class="lst1">
<tr><th></th><th>解説</th></tr>
<tr><td>0</td><td>Byte-by-byteアクセス。全てのプラットフォームでコンパチブル。</td></tr>
<tr><td>1</td><td>ワード アクセス。コード サイズが少し減るが、次の条件を共に満たしていない限り選択できない。<br>
・非アライン メモリ アクセスが常に全ての命令で使用可能。<br>
・メモリ上のバイト順がリトル エンディアン。</td></tr>
</table>
<p>次にいくつかのプロセッサにおける許可された設定を示します。</p>
<pre>
ARM7TDMI 0 *2 ColdFire 0 *1 V850E 0 *2
Cortex-M3 0 *3 Z80 0/1 V850ES 0/1
Cortex-M0 0 *2 x86 0/1 TLCS-870 0/1
AVR 0/1 RX600(LE) 0/1 TLCS-900 0/1
AVR32 0 *1 RL78 0 *2 R32C 0 *2
PIC18 0/1 SH-2 0 *1 M16C 0/1
PIC24 0 *2 H8S 0 *1 MSP430 0 *2
PIC32 0 *1 H8/300H 0 *1 8051 0/1
*1:ビッグ エンディアン
*2:非アライン メモリ アクセス不可
*3:いくつかのコンパイラがmem_cpy関数にLDM/STM命令を生成する
</pre>
</div>
<p class="foot"><a href="../00index_j.html">戻る</a></p>
</body>
</html>
+1 -1
View File
@@ -38,7 +38,7 @@ DSTATUS disk_initialize (
<div class="para desc">
<h4>解説</h4>
<p>ストレージ デバイスを初期化し、データの読み書きなど全ての動作が可能な状態にします。関数が成功すると、戻り値の<tt>STA_NOINIT</tt>フラグがクリアされます。</p>
<p><em>アプリケーションからはこの関数を呼び出してはなりません。さもないと、FATボリュームが破壊される可能性があります。エラー等により再初期化が必要なときは、<tt>f_mount</tt>関数を使用してください。</em>FatFsモジュールは、自動マウント動作により、必要に応じてこの関数を呼び出します。</p>
<p>この関数はFatFsの管理下にあり、自動マウント動作により必要に応じて呼び出されます。<em>アプリケーションからはこの関数を呼び出してはなりません。さもないと、FATボリュームが破壊される可能性があります。再初期化が必要なときは、<tt>f_mount</tt>関数を使用してください。</em></p>
</div>
<p class="foot"><a href="../00index_j.html">戻る</a></p>
+1 -1
View File
@@ -57,7 +57,7 @@ DRESULT disk_ioctl (
<tr><th>コマンド</th><th>解説</th></tr>
<tr><td>CTRL_SYNC</td><td>デバイスのデータ書き込み処理を完了させます。ドライバがライト バック キャッシュなどを持っている場合は、書き込まれていないデータを即時書き込みます。メディア上への書き込みがそれぞれ<tt>disk_write</tt>関数の中で完了する場合は、このコマンドに対してすることはありません。</td></tr>
<tr><td>GET_SECTOR_COUNT</td><td>総セクタ数の取得。<tt class="arg">buff</tt>の指す<tt>DWORD</tt>型変数にドライブ上の総セクタ数を返します。<tt>f_mkfs, f_fdisk</tt>関数内から呼び出され、作成するボリュームのサイズを決定するために使用されます。</td></tr>
<tr><td>GET_SECTOR_SIZE</td><td>セクタ サイズの取得。<tt class="arg">buff</tt>の指す<tt>WORD</tt>型変数にドライブのセクタ サイズを返します。有効値は512、1024、2048または4096です。セクタ サイズ固定(<tt>_MAX_SS ==_MIN_SS</tt>)のときはこのコマンドは使われることはなく、デバイスは常にそのセクタ サイズで動作しなければなりません。</td></tr>
<tr><td>GET_SECTOR_SIZE</td><td>セクタ サイズの取得。セクタ サイズ可変(<tt>_MAX_SS &gt; _MIN_SS</tt>)のとき、<tt>disk_initailize</tt>関数の成功に続き呼び出されるので、<tt class="arg">buff</tt>の指す<tt>WORD</tt>型変数に現在のセクタ サイズを返します。有効値は512、1024、2048または4096です。セクタ サイズ固定(<tt>_MAX_SS == _MIN_SS</tt>)のときはこのコマンドは使われることはなく、デバイスは常にそのセクタ サイズで動作しなければなりません。</td></tr>
<tr><td>GET_BLOCK_SIZE</td><td>消去ブロック サイズの取得。<tt class="arg">buff</tt>の指す<tt>DWORD</tt>型変数にフラッシュ メモリの消去ブロック サイズ(セクタ単位)を返します。1から32768の範囲で2の累乗の値でなければなりません。ブロック サイズ不明またはフラッシュ メモリ以外のデバイスでは1を返します。<tt>f_mkfs</tt>関数内でのみ使用され、作成されるボリュームのデータ領域はこの境界にアライメントされます。</td></tr>
<tr><td>CTRL_TRIM</td><td>不必要セクタの通知。<tt class="arg">buff</tt>の指す<tt>DWORD</tt>型配列には不必要になった領域 {開始セクタ,終了セクタ} を指定して呼び出されます。TRIM機能が有効(<tt>_USE_TRIM == 1</tt>)で、クラスタが解放されるとき、およびフォーマット時に呼び出されます。これは、ATAコマンド セットのTrimコマンドと等価で、この機能をサポートしないデバイスは何もする必要はありません。また、戻り値はチェックされず、結果によってFatFsの動作が影響を受けることはありません。</td></tr>
</table>
+4 -4
View File
@@ -34,7 +34,7 @@ DRESULT disk_read (
<dt>sector</dt>
<dd>読み出しを開始するセクタ番号。32ビットLBAで指定されます。</dd>
<dt>count</dt>
<dd>読み出すセクタ数(1128)</dd>
<dd>読み出すセクタ数1128の範囲で指定されます</dd>
</dl>
</div>
@@ -49,7 +49,7 @@ DRESULT disk_read (
<dt>RES_PARERR</dt>
<dd>パラメータが不正。</dd>
<dt>RES_NOTRDY</dt>
<dd>ドライブが動作可能状態ではない(初期化されていない)。</dd>
<dd>ストレージ デバイスが動作可能状態ではない(初期化されていない)。</dd>
</dl>
</div>
@@ -60,8 +60,8 @@ DRESULT disk_read (
<p><tt class="arg">buff</tt><tt>BYTE</tt>型なので、指定されるアドレスは<em>常にワード アライメントされているとは限りません</em>。非アライメント アドレスへの転送は、<a href="appnote.html#fs1">直接転送</a>において発生することがあります。もしも、ハードウェア上の制約でそのような転送が不可能なときは、この関数内で二段転送するなどして解決するか、または別の方法で対応しなければなりません。次にいくつかの対応方法を示します(いずれか一つでOK)。</p>
<ul>
<li>この関数内で解決する - 推奨</li>
<li>全ての<tt>f_read</tt>関数において、セクタ全体を含む転送を避ける - 直接転送が発生しない</li>
<li><tt>f_read(fp, buff, btr, &amp;br)</tt>関数において、<tt>(((UINT)buff &amp; 3) == (f_tell(fp) &amp; 3))</tt>を満足させる - <tt class="arg">buff</tt>のワード アライメントが保証される</li>
<li>全ての<tt>f_read()</tt>において、セクタ全体を含む転送を避ける - 直接転送が発生しない</li>
<li><tt>f_read(fp, data, btr, &amp;br)</tt>において、<tt>(((UINT)data &amp; 3) == (f_tell(fp) &amp; 3))</tt>を満足させる - 直接転送での<tt class="arg">buff</tt>のワード アライメントが保証される</li>
</ul>
<p>一般的に、複数セクタの転送要求は、ストレージ デバイスに対して可能な限りマルチ セクタ転送しなければなりません。複数のシングル セクタ読み出しに分解された場合、スループットが低下することがあります。</p>
</div>
+4 -4
View File
@@ -34,7 +34,7 @@ DRESULT disk_write (
<dt>sector</dt>
<dd>書き込みを開始するセクタ番号。32ビットLBAで指定されます。</dd>
<dt>count</dt>
<dd>書き込むセクタ数(1128)</dd>
<dd>書き込むセクタ数1128の範囲で指定されます</dd>
</dl>
</div>
@@ -51,16 +51,16 @@ DRESULT disk_write (
<dt>RES_PARERR</dt>
<dd>パラメータが不正。</dd>
<dt>RES_NOTRDY</dt>
<dd>デバイスが動作可能状態ではない(初期化されていない)。</dd>
<dd>ストレージ デバイスが動作可能状態ではない(初期化されていない)。</dd>
</dl>
</div>
<div class="para desc">
<h4>解説</h4>
<p><tt class="arg">buff</tt>に指定されるアドレスは<em>常にワード アライメントされているとは限りません</em>詳細は、<a href="dread.html"><tt>disk_read</tt>関数</a>の解説を参照してください。</p>
<p><tt class="arg">buff</tt>に指定されるアドレスは<em>常にワード アライメントされているとは限りません</em>これについては、<a href="dread.html"><tt>disk_read</tt></a>関数の解説を参照してください。</p>
<p>一般的に、複数セクタの転送要求は、デバイスに対して可能な限りマルチ セクタ転送しなければなりません。複数のシングル セクタ書き込みに分解された場合、スループットが著しく低下することがあります。</p>
<p>FatFsはディスク関数が遅延書き込み機能を持つことも想定しています。この関数から戻るとき、デバイスが書き込み中とかキャッシュに書き込まれただけなど、必ずしもメディアへの書き込みが完了している必要はありません。ただし、<tt class="arg">buff</tt>のデータは、この関数から戻ると無効となります。書き込み完了の要求は、<a href="dioctl.html"><tt>disk_ioctl</tt>関数</a><tt>CTRL_SYNC</tt>コマンドによって行われます。このような遅延書き込み機能が実装された場合、スループットをさらに向上させることができます。</p>
<p>FatFsはディスク制御レイヤが遅延書き込み機能を持つことも想定しています。この関数から戻るとき、デバイスが書き込みを実行中だったり単にライトバック キャッシュに書き込まれただけなど、必ずしもメディアへの書き込みが完了している必要はありません。ただし、<tt class="arg">buff</tt>のデータは、この関数から戻ると無効となります。書き込み完了の要求は、<a href="dioctl.html"><tt>disk_ioctl</tt></a>関数<tt>CTRL_SYNC</tt>コマンドによって行われます。このような遅延書き込み機能が実装された場合、書き込みスループットを向上させることができます。</p>
<p><em>アプリケーションからはこの関数を呼び出してはなりません。さもないと、FATボリュームが破壊される可能性があります。</em></p>
</div>
+1 -1
View File
@@ -39,7 +39,7 @@ int f_eof (
<div class="para desc">
<h4>解説</h4>
<p>この関数は、現リビジョンではマクロとして実装されています。</p>
<p>この関数は、現リビジョンではマクロとして実装されています。ファイル オブジェクトの正当性チェックや排他制御は行いません。</p>
<pre>
<span class="k">#define</span> f_eof(fp) ((int)((fp)->fptr == (fp)->fsize))
</pre>
+1 -1
View File
@@ -39,7 +39,7 @@ int f_error (
<div class="para desc">
<h4>解説</h4>
<p>この関数は、現リビジョンではマクロとして実装されています。</p>
<p>この関数は、現リビジョンではマクロとして実装されています。ファイル オブジェクトの正当性チェックや排他制御は行いません。</p>
<pre>
<span class="k">#define</span> f_error(fp) ((fp)->err)
</pre>
+1 -1
View File
@@ -48,7 +48,7 @@ DWORD get_fattime (void);
<div class="para comp">
<h4>対応情報</h4>
<p>リード オンリー構成(<tt>_FS_READONLY == 1</tt>)ではこの関数は必要とされません。</p>
<p>リード オンリー構成(<tt>_FS_READONLY == 1</tt>)または、非RTCサポート構成(<tt>_RTC_NOUSE == 1</tt>)ではこの関数は必要とされません。</p>
</div>
+8 -7
View File
@@ -15,12 +15,12 @@
<h3>ファイル ディレクトリ名</h3>
<p>FatFsモジュールでは、パス名によるファイル、ディレクトリ、ドライブの指定方法はDOS/Windows APIとほぼ同じです。パス名のフォーマットは次の通りです。</p>
<pre>"[論理ドライブ番号:][/]ディレクトリ名/ファイル名"</pre>
<p>FatFsモジュールは長いファイル名(LFN)および8.3形式ファイル名(SFN)に対応しています。LFNは、(<tt>_USE_LFN &gt; 0</tt>)のとき使用可能になります。ディレクトリ セパレータにはDOS/Windows APIと同じく<tt>'/'</tt><tt>'\'</tt>を使用します。連続したセパレータは無視され1個として扱われます。唯一の違いは、論理ドライブの指定だけです。論理ドライブ番号は、<tt>'0'</tt><tt>'9'</tt>の一文字の数字とコロンで指定し、省略した場合は<em>デフォルト ドライブ</em>(0またはカレント ドライブ)が選択されます。</p>
<p>FatFsモジュールは長いファイル名(LFN)および8.3形式ファイル名(SFN)に対応しています。LFNは、(<tt><a href="config.html#use_lfn">_USE_LFN</a> &gt; 0</tt>)のとき使用可能になります。ディレクトリ セパレータにはDOS/Windows APIと同じく<tt>'/'</tt><tt>'\'</tt>を使用します。連続したセパレータは無視され1個として扱われます。唯一の違いは、論理ドライブの指定だけです。論理ドライブ番号は、<tt>'0'</tt><tt>'9'</tt>の一文字の数字とコロンで指定し、省略した場合は<em>デフォルト ドライブ</em>(0またはカレント ドライブ)が選択されます。</p>
<p>ヌル文字や制御文字(<tt>'\0'</tt><tt>'\x1F'</tt>)は、パス名の終端として認識されます。パス名に先行あるいは中に含まれるスペースは、LFN構成では名前の一部として有効ですが、非LFN構成ではスペースはパス名の終端として認識されます。</p>
<p>標準構成(<tt>_FS_RPATH == 0</tt>)のときは、全てのオブジェクトがルート ディレクトリから辿る絶対パスで指定されます。OS指向なカレント ディレクトリという概念は無く、またドット ディレクトリ(<tt>"."</tt><tt>".."</tt>)は使用できません。パス名先頭のセパレータは無視されます。デフォルト ドライブ番号は常に0になります。</p>
<p>相対パスを有効(<tt>_FS_RPATH == 1</tt>)にしたときは、先行するセパレータの有無によって検索開始ディレクトリが変わり、セパレータがある場合はルート ディレクトリから、無い場合は<a href="chdir.html"><tt>f_chdir</tt></a>関数で設定されるカレント ディレクトリからになります。またパス名にドット ディレクトリが使用できます。デフォルト ドライブ番号は<a href="chdrive.html"><tt>f_chdrive</tt></a>関数で設定された値となります。</p>
<p>標準構成(<tt><a href="config.html#fs_rpath">_FS_RPATH</a> == 0</tt>)のときは、全てのオブジェクトがルート ディレクトリから辿る絶対パスで指定されます。OS指向なカレント ディレクトリという概念は無く、またドット ディレクトリ(<tt>"."</tt><tt>".."</tt>)は使用できません。パス名先頭のセパレータは無視されます。デフォルト ドライブ番号は常に0になります。</p>
<p>相対パスを有効(<tt>_FS_RPATH &gt;= 1</tt>)にしたときは、先行するセパレータの有無によって検索開始ディレクトリが変わり、セパレータがある場合はルート ディレクトリから、無い場合は<a href="chdir.html"><tt>f_chdir</tt></a>関数で設定されるカレント ディレクトリからになります。またパス名にドット ディレクトリが使用できます。デフォルト ドライブ番号は<a href="chdrive.html"><tt>f_chdrive</tt></a>関数で設定された値となります。</p>
<table class="lst2">
<tr><td>パス名の例</td><td>_FS_RPATH == 0</td><td>_FS_RPATH == 1</td></tr>
<tr><td>パス名の例</td><td>_FS_RPATH == 0</td><td>_FS_RPATH &gt;= 1</td></tr>
<tr class="lst3"><td>file.txt</td><td>ドライブ0のルート ディレクトリ下のファイル</td><td>カレント ドライブのカレント ディレクトリ下のファイル</td></tr>
<tr><td>/file.txt</td><td>ドライブ0のルート ディレクトリ下のファイル</td><td>カレント ドライブのルート ディレクトリ下のファイル</td></tr>
<tr><td></td><td>ドライブ0のルート ディレクトリ</td><td>カレント ドライブのカレント ディレクトリ</td></tr>
@@ -33,7 +33,7 @@
<tr><td>dir1/..</td><td>無効</td><td>カレント ディレクトリ</td></tr>
<tr><td>/..</td><td>無効</td><td>ルート ディレクトリ(その上は辿れない)</td></tr>
</table>
<p>また、<tt>_STR_VOLUME_ID</tt>オプションを有効にすることでドライブ番号の識別には数字のほか、<tt>"sd:file1.txt"</tt><tt>"ram:swapfile.dat"</tt>のように、任意の文字列を使用することも可能になります。</p>
<p>また、<tt><a href="config.html#str_volume_id">_STR_VOLUME_ID</a></tt>オプションを有効にすることでドライブ番号の識別には数字のほか、<tt>"sd:file1.txt"</tt><tt>"ram:swapfile.dat"</tt>のように、任意の文字列を使用することも可能になります。</p>
</div>
<div class="para doc" id="case">
@@ -45,7 +45,7 @@
<div class="para doc" id="uni">
<h3>Unicode API</h3>
<p>ファイル関数の入出力のうちファイル名やパス名を指定する引数の型は、<tt>TCHAR</tt>で定義されていますが、これは通常は<tt>char</tt>のエリアスになっています。そして、<tt>_CODE_PAGE</tt>で指定されるANSI/OEMコード(SBCSまたはDBCS)の文字列として扱われます。ファイル名入出力をUnicodeとする構成(<tt>_LFN_UNICODE == 1</tt>)にしたときは、<tt>TCHAR</tt>はワイド文字(<tt>WCHAR, unsigned short</tt>)に切り替わり、パス名の入出力にUnicodeを使用するようになります。これによりLFN規格に完全対応となり、ファイル名としてANSI/OEMコードにない文字(たとえば ✝☪✡☸☭など)も使用できます。この設定は文字列入出力関数においては、データ型とファイル上のエンコーディングに影響を与えます。リテラル文字列を定義するとき、次に示すように<tt>_T(s)</tt>および<tt>_TEXT(s)</tt>マクロを使ってANSI/OEMとUnicodeを自動切り替えすることができます。</p>
<p>ファイル関数の入出力のうちファイル名やパス名を指定する引数の型は、<tt>TCHAR</tt>で定義されていますが、これは通常は<tt>char</tt>のエリアスになっています。そして、<tt><a href="config.html#code_page">_CODE_PAGE</a></tt>で指定されるANSI/OEMコード(SBCSまたはDBCS)の文字列として扱われます。ファイル名入出力をUnicodeとする構成(<tt><a href="config.html#lfn_unicode">_LFN_UNICODE</a> == 1</tt>)にしたときは、<tt>TCHAR</tt>はワイド文字(<tt>WCHAR, unsigned short</tt>)に切り替わり、パス名の入出力にUnicodeを使用するようになります。これによりLFN規格に完全対応となり、ファイル名としてANSI/OEMコードにない文字(たとえば ✝☪✡☸☭など)も使用できます。この設定は文字列入出力関数においては、データ型とファイル上のエンコーディングに影響を与えます。リテラル文字列を定義するとき、次に示すように<tt>_T(s)</tt>および<tt>_TEXT(s)</tt>マクロを使ってANSI/OEMとUnicodeを自動切り替えすることができます。</p>
<pre>
f_open(fp, "filename.txt", FA_READ); <span class="c">/* ANSI/OEM専用コード */</span>
f_open(fp, L"filename.txt", FA_READ); <span class="c">/* Unicode専用コード */</span>
@@ -56,7 +56,7 @@
<div class="para doc" id="vol">
<h3>ボリューム管理</h3>
<p>デフォルトの構成では、それぞれの論理ドライブは同じ番号の物理ドライブに1:1で結びつけられていて、自動検出機能によりその物理ドライブ上の一つのFATボリュームがマウントされます。FATボリュームの検出は、セクタ0、第一区画~第四区画の順に行われます。</p>
<p><tt>_MULTI_PARTITION</tt>に1を指定すると、それぞれの論理ドライブに対して個別に物理ドライブ番号と区画を指定できるようになります。この構成では、論理ドライブと区画の対応を解決するためのテーブルを次に示すように定義する必要があります。</p>
<p><tt><a href="config.html#multi_partition">_MULTI_PARTITION</a></tt>に1を指定すると、それぞれの論理ドライブに対して個別に物理ドライブ番号と区画を指定できるようになります。この構成では、論理ドライブと区画の対応を解決するためのテーブルを次に示すように定義する必要があります。</p>
<pre>
例:論理ドライブ0~2を物理ドライブ0(非リムーバブル)の3つの基本区画に割り当て、
論理ドライブ3を物理ドライブ1(リムーバブル)に割り当てる場合。
@@ -77,5 +77,6 @@ PARTITION VolToPart[] = {
</ul>
</div>
<p class="foot"><a href="../00index_j.html">戻る</a></p>
</body>
</html>
+3 -3
View File
@@ -62,10 +62,10 @@ FRESULT f_findfirst (
<div class="para desc">
<h4>解説</h4>
<p><tt class="arg">path</tt>で指定されるディレクトリを開き、そのディレクトリ内の項目の検索を開始します。正常終了すると、ディレクトリ オブジェクト構造体が作成され、最初に検索名文字列に名前がマッチした項目の情報が<tt class="arg">fno</tt>の指定するファイル情報構造体にストアされます。名前のマッチする項目が見つからなかった場合は、<tt>fno-&gt;fname[]</tt>にヌル文字列が返されます。ファイル情報構造体の使い方については、<a href="readdir.html"><tt>f_readdir</tt></a>関数を参照してください。</p>
<p>マッチ パターン文字列は、ワイルドカード文字(<tt>?</tt><tt>*</tt>)を含むことができます。<tt>?</tt>は任意の1文字に、<tt>*</tt>は0文字以上の任意の文字列にマッチします。LFN構成では、SFNとLFN(あれば)の両方に対してテストを行います。現リビジョンではパターン マッチングにおいて次の点で標準システムとは異なる動作となります</p>
<p>マッチ パターン文字列は、ワイルドカード文字(<tt>?</tt><tt>*</tt>)を含むことができます。<tt>?</tt>は任意の1文字に、<tt>*</tt>は0文字以上の任意の文字列にマッチします。LFN構成では、SFNとLFN(あれば)の両方に対してテストを行います。現リビジョンではパターン マッチングにおいて次の点で標準システムとは異なる動作となります</p>
<ul>
<li><tt>"*.*"</tt>は拡張子なしの名前にマッチしない。(標準システムでは全ての名前にマッチ)</li>
<li><tt>"*."</tt>のようにピリオドで終わるパターンは、どの名前にもマッチしない。(標準システムでは拡張子無しの名前にマッチ)</li>
<li>ピリオドで終わるパターンは、どの名前にもマッチしない。(標準システムでは拡張子無しの名前にマッチ)</li>
<li><a href="filename.html#case">DBCS拡張文字</a>については、LFN構成でも非Unicode API構成ではケース センシティブとなる。</li>
</ul>
</div>
@@ -90,7 +90,7 @@ void find_image (void)
<span class="k">#if</span> _USE_LFN
char lfn[_MAX_LFN + 1];
fno.lfname = lfn;
fno.lfsize = sizeof lfn;
fno.lfsize = _MAX_LFN + 1;
<span class="k">#endif</span>
fr = f_findfirst(&amp;dj, &amp;fno, "", "dsc*.jpg"); <span class="c">/* "dsc"で始まるJPEGファイルを検索 */</span>
-1
View File
@@ -39,7 +39,6 @@ FRESULT f_findnext (
<a href="rc.html#ok">FR_OK</a>,
<a href="rc.html#de">FR_DISK_ERR</a>,
<a href="rc.html#ie">FR_INT_ERR</a>,
<a href="rc.html#nr">FR_NOT_READY</a>,
<a href="rc.html#io">FR_INVALID_OBJECT</a>,
<a href="rc.html#tm">FR_TIMEOUT</a>,
<a href="rc.html#nc">FR_NOT_ENOUGH_CORE</a>
-1
View File
@@ -45,7 +45,6 @@ FRESULT f_forward (
<a href="rc.html#ok">FR_OK</a>,
<a href="rc.html#de">FR_DISK_ERR</a>,
<a href="rc.html#ie">FR_INT_ERR</a>,
<a href="rc.html#nr">FR_NOT_READY</a>,
<a href="rc.html#de">FR_DENIED</a>,
<a href="rc.html#io">FR_INVALID_OBJECT</a>,
<a href="rc.html#tm">FR_TIMEOUT</a>
+1 -1
View File
@@ -53,7 +53,7 @@ FRESULT f_getfree (
<div class="para desc">
<h4>解説</h4>
<p>論理ドライブ上の空き領域のサイズをクラスタ単位で取得します。返されたファイル システム オブジェクトの<tt>csize</tt>メンバがクラスタあたりのセクタ数を示しているので、これを元にセクタ単位の空きサイズが計算できます。FAT32ボリュームにおいては、FSINFOの情報が実際の空きクラスタ数と同期していない場合、不正確な値を返す可能性があります。この問題を避けるため、<tt>_FS_NOFSINFO</tt>オプションでマウント後の初回は必ずフルFATスキャンをするように構成することもできます。</p>
<p>論理ドライブ上の空き領域のサイズをクラスタ単位で取得します。返されたファイル システム オブジェクトの<tt>csize</tt>メンバがクラスタあたりのセクタ数を示しているので、これを元にセクタ単位の空きサイズが計算できます。FAT32ボリュームにおいては、FSINFOの情報が実際の空きクラスタ数と同期していない場合、不正確な値を返す可能性があります。この問題を避けるため、<tt><a href="config.html#fs_nofsinfo">_FS_NOFSINFO</a></tt>オプションでマウント後の初回は必ずフルFATスキャンをするように構成することもできます。</p>
</div>
+1 -1
View File
@@ -51,7 +51,7 @@ TCHAR* f_gets (
<div class="para comp">
<h4>対応情報</h4>
<p>この関数は<a href="read.html"><tt>f_read</tt>関数</a>のラッパー関数です。<tt>_USE_STRFUNC</tt>が1または2のとき使用可能です。2のときは、ファイルに含まれる<tt>'\r'</tt>が取り除かれてバッファに読み込まれます。</p>
<p>この関数は<a href="read.html"><tt>f_read</tt></a>関数のラッパー関数です。<tt>_USE_STRFUNC</tt>が1または2のとき使用可能です。2のときは、ファイルに含まれる<tt>'\r'</tt>が取り除かれてバッファに読み込まれます。</p>
</div>
+5 -4
View File
@@ -39,7 +39,6 @@ FRESULT f_lseek (
<a href="rc.html#ok">FR_OK</a>,
<a href="rc.html#de">FR_DISK_ERR</a>,
<a href="rc.html#ie">FR_INT_ERR</a>,
<a href="rc.html#nr">FR_NOT_READY</a>,
<a href="rc.html#io">FR_INVALID_OBJECT</a>,
<a href="rc.html#tm">FR_TIMEOUT</a>,
<a href="rc.html#nc">FR_NOT_ENOUGH_CORE</a>
@@ -54,14 +53,14 @@ FRESULT f_lseek (
<li>非書き込みモードまたは高速シーク モードのため、ファイル サイズでクリップされた。</li>
<li>ファイル拡張中にディスクが満杯になった。</li>
</ul>
<p><tt>_USE_FASTSEEK</tt>が1で、且つファイル オブジェクトの<tt>cltbl</tt>メンバがNULL以外(<tt>f_open</tt>関数でNULLに設定される)のとき、高速シーク モードになります。これはファイルのクラスタ配置情報(CLMT)をメモリ上に保持しておくことにより、FATにアクセスすることなく後方シークやロング シークを高速に行う機能です。高速シーク モードは、<tt>f_read/f_wtite</tt>関数の動作にも適用されます。高速シーク モード<tt>f_wtite/f_lseek</tt>関数によるファイル サイズの拡張はできません。</p>
<p>高速シーク動作を行う前に、CLMTを作成しておく必要があります。これを作成するには、まずCLMT格納バッファ(<tt>DWORD</tt>型配列)を準備し、<tt>cltbl</tt>メンバにそのポインタをセットします。そして、配列の先頭要素にその配列のサイズ(要素数)を入れ、<tt>f_lseek</tt>関数を<tt class="arg">ofs</tt><tt>CREATE_LINKMAP</tt>を指定して呼び出します。関数が成功するとCLMTが作成され、以降の<tt>f_read/f_write/f_lseek</tt>関数ではFATへのアクセスは発生しません。<tt>FR_NOT_ENOUGH_CORE</tt>で失敗したときは配列サイズが不足で、先頭要素には実際に必要となる要素数が返されます。必要な要素数は、(ファイルの分割数 + 1) * 2 です。たとえば、ファイルが5つのフラグメントに分断されているときに必要な要素数は、12となります。</p>
<p>高速シーク モードは、ファイルのクラスタ配置情報(CLMT)をメモリ上に保持しておくことにより、FATにアクセスすることなく後方シークやロング シークを高速に行う機能で、シーク動作のほか<tt>f_read/f_wtite</tt>関数の動作にも適用されます。ファイルが高速シーク モードの間<tt>f_wtite/f_lseek</tt>関数によるファイル サイズの拡張はできません。</p>
<p>高速シーク モードは、ファイル オブジェクトのメンバ<tt>cltbl</tt>(<tt>f_open</tt>関数でNULLになる)にNULL以外を設定したとき有効になるので、まずCLMTを作成しておく必要があります。これを作成するには、まずCLMT格納バッファ(<tt>DWORD</tt>型配列)を準備し、<tt>cltbl</tt>にそのポインタをセットします。そして、配列の先頭要素にその配列のサイズ(要素数)を入れ、<tt>f_lseek</tt>関数を<tt class="arg">ofs</tt><tt>CREATE_LINKMAP</tt>を指定して呼び出します。関数が成功するとCLMTが作成され、以降の<tt>f_read/f_write/f_lseek</tt>関数ではFATへのアクセスは発生しません。CLMTの先頭要素には実際に使用した(または必要となる)要素数が返されます。使用される要素数は、(ファイルの分割数 + 1) * 2 です。たとえば、ファイルが5つのフラグメントに分断されているときは、12要素が使用されます。<tt>FR_NOT_ENOUGH_CORE</tt>で失敗したときは、配列サイズが不足です。</p>
</div>
<div class="para comp">
<h4>対応情報</h4>
<p><tt>_FS_MINIMIZE &lt; 3</tt>のとき使用可能です。</p>
<p><tt>_FS_MINIMIZE &lt; 3</tt>のとき使用可能です。高速シーク モードを利用するときは、<tt><a href="config.html#use_fastseek">_USE_FASTSEEK</a> == 1</tt>である必要があります。</p>
</div>
@@ -107,6 +106,8 @@ FRESULT f_lseek (
DWORD clmt[SZ_TBL]; <span class="c">/* リンク マップ テーブル格納バッファ */</span>
res = f_open(fp, fname, FA_READ | FA_WRITE); <span class="c">/* ファイルを開く */</span>
res = f_lseek(fp, ofs1); <span class="c">/* 通常シーク (オープン時、cltblはNULLに初期化される) */</span>
fp-&gt;cltbl = clmt; <span class="c">/* 高速シーク機能の有効化 */</span>
+1 -1
View File
@@ -50,7 +50,7 @@ FRESULT f_mkfs (
<div class="para desc">
<h4>説明</h4>
<p>物理ドライブ上にFATボリュームを作成(フォーマット)します。FDISK形式が指定された場合は、物理ドライブ全体を占める基本区画(パーテーション)が作成され、その中にFATボリュームが作成されます。SFD形式では、FATボリュームが物理ドライブの先頭セクタからベタで作成されます。</p>
<p>マルチ パーテーション機能(<tt>_MULTI_PARTITION</tt>)が有効で、かつフォーマット対象の論理ドライブが特定の区画(1~4)に結び付けられている場合は、その区画の中にFATボリュームが作成されます。<tt class="arg">sfd</tt>は無視され、その物理ドライブはこれに先立ち、<tt>f_fdisk</tt>関数または他のツールで適切に区画設定されている必要があります。</p>
<p>マルチ パーテーション機能(<tt><a href="config.html#multi_partition">_MULTI_PARTITION</a></tt>)が有効で、かつフォーマット対象の論理ドライブが特定の区画(1~4)に結び付けられている場合は、その区画の中にFATボリュームが作成されます。<tt class="arg">sfd</tt>は無視され、その物理ドライブはこれに先立ち、<tt>f_fdisk</tt>関数または他のツールで適切に区画設定されている必要があります。</p>
<p>パーテーション形式には、FDISK形式とSFD形式の二通りあります。FDISK形式は、ハードディスク、MMC、SDC、CFC、U Diskなどで標準的に使用されます。FDISK形式では一台の物理ドライブ上に一つまたは複数の区画を作成することができます。区画管理情報はMBR(物理ドライブの先頭セクタ)に記録されます。SFD形式は単に何の分割も行わない形式で、ボリュームは物理ドライブの先頭セクタから開始します。SFD形式は、フロッピー ディスク、マイクロドライブ、光学ディスク、およびその他スーパー フロッピー メディアで標準的に使用されています。</p>
<p>FATタイプ(FAT12/FAT16/FAT32)は、そのボリューム上の<em>クラスタ数によってのみ決定</em>される決まり[FAT仕様書より]になっていて、それ以外の要因はありません。したがって、どのFATタイプになるかはボリューム サイズとクラスタ サイズに依存します。クラスタ サイズは大きくするほど性能が上がります。</p>
<p>クラスタ数がFATタイプの境界に近くなるときは、<tt>FR_MKFS_ABORTED</tt>で関数が失敗する可能性があります。</p>
+4 -4
View File
@@ -27,7 +27,7 @@ FRESULT f_mount (
<h4>引数</h4>
<dl class="par">
<dt>fs</dt>
<dd>登録するファイル システム オブジェクトへのポインタ</dd>
<dd>登録するファイル システム オブジェクトへのポインタ、またはヌル ポインタ</dd>
<dt>path</dt>
<dd>対象となる論理ドライブの<a href="filename.html">パス名</a>を示すヌル文字'\0'終端の文字列へのポインタを指定します。パス名にドライブ番号が含まれない場合は、デフォルト ドライブを指定したことになります。</dd>
<dt>opt</dt>
@@ -49,10 +49,10 @@ FRESULT f_mount (
<div class="para desc">
<h4>解説</h4>
<p>FatFsモジュールでは、それぞれの論理ドライブに<em>ファイル システム オブジェクト</em>というワーク エリアが必要です。この関数は論理ドライブにファイル システム オブジェクトを登録したり抹消したりします。何らかのファイル関数を使用する前に、この関数でその論理ドライブのファイル システム オブジェクトを与えておかなければなりません。<tt class="arg">fs</tt>にヌル ポインタを指定すると、その論理ドライブのファイル システム オブジェクトの登録は抹消されるだけです。登録抹消されたファイル システム オブジェクトのメモリは解放できます。操作対象の論理ドライブ上に開かれたままのファイルやディレクトリがあった場合、それらに対して作成された構造体は全て無効になります。この関数の内部処理は次のような順に行われます。</p>
<p>FatFsモジュールでは、それぞれの論理ドライブに<em>ファイル システム オブジェクト</em>というワーク エリアが必要です。この関数は論理ドライブにファイル システム オブジェクトを登録したり抹消したりします。何らかのファイル関数を使用する前に、この関数でその論理ドライブのファイル システム オブジェクトを与えておかなければなりません。<tt class="arg">fs</tt>にヌル ポインタを指定すると、その論理ドライブのファイル システム オブジェクトの登録は抹消されるだけです。登録抹消されたファイル システム オブジェクトのメモリは解放できます。操作対象の論理ドライブ上に開かれたままのファイルやディレクトリがあった場合、それらに対して作成された構造体は全て無効になります。この関数の内部処理は次のような順に行われます。</p>
<ol>
<li>対象の論理ドライブを<tt class="arg">path</tt>から得る。</li>
<li>既に登録されているファイル システム オブジェクトはクリアし、登録を解除する。</li>
<li>既に登録されているファイル システム オブジェクトはクリア(無効化)し、登録を解除する。</li>
<li><tt class="arg">fs</tt>が有効なポインタのときは、そのファイル システム オブジェクトをクリアし登録する。</li>
<li>マウント動作が指定されているときは、それを実行する。</li>
</ol>
@@ -61,7 +61,7 @@ FRESULT f_mount (
<li>ファイル システム オブジェクトがクリア(無効)状態(<tt>f_mount</tt>関数の実行による)</li>
<li>物理ドライブが未初期化状態(システム リセットやメディアの交換による)</li>
</ul>
<p><tt class="arg">opt</tt>に1を指定すると、ファイル システムオブジェクトの登録に続きマウント動作が行われます。メディアが無いなどの理由でマウント動作に失敗すると対応するエラーを返しファイル システム オブジェクト無効状態のままになりますが、登録自体は有効なので続いてボリュームへのアクセスがあれば再びマウント動作が実行されます。</p>
<p><tt class="arg">opt</tt>に1を指定すると、ファイル システムオブジェクトの登録に続きマウント動作が行われます。メディアが無いなどの理由でマウント動作に失敗すると対応するエラーを返しファイル システム オブジェクトはクリア状態のままになりますが、登録自体は有効なので続いてボリュームへのアクセスがあれば再びマウント動作が実行されます。</p>
<p>下位レイヤの実装上メディア交換の検出がサポートされない(<tt>disk_status</tt>関数に反映されない)ときは、アプリケーションはメディア交換の後この関数でファイル システム オブジェクトを明示的にクリアし、マウント動作が正常に行えるようにする必要があります。</p>
</div>
+1 -1
View File
@@ -56,7 +56,7 @@ int f_printf (
<div class="para comp">
<h4>対応情報</h4>
<p>この関数は、<a href="putc.html"><tt>f_putc</tt>関数</a>および<a href="puts.html"><tt>f_puts</tt>関数</a>のラッパー関数です。<tt>_FS_READONLY == 0</tt>で、且つ<tt>_USE_STRFUNC</tt>が1または2のとき使用可能になります。2の時は、出力に含まれる<tt>'\n'</tt><tt>'\r'+'\n'</tt>に展開されてファイルに書き込まれます。</p>
<p>この関数は、<a href="putc.html"><tt>f_putc</tt></a>関数および<a href="puts.html"><tt>f_puts</tt></a>関数のラッパー関数です。<tt>_FS_READONLY == 0</tt>で、且つ<tt>_USE_STRFUNC</tt>が1または2のとき使用可能になります。2の時は、出力に含まれる<tt>'\n'</tt><tt>'\r'+'\n'</tt>に展開されてファイルに書き込まれます。</p>
<p>APIにUnicodeが選択(<tt>_LFN_UNICODE</tt>が1)されているときは、<tt class="arg">fmt</tt>はUnicode文字列になりますが、ファイル上のエンコードは、<tt>_STRF_ENCODE</tt>オプションで選択できます。それ以外の時は無変換(1バイト/1文字)で書き込みます。</p>
</div>
+1 -1
View File
@@ -48,7 +48,7 @@ int f_putc (
<div class="para comp">
<h4>対応情報</h4>
<p>この関数は<a href="write.html"><tt>f_write</tt>関数</a>のラッパー関数です。<tt>_FS_READONLY == 0</tt>で、且つ<tt>_USE_STRFUNC</tt>が 1または 2のとき使用可能です。2を指定すると、<tt>'\n'</tt><tt>'\r'+'\n'</tt>に展開されてファイルに書き込まれます。</p>
<p>この関数は<a href="write.html"><tt>f_write</tt></a>関数のラッパー関数です。<tt>_FS_READONLY == 0</tt>で、且つ<tt>_USE_STRFUNC</tt>が 1または 2のとき使用可能です。2を指定すると、<tt>'\n'</tt><tt>'\r'+'\n'</tt>に展開されてファイルに書き込まれます。</p>
</div>
+1 -1
View File
@@ -48,7 +48,7 @@ int f_puts (
<div class="para comp">
<h4>対応情報</h4>
<p>この関数は<a href="write.html"><tt>f_write</tt>関数</a>のラッパー関数です。<tt>_FS_READONLY == 0</tt>で、且つ<tt>_USE_STRFUNC</tt>が1または2のとき使用可能です。2を指定すると、文字列に含まれる<tt>'\n'</tt><tt>'\r'+'\n'<tt>に展開されてファイルに書き込まれます。</p>
<p>この関数は<a href="write.html"><tt>f_write</tt></a>関数のラッパー関数です。<tt>_FS_READONLY == 0</tt>で、且つ<tt>_USE_STRFUNC</tt>が1または2のとき使用可能です。2を指定すると、文字列に含まれる<tt>'\n'</tt><tt>'\r'+'\n'<tt>に展開されてファイルに書き込まれます。</p>
</div>
+15 -8
View File
@@ -26,7 +26,7 @@
</ul>
※開かれたファイルの操作においてこのエラーが発生すると、そのファイル オブジェクトはアボート状態となり、クローズ以外の操作ができなくなります。</dd>
<dt id="nr">FR_NOT_READY</dt>
<dd>物理ドライブが動作可能な状態にない。または、ドライブの初期化に失敗した</dd>
<dd><a href="dinit.html"><tt>disk_initialize</tt>関数</a>の失敗。物理ドライブが動作可能な状態にない。</dd>
<dt id="nf">FR_NO_FILE</dt>
<dd>指定されたファイルが見つからなかった。</dd>
<dt id="np">FR_NO_PATH</dt>
@@ -47,11 +47,17 @@
<dt id="ex">FR_EXIST</dt>
<dd>新しく作成しようとしたオブジェクトと同じ名前のオブジェクトが既に存在する。</dd>
<dt id="io">FR_INVALID_OBJECT</dt>
<dd>指定されたファイル オブジェクトやディレクトリ オブジェクトが無効(オープンされていない、既に閉じられた、破損しているなど)、またはヌル ポインタが渡された。また、開かれたままのオブジェクトは、それの属するボリュームのマウント動作により無効となります。</dd>
<dd>指定されたファイル オブジェクトやディレクトリ オブジェクトが無効、またはヌル ポインタが渡された。無効になる理由は次のことが考えられます。
<ul>
<li>オープンされていない、既に閉じられた、破損しているなど。</li>
<li>それの属するボリュームのマウント動作があった。ボリューム上で開かれたオブジェクトは全て無効化される。</li>
<li>関連する物理ドライブがメディアの取り外しで動作不可能になっている。</li>
</ul>
</dd>
<dt id="wp">FR_WRITE_PROTECTED</dt>
<dd>物理ドライブが書き込み禁止状態のとき、書き込みを伴う操作を行おうとした。</dd>
<dt id="id">FR_INVALID_DRIVE</dt>
<dd>パス名中に指定されたドライブ番号が無効、またはパス名にヌル ポインタが渡された。(関連オプション: <tt>_VOLUMES</tt>)</dd>
<dd>パス名中に指定されたドライブ番号が無効、またはパス名にヌル ポインタが渡された。(関連オプション: <tt><a href="config.html#volumes">_VOLUMES</a></tt>)</dd>
<dt id="ne">FR_NOT_ENABLED</dt>
<dd>そのボリュームの操作に必要なワーク エリア(ファイル システム オブジェクト構造体)が与えられていない。</dd>
<dt id="ns">FR_NO_FILESYSTEM</dt>
@@ -61,25 +67,26 @@
<ul>
<li>ボリュームが小さすぎる。</li>
<li>FATタイプの計算に矛盾が見つかった。クラスタ数がFATタイプの境界付近になるときに発生する場合があります。</li>
<li>その論理ドライブに対応する区画が見つからなかった。(関連オプション: <tt>_MULTI_PARTITION</tt>)</li>
<li>その論理ドライブに対応する区画が見つからなかった。(関連オプション: <tt><a href="config.html#multi_partition">_MULTI_PARTITION</a></tt>)</li>
</ul>
</dd>
<dt id="tm">FR_TIMEOUT</dt>
<dd><a href="appnote.html#reentrant">再入制御</a>による待ち時間が定義された時間を越えたため、関数は実行されなかった。(関連オプション: <tt>_TIMEOUT</tt>)</dd>
<dd><a href="appnote.html#reentrant">再入制御</a>による待ち時間が定義された時間を越えたため、関数は実行されなかった。(関連オプション: <tt><a href="config.html#timeout">_TIMEOUT</a></tt>)</dd>
<dt id="lo">FR_LOCKED</dt>
<dd><a href="appnote.html#dup">多重アクセス排他機能</a>により、そのファイルやディレクトリに対して行おうとしたアクセスが拒否された。(関連オプション: <tt>_FS_LOCK</tt>)</dd>
<dd><a href="appnote.html#dup">多重アクセス排他機能</a>により、そのファイルやディレクトリに対して行おうとしたアクセスが拒否された。(関連オプション: <tt><a href="config.html#fs_lock">_FS_LOCK</a></tt>)</dd>
<dt id="nc">FR_NOT_ENOUGH_CORE</dt>
<dd>メモリ不足による失敗。原因としては次のようなことが考えられます。
<ul>
<li>LFN操作バッファの動的確保に失敗した。(関連オプション: <tt>_USE_LFN</tt>)</li>
<li>LFN操作バッファの動的確保に失敗した。(関連オプション: <tt><a href="config.html#use_lfn">_USE_LFN</a></tt>)</li>
<li>与えられた配列のサイズが実際に必要なサイズに対して不足している。</li>
</ul>
</dd>
<dt id="tf">FR_TOO_MANY_OPEN_FILES</dt>
<dd>同時オープン可能なファイル数を越えてファイルを開こうとした。(関連オプション: <tt>_FS_LOCK</tt>)</dd>
<dd>同時オープン可能なファイル数を越えてファイルを開こうとした。(関連オプション: <tt><a href="config.html#fs_lock">_FS_LOCK</a></tt>)</dd>
<dt id="ip">FR_INVALID_PARAMETER</dt>
<dd>与えられたパラメータが無効または矛盾している。</dd>
</dl>
<p class="foot"><a href="../00index_j.html">戻る</a></p>
</body>
</html>
-1
View File
@@ -45,7 +45,6 @@ FRESULT f_read (
<a href="rc.html#ok">FR_OK</a>,
<a href="rc.html#de">FR_DISK_ERR</a>,
<a href="rc.html#ie">FR_INT_ERR</a>,
<a href="rc.html#nr">FR_NOT_READY</a>,
<a href="rc.html#de">FR_DENIED</a>,
<a href="rc.html#io">FR_INVALID_OBJECT</a>,
<a href="rc.html#tm">FR_TIMEOUT</a>
+5 -7
View File
@@ -39,7 +39,6 @@ FRESULT f_readdir (
<a href="rc.html#ok">FR_OK</a>,
<a href="rc.html#de">FR_DISK_ERR</a>,
<a href="rc.html#ie">FR_INT_ERR</a>,
<a href="rc.html#nr">FR_NOT_READY</a>,
<a href="rc.html#io">FR_INVALID_OBJECT</a>,
<a href="rc.html#tm">FR_TIMEOUT</a>,
<a href="rc.html#nc">FR_NOT_ENOUGH_CORE</a>
@@ -49,15 +48,14 @@ FRESULT f_readdir (
<div class="para desc">
<h4>解説</h4>
<p>ディレクトリの項目(ファイルディレクトリ)を順次読み出します。この関数を繰り返し実行することによりそのディレクトリの全ての項目を読み出すことができます。得られるファイル情報の詳細については <tt>FILINFO</tt>構造体を参照してください。全ての項目が読み出され、読み出す項目がもう無いときは、<tt>fno-&gt;fname[]</tt>にヌル文字列が返されます。<tt class="arg">fno</tt>にヌル ポインタを指定すると、そのディレクトリのリード インデックスを先頭に巻き戻します。また、この関数は次に示すように関連する構成オプションにより動作が変わります。</p>
<p>ドット エントリ(<tt>"."</tt><tt>".."</tt>)は、相対パスが有効なとき(<tt>_FS_RPATH &gt;= 1</tt>)にのみ出力に現れます。</p>
<p>LFN機能が有効な時は、この関数の呼び出しに先立って<tt>FILINFO</tt>構造体の<tt>lfname</tt><tt>lfsize</tt>が有効な値で初期化されていなければなりません。<tt>lfname</tt>はLFNを格納するバッファ<tt>lfsize</tt>はそのバッファの要素数す。LFNを読み出す必要がないときは、<tt>lfname</tt>にヌル ポインタをセットしてください。次の条件に一つでも該当する場合は、LFN格納バッファにヌル文字列が返されます。</p>
<p>ディレクトリの項目(ファイルおよびサブ ディレクトリ)を順次読み出します。この関数を繰り返し実行することによりそのディレクトリの全ての項目を読み出すことができます。得られるファイル情報の詳細については <tt>FILINFO</tt>構造体を参照してください。全ての項目が読み出され、読み出す項目がもう無いときは、<tt>fno-&gt;fname[]</tt>にヌル文字列が返されます。<tt class="arg">fno</tt>にヌル ポインタを指定すると、そのディレクトリのリード インデックスを先頭に巻き戻します。また、この関数は次に示すように関連する構成オプションにより動作が変わります。</p>
<p>ドット エントリ(<tt>"."</tt><tt>".."</tt>)は、相対パスが有効なとき(<tt><a href="config.html#fs_rpath">_FS_RPATH</a> &gt;= 1</tt>)にのみ出力に現れます。</p>
<p>LFN機能が有効な時は、この関数の呼び出しに先立って<tt>fno-&gt;lfname</tt><tt>fno-&gt;lfsize</tt>が有効な値で初期化されていなければなりません。<tt>lfname</tt>はLFNを格納するバッファを示し<tt>lfsize</tt>はそのバッファの要素数を示します。LFNを読み出す必要がないときは、<tt>lfname</tt>にヌル ポインタをセットしてください。次の条件に一つでも該当する場合は、LFN格納バッファにヌル文字列が返されます。</p>
<ul>
<li>ディレクトリ項目にLFN情報が存在しない。</li>
<li>その項目にLFNが存在しない。このとき、<tt>fname[]</tt>に英小文字が含まれる場合があります。</li>
<li>LFNの長さに対してLFN格納バッファまたはLFN操作バッファのサイズが不十分。</li>
<li>LFNに現在のOEMコードに存在しない文字が含まれている。(非Unicode構成のとき)</li>
<li>LFNに現在のOEMコードで表現できない文字が含まれている。(非Unicode構成のとき)</li>
</ul>
<p>また、そのディレクトリ項目にLFN情報が存在しない場合は、<tt>fname[]</tt>に英小文字が含まれる場合があります。</p>
</div>
+6 -3
View File
@@ -69,11 +69,14 @@ FRESULT f_rename (
<div class="para use">
<h4>使用例</h4>
<pre>
<span class="c">/* ファイルまたはサブディレクトの名前を変更する */</span>
<span class="c">/* デフォルト ドライブにあるオブジェクトの名前を変更 */</span>
f_rename("oldname.txt", "newname.txt");
<span class="c">/* ファイルまたはサブディレクトの名前変更と別のディレクトリへの移動 */</span>
f_rename("oldname.txt", "dir1/newname.txt");
<span class="c">/* ドライブ2にあるオブジェクトの名前変更 */</span>
f_rename("2:oldname.txt", "newname.txt");
<span class="c">/* 名前の変更と同時に別のディレクトリに移動 */</span>
f_rename("log.txt", "old/log0001.txt");
</pre>
</div>
+1 -1
View File
@@ -39,7 +39,7 @@ DWORD f_size (
<div class="para desc">
<h4>解説</h4>
<p>この関数は、現リビジョンではマクロとして実装されています。</p>
<p>この関数は、現リビジョンではマクロとして実装されています。ファイル オブジェクトの正当性チェックや排他制御は行いません。</p>
<pre>
<span class="k">#define</span> f_size(fp) ((fp)->fsize)
</pre>
+1
View File
@@ -55,6 +55,7 @@ FRESULT f_stat (
<div class="para desc">
<h4>解説</h4>
<p>指定されたファイルまたはサブ ディレクトリの存在を調べます。存在しない場合は、<tt>FR_NO_FILE</tt>が帰ります。存在する場合は<tt>FR_OK</tt>が帰り、ファイル情報構造体にそれ関する情報(サイズ、タイムスタンプ、属性および短いファイル名)がストアされます。</p>
<p>LFN構成のときは、ファイル情報構造体を使う前に<tt>fno.lfname</tt>をヌルに設定しておく必要があります。</p>
</div>
-1
View File
@@ -36,7 +36,6 @@ FRESULT f_sync (
<a href="rc.html#ok">FR_OK</a>,
<a href="rc.html#de">FR_DISK_ERR</a>,
<a href="rc.html#ie">FR_INT_ERR</a>,
<a href="rc.html#nr">FR_NOT_READY</a>,
<a href="rc.html#io">FR_INVALID_OBJECT</a>,
<a href="rc.html#tm">FR_TIMEOUT</a>
</p>
+1 -1
View File
@@ -39,7 +39,7 @@ DWORD f_tell (
<div class="para desc">
<h4>解説</h4>
<p>f_tell関数は、現リビジョンではマクロとして実装されています。</p>
<p>f_tell関数は、現リビジョンではマクロとして実装されています。ファイル オブジェクトの正当性チェックや排他制御は行いません。</p>
<pre>
<span class="k">#define</span> f_tell(fp) ((fp)->fptr)
</pre>
-1
View File
@@ -36,7 +36,6 @@ FRESULT f_truncate (
<a href="rc.html#ok">FR_OK</a>,
<a href="rc.html#de">FR_DISK_ERR</a>,
<a href="rc.html#ie">FR_INT_ERR</a>,
<a href="rc.html#nr">FR_NOT_READY</a>,
<a href="rc.html#de">FR_DENIED</a>,
<a href="rc.html#io">FR_INVALID_OBJECT</a>,
<a href="rc.html#tm">FR_TIMEOUT</a>
-1
View File
@@ -45,7 +45,6 @@ FRESULT f_write (
<a href="rc.html#ok">FR_OK</a>,
<a href="rc.html#de">FR_DISK_ERR</a>,
<a href="rc.html#ie">FR_INT_ERR</a>,
<a href="rc.html#nr">FR_NOT_READY</a>,
<a href="rc.html#de">FR_DENIED</a>,
<a href="rc.html#io">FR_INVALID_OBJECT</a>,
<a href="rc.html#tm">FR_TIMEOUT</a>