組込み用 FAT16 Filesystem
冬休みの工作で、組込みMPU用のFAT16読み書きライブラリを作成しました。主
な目的は、SD CardへGPSの航跡を記録することです。
組込み用に良さそうなFATライブラリが無いか探してみましたが、Assembler
で書かれていたり、Hardware制御と分離されていなかったりと、あまり好みの
ものが無かったので自作してしまいました。
目的がGPS loggerですので、読み書き速度は10kB/secも出せれば十分ですが、
そのかわりに極力小さな ROM/RAM で動作することを目標としています。また、
移植性重視(bit field等のC言語の実装依存機能は使わない)、Hardware層と
Filesystem層はちゃんと分離するといった点に気をつかっています。
Download
**2009-09-10以前のものにはbugがありました。過去にdownloadした方は最新版と差し替えてください。**
download.komoto.org/elec/softwareから、mpu_********.zipの最新版をもっていってください。
lib/fat16.c (FAT16の読み書き)と、lib/sdcard.c (SD Cardを読み書き)、
その他必要なヘッダファイルが入っています。
動作環境
MPU
C言語で書かれていますので、以下の用件を満たしているMPUであれば、容易に
移植可能です。
- C99 compilerがある
- RAM 1kB以上
- 1 byte = 8 bit である
私の開発環境では、SD Card + H8-3664F + GCC-4.0.2で動いています。
Super-HやM16C、AVR/ATmegaなどでも動くでしょう。
C89 compilerの場合は少し修正が必要です。
記録媒体
基本的に512byte単位で読み書きできる媒体であれば扱えます。実際に試して
みたものはSD Cardのみですが、以下にあげるものでも動作するはずです。
- SD Card
- MultiMediaCard
- CompactFlash
- ATA HDD
機能一覧
実装されている機能
- ファイルの読み込み
- 既存ファイルの上書き
- 新規ファイルの作成、書き込み
- サブディレクトリの作成
- ディレクトリ内のファイル一覧取得
実装されていない機能
- FAT12, FAT32の読み書き
- VFAT (Long File Name)対応
- ファイルの削除
- ファイル名変更
- 既存ファイルへの追記
- seek()
- ファイル属性(read-only等)の変更
諸元/性能など
H8 300H Tinyであれば、ROM 約4kB, RAM 580 byte (stack除く) で動作します。
速度も試しに測定したところ、H8-3664F 16MHzとSanDisk製 64MB SD Cardの組
合せで、100kBの書き込みに約6.5秒でした。15kB/secぐらいの書き込み性能は
出せるようですので、GPS loggerという目的には十分でしょう。
使いかた
POSIX-likeになっていますので、fat.hを見れば使いかたは予想できるでしょ
う。
- fat_init()
-
FAT16 Filesystemの初期化を行います。
返り値は、正常に初期化できた場合、IOE_SUCCESSを返します。IOE_SUCCESS以
外を返した後にfat_open()等を呼ぶと、ファイルシステムを壊す可能性があり
ます。必ず返り値を確認してください。
- fat_open(pathname, flags)
-
ファイルを開きます。pathnameは、MS-DOSの8+3形式ですが、区切り文字は
MS-DOSの"\"ではなく、U*IX風に"/"です
("/dir1/file2.txt"のような形式)。
同時に開けるファイル数は fat16.c 内の FAT_NR_FILE で定義されています。
返り値はファイル番号です。失敗すると負の値を返します。
- fat_close(fd)
-
fat_open()で開かれたファイルを閉じます。fat_close()を呼び出さないと、
書き込んだファイルを読めなくなります。必ずfat_close()を呼び出してくだ
さい。
返り値は、成功すると0、失敗すると-1を返します。
- fat_sync()
-
メモリ上にキャッシュされているデータを記録媒体へ書き込みます。電源断な
どに備えて定期的にfat_sync()を呼び出すと少しだけ幸せになれるかもしれま
せん。
- fat_read(fd, buf, count)
-
ファイルから buf へ count byte 読み込みます。
返り値は、読み込んだ byte 数です。失敗した場合は-1を返します。
- fat_write(fd, buf, count)
-
ファイルへ buf の内容を count byte 書き出します。
返り値は、書き込んだ byte 数です。失敗した場合は-1を返します。
- fat_opendir(pathname)
-
fat_readdir()のために、pathnameで指定されたディレクトリを開きます。
closedir()はありませんので、読み出しが済んだら代わりにfat_close() を呼
び出してください。
返り値は、ファイル番号です。POSIXのDIR構造体ではありません。失敗した場
合は-1を返します。
- fat_readdir(fd, dirp)
-
ディレクトリからファイル名を読み込みます。fdはfat_opendir()で開かれた
ファイル番号でなければなりません。
返り値は、ファイル名を読み込めた場合1、ディレクトリの最後であれば0 、
失敗した場合は-1を返します。
- fat_mkdir(pathname)
-
新しくディレクトリを作成します。
返り値は、ディレクトリを作成できた場合は0、失敗した場合は-1を返します。
使用条件
修正BSD Licenseに従って再利用可能です。
参考資料
fat16.cを書くにあったって、以下のようなWebページを参考にさせていただき
ました。
ご意見、ご感想は、小本 真広 <[email protected]>まで。メールする前にtop pageの注意書を読んでください。