概要
ffconf.h ファイルは、FatFsモジュールの全動作を制御する設定ファイルである。
このファイルに定義されたマクロの値を変更することで、FatFsの機能、ファイルシステムタイプ、メモリ管理方法、ロングファイルネームのサポート等を細かく制御できる。
設定内容によって、ROM (コードサイズ) および RAM (データ領域) の使用量が大きく変動する。
例えば、書き込み機能の無効化やTINYモードの有効化によって、RAMの消費量を大幅に削減できる。
一方、LFN (ロングファイルネーム) や exFATを有効にすると、ROMおよびRAMの消費量が増加する。
ffconf.h ファイルで設定できる主なカテゴリは以下の通りである。
| カテゴリ | 説明 |
|---|---|
| 機能の有効 / 無効 | f_write、f_mkdir、f_mkfs等の各関数の有効 / 無効を個別に制御する。 |
| ファイルシステムタイプ | FAT12、FAT16、FAT32、exFATのサポート範囲を設定する。 |
| メモリ管理 | セクタバッファの配置方法やTINYモードによるRAM節約を設定する。 |
| ロングファイルネーム (LFN) | LFNの有効 / 無効、最大長、バッファ配置方法を設定する。 |
| システム統合 | RTC、リエントラント (スレッドセーフ)、ファイルロック等のシステム機能を設定する。 |
例えば、MSP430F149のような2[KB] RAMの制約がある組み込み環境では、設定の最適化が特に重要である。
適切な設定を行うことにより、限られたリソースの中でFatFsを動作させることができる。
機能設定
機能設定では、各FatFs関数の有効 / 無効を制御する。
不要な機能を無効にすることで、ROM使用量を削減できる。
FF_FS_READONLY
ファイルシステムのアクセスモードを制御する。
| 値 | 動作 |
|---|---|
| 0 | 読み書き対応 (デフォルト) |
| 1 | 読み取り専用 |
値を 1 に設定すると、以下の書き込み系関数がビルドから除外される。
- f_write
- f_sync
- f_unlink
- f_mkdir
- f_chmod
- f_rename
- f_truncate
- f_getfree
書き込み系関数を全て除外するため、ROM使用量を大幅に削減できる。
データロギングのような読み書きが必要な用途では、0 を設定する。
FF_FS_MINIMIZE
無効化する関数の範囲をレベルで指定する。
| レベル | 無効化される関数 | 効果 |
|---|---|---|
| 0 | なし (全機能有効) | 全機能使用可能 |
| 1 | f_stat f_getfree f_unlink f_mkdir f_truncate f_chmod f_utime f_rename |
基本的なファイル読み書きに限定 |
| 2 | レベル1に加えて、 f_opendir f_readdir f_closedir |
ディレクトリ操作も除外 |
| 3 | レベル2に加えて、 f_lseek |
シーク操作も除外。 シーケンシャルアクセスのみ |
FF_USE_FIND
ディレクトリ検索関数の有効 / 無効を制御する。
- 0
- 無効 (デフォルト)
- 1
- 有効
f_findfirst/f_findnext関数を使用可能にする。
- 2
- 有効
- カスタムフィルタにも対応する。
FF_FS_MINIMIZE <= 1 の場合に有効となる。
FF_USE_MKFS
フォーマット関数の有効/無効を制御する。
- 0
- 無効 (デフォルト)
- 1
- 有効。
f_mkfs関数を使用可能にする。ボリュームのフォーマットが必要な場合に有効化する。
- 有効。
FF_USE_FASTSEEK
高速シーク機能の有効/無効を制御する。
- 0
- 無効 (デフォルト)
- 1
- 有効
- CLMTテーブルを使用してファイル内のランダムアクセスを高速化する。
有効にするとランダムアクセス性能が向上するが、CLMTテーブルの格納に追加RAMが必要となる。
FF_USE_EXPAND
ファイル領域事前確保関数の有効/無効を制御する。
- 0
- 無効 (デフォルト)
- 1
- 有効。
f_expand関数を使用可能にする。事前にファイルサイズを確保する。
- 有効。
FF_USE_CHMOD
ファイル属性・タイムスタンプ変更関数の有効/無効を制御する。
- 0
- 無効 (デフォルト)
- 1
- 有効
f_chmod/f_utime関数を使用可能にする。
FF_USE_LABEL
ボリュームラベル操作関数の有効 / 無効を制御する。
- 0
- 無効 (デフォルト)
- 1
- 有効
f_getlabel/f_setlabel関数を使用可能にする。
FF_USE_FORWARD
ファイルデータ直接転送関数の有効 / 無効を制御する。
- 0
- 無効 (デフォルト)
- 1
- 有効
f_forward関数を使用可能にする。- ファイルデータの直接ストリーミング転送に使用する。
FF_USE_STRFUNC
文字列I/O関数の有効 / 無効を制御する。
- 0
- 無効 (デフォルト)
- 1
- 有効
f_gets/f_putc/f_puts/f_printf等の文字列I/O関数を使用可能にする。
- 2
- 有効
- LF --> CRLF変換付きで文字列I/O関数を使用可能にする。
FF_USE_TRIM
不要セクタ消去通知の有効 / 無効を制御する。
- 0
- 無効 (デフォルト)
- 1
- 有効
CTRL_TRIMコマンドを使用して、不要セクタの消去をドライバへ通知する。- フラッシュメモリ系ストレージの寿命延長に効果がある。
ロングファイルネーム設定
ロングファイルネーム (LFN) の動作を設定する。
LFN有効化によってROMおよびRAMの消費量が大幅に増加するため、組み込みシステムでは慎重に検討する必要がある。
FF_USE_LFN
LFNのバッファ配置方法を選択する。
| 値 | LFN | バッファ配置 | 備考 |
|---|---|---|---|
| 0 | 無効 | なし | 8.3形式のみ ROM / RAMを最小限にできる。 |
| 1 | 有効 | BSS (静的領域) | シングルスレッド環境向け |
| 2 | 有効 | スタック | 関数呼び出し時に自動割り当て スタック消費に注意すること。 |
| 3 | 有効 | ヒープ (ff_memalloc) | RTOS環境でのマルチスレッド対応 |
LFN有効化時には、以下の追加メモリが必要となる。
- LFNバッファ
- (FF_MAX_LFN + 1) x 2バイト (UTF-16)
- ffunicode.c
- Unicodeテーブルを含むソースファイルが必要
- 約12[KB] ROMを消費する。
FF_MAX_LFN
ロングファイルネームの最大長を指定する。
- 指定範囲: 12~255 (デフォルト: 255)
- 値を小さくすると、LFNバッファのRAMを節約できる。
FF_LFN_UNICODE
LFN使用時の文字エンコーディングを指定する。
| 値 | エンコーディング |
|---|---|
| 0 | ANSI/OEM (現在のコードページに依存) |
| 1 | UTF-16LE |
| 2 | UTF-16BE |
| 3 | UTF-8 |
FF_CODE_PAGE
OEMコードページを指定する。
| 値 | 言語/文字セット |
|---|---|
| 0 | 動的コードページ切り替え (全コードページのテーブルを含む) |
| 437 | US English |
| 720 | Arabic |
| 932 | Japanese Shift-JIS |
| 936 | Simplified Chinese GBK |
| 949 | Korean |
| 950 | Traditional Chinese Big5 |
| 1252 | Latin 1 (Western European) |
0 に設定すると全コードページのテーブルがROMに含まれるため、ROM消費量が大幅に増加する。
英語ファイル名のみ使用する場合は 437 を推奨する。
日本語ファイル名が必要な場合は 932 を使用するが、約12[KB]の追加ROMが必要となる。
ボリューム・パーティション設定
マウント可能なボリューム数やパーティション構成を制御する。
FF_VOLUMES
マウント可能な論理ドライブ (ボリューム) の数を指定する。
- 指定範囲: 1~10 (デフォルト: 1)
- 各ボリュームに対してFATFS構造体 (約564バイト) が必要となる。
FF_STR_VOLUME_ID
文字列によるボリュームID指定の有効/無効を制御する。
- 0
- 無効 (デフォルト)
- 数値でドライブを指定する。
- 1
- 有効
- "SD:" や "USB:" 等の文字列でドライブを指定できる。
- 2
- 有効
- ユーザが文字列を設定可能
FF_MULTI_PARTITION
マルチパーティション対応の有効/無効を制御する。
- 0
- 無効 (デフォルト)
- 1つの物理ドライブに1つのパーティション
- 1
- 有効
- 1つの物理ドライブに複数のパーティションを配置できる。
FF_MIN_SS / FF_MAX_SS
対応するセクタサイズの範囲を指定する。
| FF_MIN_SS | FF_MAX_SS | 対応メディア | 備考 |
|---|---|---|---|
| 512 | 512 | SDカード、USBメモリ | ほとんどのメディアはこの設定で対応する。 |
| 512 | 4096 | 一部の大容量HDD | 可変セクタサイズ対応 追加コードが生成される。 |
| 4096 | 4096 | 4Kネイティブディスク | セクタサイズ固定 |
両方とも 512 に設定するのが一般的である。
SDカード使用時は 512 / 512 を推奨する。
exFAT設定
exFATおよび大容量ストレージのサポートを設定する。
FF_FS_EXFAT
exFATファイルシステムのサポートを有効/無効にする。
- 0
- 無効 (デフォルト)
- 1
- 有効
- exFATファイルシステムをサポートする。
有効化には FF_USE_LFN >= 1 が必須条件である。
有効化すると約2~3[KB]の追加ROMが必要となる。
FF_LBA64
64ビットLBA対応の有効 / 無効を制御する。
- 0
- 無効 (デフォルト)
- 1
- 有効
- 2[TB]超のボリュームやGPTパーティションに対応する。
FF_FS_EXFAT = 1の場合に有効となる。
システム設定
FatFsのシステム統合に関わる設定を行う。
FF_FS_TINY
TINYモードの有効 / 無効を制御する。
- 0
- 通常モード (デフォルト)。各FIL構造体が専用のセクタバッファ (512バイト) を持つ。
- 1
- TINYモード有効。FIL構造体からセクタバッファが除外される。
TINYモード有効時の動作を以下に示す。
- 全てのオープンファイルがFATFS構造体のセクタバッファを共有する。
- FIL構造体サイズが約552バイトから約40バイトに大幅削減される。
- 例えば、RAM 2[KB]環境 (MSP430F149等) では必須の設定である。
TINYモードの注意事項を以下に示す。
- 頻繁なファイル切り替えでは、バッファの再読み込みが発生する。
- バッファの再読み込みにより、パフォーマンスが低下する可能性がある。
FF_FS_NORTC
RTCの有無を設定する。
- 0
- RTCあり
get_fattime()関数からタイムスタンプを取得する。
- 1
- RTCなし
/: 固定タイムスタンプを使用する。
1 に設定する場合は、以下のマクロで固定日時を指定する。
FF_NORTC_MON: 月 (1~12)FF_NORTC_MDAY: 日 (1~31)FF_NORTC_YEAR: 年 (1980~2107)
RTCを搭載していないシステムで使用する。
FF_FS_REENTRANT
リエントラント (スレッドセーフ) 機能の有効 / 無効を制御する。
- 0
- 無効 (デフォルト)
- シングルスレッド環境向け。
- 1
- 有効
- RTOS環境で複数タスクからFatFsを使用する場合に必要。
有効化には、以下の関数の実装が必要となる。
ff_mutex_create()ff_mutex_delete()ff_mutex_take()ff_mutex_give()
FF_FS_LOCK
同時オープン可能なファイル / ディレクトリの最大数を制限する。
- 0
- ファイルロック機能無効。
- N (1以上の整数)
- 最大N個のオブジェクトを同時にオープン可能。
MSP430F149向け推奨設定
MSP430F149は2[KB] RAMという厳しいリソース制約を持つマイクロコントローラである。
以下に示す推奨設定を使用することで、FatFsを最小限のRAM消費で動作させることができる。
| マクロ | 推奨値 | 理由 |
|---|---|---|
| FF_FS_READONLY | 0 | 読み書き対応 (データロギング用途) |
| FF_FS_MINIMIZE | 0 | 全ファイル操作関数を使用可能にする |
| FF_USE_FIND | 0 | ディレクトリ検索不要でROM節約 |
| FF_USE_MKFS | 0 | フォーマット機能不要でROM節約 |
| FF_USE_FASTSEEK | 0 | 高速シーク不要でRAM節約 |
| FF_USE_EXPAND | 0 | ファイル事前確保不要 |
| FF_USE_CHMOD | 0 | 属性変更不要でROM節約 |
| FF_USE_LABEL | 0 | ボリュームラベル不要 |
| FF_USE_FORWARD | 0 | ストリーミング不要 |
| FF_USE_STRFUNC | 0 | 文字列I/O不要 |
| FF_USE_TRIM | 0 | TRIM不要 |
| FF_CODE_PAGE | 437 | 英語 (日本語ファイル名不要) 932にすると、約12[KB] ROM追加 |
| FF_USE_LFN | 0 | LFN無効 8.3形式ファイル名でROM / RAM大幅節約 |
| FF_FS_EXFAT | 0 | exFAT不要 |
| FF_LBA64 | 0 | 64ビットLBA不要 |
| FF_FS_TINY | 1 | 必須 RAM 2[KB]では不可欠 FILサイズを552 --> 40バイトに削減 |
| FF_FS_NORTC | 1 | RTCなし環境対応 |
| FF_FS_REENTRANT | 0 | シングルスレッド環境 |
| FF_FS_LOCK | 0 | ファイルロック不要 |
| FF_VOLUMES | 1 | 1ボリュームのみ |
| FF_MIN_SS | 512 | SDカード標準セクタサイズ |
| FF_MAX_SS | 512 | SDカード標準セクタサイズ |
| FF_MULTI_PARTITION | 0 | シングルパーティション |
MSP430F149向け推奨設定の全体を以下に示す。
// ffconf.h : MSP430F149向け推奨設定
// 機能設定
#define FF_FS_READONLY 0
#define FF_FS_MINIMIZE 0
#define FF_USE_FIND 0
#define FF_USE_MKFS 0
#define FF_USE_FASTSEEK 0
#define FF_USE_EXPAND 0
#define FF_USE_CHMOD 0
#define FF_USE_LABEL 0
#define FF_USE_FORWARD 0
#define FF_USE_STRFUNC 0
#define FF_USE_TRIM 0
// ロングファイルネーム設定
#define FF_USE_LFN 0
#define FF_MAX_LFN 255
#define FF_LFN_UNICODE 0
#define FF_CODE_PAGE 437
// ボリューム設定
#define FF_VOLUMES 1
#define FF_STR_VOLUME_ID 0
#define FF_MULTI_PARTITION 0
#define FF_MIN_SS 512
#define FF_MAX_SS 512
// exFAT設定
#define FF_FS_EXFAT 0
#define FF_LBA64 0
// システム設定
#define FF_FS_TINY 1
#define FF_FS_NORTC 1
#define FF_NORTC_MON 1
#define FF_NORTC_MDAY 1
#define FF_NORTC_YEAR 2024
#define FF_FS_REENTRANT 0
#define FF_FS_LOCK 0
設定によるメモリ影響
ffconf.h の設定内容によって、ROM/RAM消費量は大きく変動する。
代表的な構成パターンを以下に示す。
| 構成パターン | ROM | RAM | 用途 |
|---|---|---|---|
| フル構成 (全機能有効、LFN有効、exFAT有効) | 約13.0[KB] | 約2,200バイト以上 | 十分なリソースがある環境 |
| 読み書き標準構成 (LFNなし、基本機能) | 約6〜8[KB] | 約1,116バイト | 一般的な組み込みシステム |
| MSP430F149推奨構成 (LFNなし、TINY有効) | 約6〜8[KB] | 約604バイト | RAM 2[KB]環境 |
| 読み取り専用最小構成 (READONLY=1、MINIMIZE=3、TINY=1) | 約2.1[KB] | 約600バイト | 極限メモリ制約環境 |
読み取り専用最小構成の例を以下に示す。
// ffconf.h - 読み取り専用最小構成
#define FF_FS_READONLY 1
#define FF_FS_MINIMIZE 3
#define FF_USE_FIND 0
#define FF_USE_MKFS 0
#define FF_USE_FASTSEEK 0
#define FF_USE_EXPAND 0
#define FF_USE_CHMOD 0
#define FF_USE_LABEL 0
#define FF_USE_FORWARD 0
#define FF_USE_STRFUNC 0
#define FF_USE_TRIM 0
#define FF_USE_LFN 0
#define FF_CODE_PAGE 437
#define FF_VOLUMES 1
#define FF_MIN_SS 512
#define FF_MAX_SS 512
#define FF_FS_EXFAT 0
#define FF_LBA64 0
#define FF_FS_TINY 1
#define FF_FS_NORTC 1
#define FF_NORTC_MON 1
#define FF_NORTC_MDAY 1
#define FF_NORTC_YEAR 2024
#define FF_FS_REENTRANT 0
#define FF_FS_LOCK 0
参考リンク
- FatFs Configuration Options (公式)
- ffconf.hの全設定項目の公式ドキュメント
- FatFs公式ページ
- FatFsモジュールのダウンロード
- 関連ページ
- マイコン - FatFs - FatFsモジュールの概要とAPI
- MSP430F149 - FatFs - MSP430F149でのハードウェア接続とドライバ実装
- MSP430F149 - FatFsの応用 - アプリケーション実装例とトラブルシューティング