組込み用 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.hanabusa.net/elec/softwareから、mpu_********.zipの最新版をもっていってください。

lib/fat16.c (FAT16の読み書き)と、lib/sdcard.c (SD Cardを読み書き)、 その他必要なヘッダファイルが入っています。

動作環境

MPU

C言語で書かれていますので、以下の用件を満たしているMPUであれば、容易に 移植可能です。

私の開発環境では、SD Card + H8-3664F + GCC-4.0.2で動いています。 Super-HやM16C、AVR/ATmegaなどでも動くでしょう。
C89 compilerの場合は少し修正が必要です。

記録媒体

基本的に512byte単位で読み書きできる媒体であれば扱えます。実際に試して みたものはSD Cardのみですが、以下にあげるものでも動作するはずです。

機能一覧

実装されている機能

実装されていない機能

諸元/性能など

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ページを参考にさせていただき ました。


ご意見、ご感想は、花房 真広 <webmaster@hanabusa.net>まで。メールする前にtop pageの注意書を読んでください。