概要

ffconf.h ファイルは、FatFsモジュールの全動作を制御する設定ファイルである。
このファイルに定義されたマクロの値を変更することで、FatFsの機能、ファイルシステムタイプ、メモリ管理方法、ロングファイルネームのサポート等を細かく制御できる。

設定内容によって、ROM (コードサイズ) および RAM (データ領域) の使用量が大きく変動する。
例えば、書き込み機能の無効化やTINYモードの有効化によって、RAMの消費量を大幅に削減できる。
一方、LFN (ロングファイルネーム) や exFATを有効にすると、ROMおよびRAMの消費量が増加する。

ffconf.h ファイルで設定できる主なカテゴリは以下の通りである。

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

ファイルシステムのアクセスモードを制御する。

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

無効化する関数の範囲をレベルで指定する。

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のバッファ配置方法を選択する。

FF_USE_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使用時の文字エンコーディングを指定する。

FF_LFN_UNICODE 設定値
エンコーディング
0 ANSI/OEM (現在のコードページに依存)
1 UTF-16LE
2 UTF-16BE
3 UTF-8


FF_CODE_PAGE

OEMコードページを指定する。

FF_CODE_PAGE 設定値
言語/文字セット
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 設定値
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消費で動作させることができる。

MSP430F149向け推奨設定一覧
マクロ 推奨値 理由
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



参考リンク