tshimizu's diary

日々の記録

組み込みOS(第4回)

ステップ4の内容

今までは、プログラムの書き換えのたびに直接ROMを書き換えてきたが、ROMの書き換え回数には上限があるため、この方法を変更する。ROMにはブート・ローダーを書き込んでおき、起動のたびに、シリアル経由でプログラムをダウンロードし、RAMに展開する。この方法なら、ブート・トーダーを完成させてしまえば、プログラム本体を修正するたびにROMの書き換えを行わなくてすむ。
今回は、XMODEMプロトコルによって、ファイルを転送するところまでやる。

XMODEM

シリアル経由でのファイル転送プロトコル。古くからある(パソコン通信時代に流行ったらしい。)
プロトコルの実装」という響きのワクワク感。

シリアル受信用のライブラリ

今後はH8側でも受信を行うので、そのためのライブラリを実装する。

エコーバック

シリアル通信を行うときのエコーバックはどこに書かれているんだろうかという疑問は以前から持っていた。シリアルドライバで行ってしまうこともあるらしいが、今回、ドライバは送受信に専念するという意味でライブラリの中に書いた。

ファイル転送手順

kz_xmodemを使う方法

書籍で標準で使われている転送ツールではなく、kz_xmodemを使用すると、操作手順が少なくて楽。
(参考サイト: http://blog.livedoor.jp/noanoa07/archives/1994090.html

$ kz_xmodem [送りたいファイル名] /dev/tty.usbserial-FT0UMQ8C

(その後普通に通信)

$ sudo cu -l /dev/tty.usbserial-FT0UMQ8C
書籍通りやる方法(macの場合)

多少操作が増えても、せっかく実装したloadコマンドを使いたい場合は次のようにする。

kzload> load
$ ~+ lsx [送りたいファイル名]

(あとは待つだけ)

ABI(Application Binary Interface)

スタックポインタには、レジスタER7が使われている。だから、ジャンプ命令jrsやリターン命令rtsでは、引数を指定しなくても、勝手にER7が使われている。これはコンパイラが自動で行っているが、多くの場合、ABI(Application Binary Interface)という規格でCPUごとに決められている。したがって、CPUのABIをサポートしているなら、違うコンパイラコンパイルしたオブジェクトファイルでもリンクして正常に動作することができる。

スタートアップの無限ループ

スタートアップ(starup.s)の最後にある

1:
	bra 1b

このbraは戻り先を覚えない簡易的なジャンプ命令のようなもの。引数の1bは、「この命令より前にある”1:”というラベルの内最も近いもの」という意味である。つまり、直前にそのラベルがあるので、無限ループを表す。これ以前のスタックmain()へのジャンプの後、つまりmain()から戻ってきたとき、おかしな動作をして暴走しないようにする対策になっている。

疑問点

ファイル転送のに関して

lsxと、実装したXMODEMに関するプログラムの役割の範囲がよくわからない。
lsxはひたすらプロトコルのルール通りにビットデータを投げてきて、実装したプログラムは、それを意味のある形で上手く受け取っている?
さらに、kz_xmodemを使用した場合は、実装部分に関しては丸々使わないことになるのでは・・・と思っているけど、その認識はあっているのだろうか。 

ABIに関して

対象CPUのためにどのABIを使うのかというコンパイラの設定は、どこでやっているのかがわからない。Makefileの項目のどれかがその設定なんだろうか。


12ステップで作る組込みOS自作入門

12ステップで作る組込みOS自作入門