マイコンFileSystem

マイコンでファイルシステムを使いたい人は、MP3などの再生をしたいと言ったことが多いのでは。
メディアはSDMemoryCardなどでしょう。
内部or取り外し不可のデバイスでも複数ファイルを扱えたなら、
音声応答装置など操作性のいいシステムになることがあります。
必要に応じた複数音源をチョイスして個別の応答をさせることが簡単になります。

TAR_FS

FatFileも良いが取り外しがないのならこだわる必要はない、要はパソコン側で特別なソフトや操作をせずに装置に送り込む方法があればOK。
そこで考えたのがTARを使う方法です。

MSDOS_FS=FAT
MSDOSFS-SD-Memory For ARM
MSDOSFS はNetBSD2.0より移植したFatFileSystemでFat32,LongNameも可能です。
CQ-ARM7向けに移植したため128KbのSRAMでなんとか
LongNameが可能です。
MSDOSFS-SD-Memory For ARM一式zip

その他色々のソースはパスワードが必要です。

FileSystem Users
 
 
ファイルシステ ムの構造

 
余ったFlashメモリー領域の利用方法
 
MSP-EXP430F5438実験ボードを 利用して実験して見る。
 データの入力はボードに乗っているUSBシリアルICを使う
 すでにデモプログラムに一文字ずつなら問題ない簡単なサンプルがあるので、これを改造する。
 速度は56Kbauなので内部処理はぎりぎりOKである−−で有ればよいが。

ホスト側
ホスト側はCygwinで作成
とりあえずサンプル音としてサインウエーブのデータを発生させる
これをODでダンプしてHex文字列にする
いまのところ手作業だが全体をスクリプトでまとめる。

ターゲット
OD ダンプの
Hex文字列のスペース、改行などを削除
0~9,A~F以外が来たらエラーで終了
2文字で1Byte/4文字で1WordでFlashに書き込む


TARFile
本来はテープ上ファイルを記録する物で、絶対パスで保存できる、シーケンシャルにしか読めない特徴がある。 
かつてはワークステーションのシステム立ち上げなどは
テープか らディスクに丸ごとコピーしていてた、そのときのテープはTARであった。

ホストパソコンで作成したデレクトリー・ファイルをマイコンで読みたい。
ほとんどのデータはシーケンシャルにしかアクセスしないため簡単なファイルシステムで十分。
TARを使えばOSを選ばず可能だ。
WindowsXPなどでも標準のソフトでアーカイブ可能?だめならCygwinを使えば良い。

 
今回は読み込み専用 
 
FileはシリアルEEPROMにおさめる

TARの解析
 
参考
 
作りながら理解するファイルシステムの仕組み(3):
ソースは対象カーネル版数 2.6.28(※) LinuxでないとNG
しかしTARの構造を理解するには良い資料になっている、
書かれた 森 崇様に感謝
 
一寸プロトタイプ的な物を作ってみる
 2個のテキストファイルを作成

C:\Documents and Settings\X41>cat test.txt
Test Data
123456789abcdefg
 
C:\Documents and Settings\X41>cat Test1.txt
Test Data1
ABCDEFGHIJKLMN
 
TARファイルに収める
C:\Documents and Settings\X41>tar cf test.tar test.txt
 
C:\Documents and Settings\X41>ls -l test.tar
-rw-r--r--+ 1 X41 ▒Ȃ▒ 10240 Mar 31 03:18 test.tar
C:\Documents and Settings\X41>tar rf test.tar Test1.txt
 
C:\Documents and Settings\X41>ls -l test.*
-rw-r--r--+ 1 X41 ▒Ȃ▒ 10240 Mar 31 03:18 test.tar
-rwx------+ 1 X41 ▒Ȃ▒    29 Mar 31 02:52 test.txt
なぜか小さいファイル
2個なのに10Kb になる、

ODで中身を見る
C:\Documents and Settings\X41>od -c test.tar
0000000   t   e   s   t   .   t   x   t  \0  \0  \0  \0  \0  \0  \0  \0
0000020  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0000140  \0  \0  \0  \0   0   0   0   0   7   0   0  \0   0   0   0   1
0000160   7   5   6  \0   0   0   0   1   0   0   1  \0   0   0   0   0
0000200   0   0   0   0   0   3   5  \0   1   1   7   3   5   3   7   1
0000220   3   4   3  \0   0   1   1   2   0   5  \0       0  \0  \0  \0
0000240  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0000400  \0   u   s   t   a   r          \0   X   4   1  \0  \0  \0  \0
0000420  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000440  \0  \0  \0  \0  \0  \0  \0  \0  \0 202 310 202 265  \0  \0  \0
0000460  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0001000   T   e   s   t       D   a   t   a  \r  \n   1   2   3   4   5
0001020   6   7   8   9   a   b   c   d   e   f   g  \r  \n  \0  \0  \0
0001040  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0002000   T   e   s   t   1   .   t   x   t  \0  \0  \0  \0  \0  \0  \0
0002020  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0002140  \0  \0  \0  \0   0   0   0   0   7   0   0  \0   0   0   0   1
0002160   7   5   6  \0   0   0   0   1   0   0   1  \0   0   0   0   0
0002200   0   0   0   0   0   3   6  \0   1   1   7   3   5   3   7   3
0002220   5   3   2  \0   0   1   1   2   3   1  \0       0  \0  \0  \0
0002240  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0002400  \0   u   s   t   a   r          \0   X   4   1  \0  \0  \0  \0
0002420  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0002440  \0  \0  \0  \0  \0  \0  \0  \0  \0 202 310 202 265  \0  \0  \0
0002460  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0003000   T   e   s   t       D   a   t   a   1  \r  \n   A   B   C   D
0003020   E   F   G   H   I   J   K   L   M   N  \r  \n  \r  \n  \0  \0
0003040  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
ファイル名
ファイルサイズ サイズはオクタル値をASCIIであらわしている
データー 

最初のブロック=ヘッダーを解析し長さを求める、
ヘッダーが目的の物でなければ、長さ分読み飛ばし(アドレスを加算)ヘッダーを解析し
最後まで無ければerrを返す


ターゲットでデバッグする前にMyngwで確認してみた。
ソース
 main.c
  tarfs_meta.h
 
読み込んだをメモリーに展開し抽出したfileをstdoutに、メッセージはstderrに出しているので
gcc -I../include main.c
 ./a.exe test.tar >b.txt
などとやれば
b.txtがそのファイルの中身である。
抽出したfileをfileとして書き出しても無意味だ、そのような高度なFileSystemを載せる余裕のないターゲットで動くものを作るのが目的である。