バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-external-storage-backnumber/
はじめに
FatFsのメモリ上シミュレーションの話。
今回は対話モードでいろいろ触って、ファイルアクセス。
登場人物
博識フクロウのフクさん
![指差しフクロウ](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
![技術者太郎](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
FatFsとの対話の流れ
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
とりあえず、前回は「volume status参照」まで試したところだ。
- 物理ドライブへのアクセス初期化
- FATにフォーマット
- 論理ドライブマウント
- volume status参照
- ルートディレクトリ参照
- ファイルオープン(生成&書き込みモード)
- ファイルへの書き込み
- ファイルクローズ
- ルートディレクトリ参照
- ファイルオープン(読み込みモード)
- ファイル読み出し
- ファイルクローズ
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
今回は「ルートディレクトリ参照」からだね。
ルートディレクトリ参照
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
ディレクトリ参照のコマンドは「fl」になる。
>fl 0:
0 File(s), 0 bytes total
0 Dir(s), 141228032 bytes free
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
ん?
引数の「0:」って?
0は論理ドライブ番号だと思うけど?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
flの引数はpathになるんだよ。
Windowsとかだと「C:」って指定する感じで「0:」って指定している。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者03アップ.png)
あーなるほど。
そういう意味か。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
表示された情報としては、
まっさらな状態だからファイルもディレクトリも無いって状態だね。
ファイルオープン(生成&書き込みモード)
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
さあ、いよいよファイルアクセスだ。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」08アップ.png)
待ってましたー!
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
使用するコマンドは「fo」
所謂fopenをしてくれるコマンドだ。
>fo 6 test.txt
rc=0 FR_OK
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
「test.txt」はopenするファイル名だと思うけど、
その前の「6」はなんだ?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
ファイルオープン時のmodeだね。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
mode?
もしかして、読み/書き/追記とかの?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
そうそう。
FatFsでは以下のように定義されている。
#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
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
あれ?
今回指定した「6」ってのが無いよ???
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
これらの番号はビットアサインになってて、
「6」ってことは
FA_CREATE_NEW
且つ
FA_WRITE
ってことになる。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者03アップ.png)
なるほど。
ファイルが存在しないから
ファイルを作りつつ書き込みモードにしてるってことか。
ファイルへの書き込み
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
次はファイルへの書き込み。
コマンドは「fw」
>fw 16 0x61
16 bytes written.
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」20アップ.png)
これは・・・なにをしたんだ?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
「0x61」を16byte分書き込んだ。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
え?
そういう指定の仕方になるの??
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
あくまで対話モードのコマンドの仕様としてそうなってるってだけだね。
APIレベルだと一般的なfwriteと同様にいろいろデータを書き込みできる。
書き込みテストをするためだけのコマンドってことだね。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
なんだ。
ちょっとびっくりした。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
でも、16byteの書き込みは成功したようだね。
ファイルクローズ
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
そしてfclose相当のコマンドが「fc」
>fc
rc=0 FR_OK
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
特に引数とか無いんだ。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
対話モードの時は一度に開くファイルの数は一個になってて、
foで指定したopenしたファイルがそのまま次のコマンドでも反映されるようだ。
さっきのfwも特にファイル名とかファイルポインタとか指定しなかったのはそのせい。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
そういえば、fwの時もそれっぽい引数はいなかったね。
これでFileSystemにファイルが保存されたわけか。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
次回は、これを読み出して、内容の確認だな。
まとめ
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まとめだよ。
- flコマンドでルートディレクトリ参照。
- 引数はpathなので「0:」のような表現になる。
- ファイルオープン時にmode指定。
- modeはビットアサインになってる。
- ファイルへの書き込みコマンド「fw」はお試しようのため、自由に書き込みが出来るコマンドにはなっていない。
- 対話モードは複数ファイルは開けない。
バックナンバーはこちら。
コメント