今回は4thステップになります。
4thステップの概要は以下の通り。
ファイル転送のためXMODEMプロトコルの実装
アセンブラによるスタートアップルーチンの説明
■なぜOS作成にファイル転送が必要か
そもそも、OSを作るのになんでファイル転送が必要なのかと思う人もいると思いますが、これはのちのステップでのブートローダー作成につながるようです。
現在はプログラムを入れ替えるために毎回フラッシュROMへの書き込みを行ってますが、ROMへの書き込みはディップスイッチの切り替え再起動が毎回必要で面倒です。
さらにH8/3069F内蔵フラッシュROMの書き換え自体に回数制限(1000回くらいの模様?)もあります。なので、ブートローダーでOSを毎回RAMにダウンロードする仕組みを作ることで、開発の効率化とフラッシュROMの保護を狙うことになります。
ファイル転送機能はその第一歩ということです。
ファイル転送機能は本書ではXMODEMという昔から存在するプロトコルをマイコン上に実装します。マイコン側からファイルを転送することはないので、受信機能のみを実装し、ファイル送信は既存のソフトを使います。
私の環境では、H8/3069Fとのシリアル通信にTera Termを使ってますので、Tera Termの機能でXMODEM送信を行いました。
■XMODEMデバッグ時に少しハマりました
最初XMODEM実装がうまく動かなかったので、デバッグ用に別途作成済みのputs関数でデバッグ用メッセージをコンソールに表示しようとしたのですが、ますます動作しなくなってしまいました。
最初、なぜデバッグ文を追加するだけで動きが変わるのか?と思ったのですが、考えてみると当たり前でした。
puts関数自体がシリアルを通じてコンソール上にメッセージを表示する関数です。シリアル通信上でファイル転送をしているのに、その間に別のシリアル通信を使ってしまってはまともに動くはずがありません。
ということで、現状シリアル通信を複雑に使う機能のデバッグは机上で行うしかないようです。LCDでもつなげばそこにデバッグ用のメッセージを出せるのかもしれませんが。
■ファイル転送実行結果
本章より、コマンドプロンプトっぽい機能も実装され(まだファイル転送とダンプだけですが)、ちょっとOSっぽくなりました。
以下、転送したファイルをマイコン上でダンプした結果です。
PC上のダンプとも一致してます。
末尾に1aが並んでいるのはXMODEMの仕様です。
なお、本章でメモリダンプの関数も実装するのですが、私の場合、オリジナルで既に作ってましたので、そのまま使ってます。
私が作ったダンプ関数ではメモリのアドレスも表示されるのですが、ちゃんとリンカ・スクリプトで設定したアドレス
MEMORY
{
romall(rx) : o = 0x000000, l = 0x080000 /* 512KB */
vectors(r) : o = 0x000000, l = 0x000100 /* top of ROM */
rom(rx) : o = 0x000100, l = 0x07ff00
ramall(rwx) : o = 0xffbf20, l = 0x004000 /* 16KB */
buffer(rwx) : o = 0xffdf20, l = 0x001d00 /* 8KB */
data(rwx) : o = 0xfffc20, l = 0x000300
stack(rw) : o = 0xffff00, l = 0x000000 /* end of RAM */
}
が表示されてましたので、ちゃんと動いているようです。
■アセンブラのスタートアップルーチン
後半はアセンブラで記述されたスタートアップルーチンの説明です。
一部C言語では実装できない処理をアセンブラで記述してます。
とはいっても、スタックポインタを特定のレジスタに格納して、すぐC言語側のmainに飛んでいるだけなので、OSの処理としては単純です。
ただ本書はアセンブリ言語そのものの説明にある程度ページが割かれているので、アセンブラの興味のある人にもいいんじゃないですかね。
ということで、4thステップ完了です。