MochiOS@仮想ファイルシステムの作成part8

MochiOS@仮想ファイルシステムの作成part8

前提知識無しで作るなんちゃって仮想ファイルシステムpart8。

開発日記です。独り言です。

これまでのあらすじ

part 内容
0 仮想ファイルシステムを作りたい宣言をする。
1 ざっくり仮想ファイルシステムの機能を決める。
が、機能呼出し先の仮想ファイルシステムのタスクIDをどう取得するかという問題に気付く。
2 カーネルにタスク名登録機能を実装した。
これでタスク名からタスクIDを取得する事が出来る様になるハズ、なので試したいが試す方法が無い事に気付き、ログ出力タスクの開発を宣言する。
3 ログ出力の為に使うvsnprintf()の仕様を調べる。
4 ログ出力タスクを開発してタスク名からタスクIDの取得機能が正しく動いている事が確認できた。
5 mount機能を実装した。たぶんできてる。
6 FDどうやって管理しようかー。メッセージのやり取り制御を状態遷移で制御しようかー。とか考えて、open機能を実装した。たぶんできてる。
7 openと同じようなシーケンスなので、メッセージとちょっとやる事変えて簡単にwrite機能を実装できちゃった。

readの仕様を考える

今回はread機能を作ります。
仮想ファイルサーバとしては、openもwriteもreadもあんまりやること変わらないハズ。なので簡単にできるかな~と思っている。
あ、キャッシュなんて何にも考えていませんからね。
(ブログ記事までwriteのコピペ)

ユーザタスクmvfsシリアルポートドライバローカルFDテーブル参照read要求( グローバルFD, アドレス, データサイズ )グローバルFDテーブル参照vfsRead要求( グローバルFD, アドレス, データサイズ )デバイス読み込みvfsRead応答( グローバルFD, 処理結果, データ, データサイズ )read応答( 処理結果, データ, データサイズ )読込みアドレス更新ユーザタスクmvfsシリアルポートドライバ

シーケンスの順番は何も変わらず、渡すデータとちょっと間にやる事が変わったくらい。

以下、メッセージ仕様。

■ read要求メッセージ

offset size 内容 意味
0x00 4 機能ID 0x0000_0005 read
0x04 4 タイプ(要求/応答) 0x0000_0000 要求
0x08 4 グローバルFD 任意 -
0x0C 8 アドレス 任意 -
0x14 4 データサイズ 1~24,064 -

なぜ24,064かというと、現在のMochiKernelで送信可能なメッセージの最大長が24,576byteなので、そこから-512byte(ヘッダとかも含めるので)減らした。適当。
そもそも、なんで24,576にしたんだっけ…
(writeとおんなじ。)

■ read応答メッセージ

offset size 内容 意味
0x00 4 機能ID 0x0000_0005 read
0x04 4 タイプ(要求/応答) 0x0000_0001 応答
0x08 4 処理結果 0x0000_0000
0x0000_0001
成功
失敗
0x0C 4 読込み実施サイズ 0~24,064 -
0x10 0~24,064 データ 任意 -

■ vfsRead要求メッセージ

offset size 内容 意味
0x00 4 機能ID 0x0000_0006 vfsRead
0x04 4 タイプ(要求/応答) 0x0000_0000 要求
0x08 4 グローバルFD 任意 -
0x0C 8 アドレス 任意 -
0x14 4 データサイズ 1~24,064 -

■ vfsRead応答メッセージ

offset size 内容 意味
0x00 4 機能ID 0x0000_0006 vfsRead
0x04 4 タイプ(要求/応答) 0x0000_0001 応答
0x08 4 グローバルFD 任意 -
0x0C 4 処理結果 0x0000_0000
0x0000_0001
成功
失敗
0x10 4 読込み実施サイズ 0~24,064 -
0x14 0~24,064 データ 任意 -

実装してみた

大体、OpenやWriteと同じような動きなので、あっさり実装。

とりあえず、実行結果をば。
enter image description here

今回はちょっと動画でご紹介。
上は画面、下はシリアルポート入出力のウィンドウ。

最初にシリアルポート側で"testes"が出ていますが、前回のwrite機能実装でお試ししてみたもの。今回はその後に「aadekita!!!」を入力してやって、それをエコーしています。

ユーザタスクmvfsシリアルポートドライバ1秒ビジーウェイトread要求( 1バイト )vfsRead要求( 1バイト )デバイス読込みvfsRead応答()read応答()write要求( 読み込んだデータ )vfsWrite要求( 読み込んだデータ )デバイス書込みvfsWrite応答()write応答()loop[ 無限 ]ユーザタスクmvfsシリアルポートドライバ

1秒ビジーウェイトしているのは、ドライバ側で割込み待ちができない(現状、MochiKernelではメッセージ待ちと割込み待ちを同時に行えない。)ので仕方なく(CPUを労わる為に)。

write以上にあっさりreadを実装してしまった。
次はもっと簡単で、closeを実装する。キャッシングないからね。

コメント

このブログの人気の投稿

プライバシーポリシー

git@よく使うコマンド早見表

MochiOS@仮想ファイルシステムの作成part10