バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-external-storage-backnumber/
はじめに
FatFsのメモリ上シミュレーションの話。
前回、ファイルへの書き込みをしたので、
今回はファイル読み込み
登場人物
博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
FatFsとの対話の流れ

前回はファイル生成、書き込みで「ファイルクローズ」まで試した。
- 物理ドライブへのアクセス初期化
- FATにフォーマット
- 論理ドライブマウント
- volume status参照
- ルートディレクトリ参照
- ファイルオープン(生成&書き込みモード)
- ファイルへの書き込み
- ファイルクローズ
- ルートディレクトリ参照
- ファイルオープン(読み込みモード)
- ファイル読み出し
- ファイルクローズ

今回は、ファイル読み込みの「ルートディレクトリ参照」からだね。
ルートディレクトリ参照

これは前回説明した、flコマンド。
>fl 0:
----A 2021/04/01 19:30 16 test.txt
1 File(s), 16 bytes total
0 Dir(s), 141225984 bytes free

お!
前回、ファイル生成したから、
test.txtってファイルが出来てるね。
しかも16byte書き込みしたからサイズもちゃんと16byteになってる。
ファイルオープン(読み込みモード)

ファイルオープンは前回説明したfoコマンド。
ただし、今回は読み取りモードでopenする。
一応、前回貼ったFatFsで定義されてるmodeを貼っておこう。
#define FA_READ 0x01
#define FA_WRITE 0x02
#define FA_OPEN_EXISTING 0x00
#define FA_CREATE_NEW 0x04
#define FA_CREATE_ALWAYS 0x08
#define FA_OPEN_ALWAYS 0x10
#define FA_OPEN_APPEND 0x30

読み取りモードだから、FA_READで、「1」を指定すればいいんだね。
>fo 1 test.txt
rc=0 FR_OK
ファイル読み出し

次にファイルの読み出しだが、
コマンドといては「fr」・・・
と見せかけて「fd」ってコマンドを使う。

「fr」ってコマンドは使えないの?
helpには載ってた気がするけど?

対話モードのfrコマンドはファイルの参照位置を進めるだけで
読み出した情報を表示してくれないんだ。
ファイルの中身を参照する場合は「fd」コマンドを使用する必要がある。
って感じだ。
>fd 16
00000000: 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa

お。
前回書き込んだ16byteの0x61が読み出せたっぽい。
ちゃんとファイルっぽい動作してるね!

まぁFileSystemだからねー。
ファイルクローズ

これも前回説明したfcコマンド
>fc
rc=0 FR_OK

ここは特に差はなさそうだねー。
感想

というわけで、対話モードでFatFsを触ってみたわけだが、
感想としてはどう?

最初の方の物理ドライブアクセス初期化、論理ドライブへマウントあたりが
「え?!」
って思ったけど、そこら辺が済めばあとは普通のファイルアクセスと一緒なんだなーって感じだった。

まぁFatFs自体がC言語のファイルアクセス系の仕様に寄せてくれてるからねー。
よって、理解し易いし、分かり易い。
今後の方針

で、この後はどうするの?

折角シミュレーションしてるわけだから、
FAT FileSystemの中を追っていこうかと思ってる。

追うって、ソースコードを?

必要があれば、ソースコードも追うかもしれないが、
基本はディスクイメージの中を見ていく感じかな?

ディスクイメージの中って見れるの?

一応、「dd」ってコマンドがあって、
これを使うとディスクイメージが見れる。
>dd 0 63
PD#:0 LBA:63
00000000: EB FE 90 4D 53 44 4F 53 35 2E 30 00 02 04 25 00 ...MSDOS5.0...%.
00000010: 01 00 00 00 00 F8 00 00 3F 00 FF 00 3F 00 00 00 ........?...?...
00000020: C1 37 04 00 1C 02 00 00 00 00 00 00 02 00 00 00 .7..............
00000030: 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000040: 80 00 29 A5 9B 81 52 4E 4F 20 4E 41 4D 45 20 20 ..)...RNO NAME
00000050: 20 20 46 41 54 33 32 20 20 20 00 00 00 00 00 00 FAT32 ......
00000060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000000A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000000B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000000C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000000D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000000F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA ..............U.

なんかそれっぽいデータが出てきた!

とはいえ、512byteずつでしか参照できないんでちょっと使い勝手が悪いんだよねー。
それに、メモリ上にディスクイメージを構築してるんで、再起動すると消えちゃうし。

じゃー、どうするの?

今はメモリ上にディスクイメージを構築しているが、
これをファイル上に構築して、
それをバイナリエディアで見た方が追いやすいって思ってる。

そういうば、以前そういうこと言ってたねー。

で、実現はできそうなの?

まぁメモリに対して読み書きしているのをファイルに対して実施するだけだからたぶん大丈夫なんじゃない?

(うーん、結果的にはなんとななること多いからあまり心配はしてないが、割と楽観的なんだよなー。)

というわけで、次回からFatFsのディスクアクセス部分を改造してディスクイメージをファイルにする方向で進める!
まとめ

まとめだよ。
- ファイル読み取りのコマンド呼び出しの流れは書き込み時と一緒。
- オープン時のmode指定を読み取りmodeにする。
- ddコマンドでディスクイメージをdumpできる。
- 512byte単位なので若干使い勝手は悪い。
- 次回からメモリ上でなく、ファイル上にディスクイメージを構築できるようチャレンジ。
バックナンバーはこちら。
コメント