■実質SDカードアクセスライブラリさえできてしまえばロガーはできてしまう状態だったわけですが、そのSDカード/FAT16アクセスライブラリができた。あんまりコンパクトではなくて、そのあたりのブラッシュアップは継続的にしていくつもり。今のところ、ロガーとして機能できれば良いので、書き込み系だけなんだけど、読み込み系もいずれ実装したい。ただ、読み込み系っても、どういうアプリケーションがあるかというと、やっぱりmp3プレイヤーとかグラフィック表示関係か。作るかっていうと、それはどうだろう、とは思いますが。
現状でのSDカード/FAT16のライブラリを公開します。ATmega128ベースですが、メモリを仰山(最低2Kは必要だと思う)積んでいて、Cコンパイラを持つ石であればポーティングは可能でしょう。
必要以上にAPIはライブラリの内部構造を隠蔽しようとしているんですが、ゆくゆくはUARTとかLCDのインターフェースとかADCも同じ関数で扱えるように吸収したいと思っているので。‥‥飽きなければ。
いろんなペリフェラルをファイルとして扱う、というのはもちろんUNIXからの連想です。当然なことに、あちらはOSで、こちらはライブラリですから、ペリフェラルの物理的な実体を完全に忘れるわけには行かないはずですが、アプリケーションのレベルでは簡素に書けるようになるはずです。
もっともWinAVRに含まれているlibcが似た環境を提供しているので、そちらと被るような実装は避けるつもりです。ただWinAVR-libcの実装は自前で用意した出力関数へのフックを提供する形になっているので、それもちょっと違うなあとは思っています。どちらかと言えばラッパーみたい。
このライブラリでは512バイトバッファを3面使います。そのうち2面がFATバッファとディレクトリエントリのバッファで、残る1面をいわゆるストリームバッファとして使います。これだけで1.5Kを消費し、他に管理構造体や各関数の内部変数、スタックが消費されていくので、少なくても2Kのワークメモリが必要だと見ています。アプリケーションとして使う場合は、例えば今ターゲットにしているGPSロガーであれば、GPSからの受信バッファが必要で、そうした要素を積み上げていくと、ATmegaシリーズであれば、4Kからのモデルになるだろうと思います。
ちなみに、今はロクなエラーハンドリングをしていませんし、エラー発生時のリトライもやっつけになっています。参考資料ぐらいにはなるだろうとは思いますが、実用には手をいれないとまずいでしょう。というか、そのまま流用されても何も保障できません。
ATmega128 SD/FAT16 Cライブラリ