前回はシリアル送信で hello world が出せたので,今回はブートローダーを自作する 準備として,シリアルの送受信をやってみる.というのは,今回自作する ブートローダーは,シリアル経由でOSの実行形式ファイルをダウンロードして RAM上に展開して実行,という動作にするつもりなので,シリアル経由での操作が 必須になるからだ.
まあ前回作成したソースコードで,シリアル受信の関数 serial_getc() がすでに 作ってあるので,main.c をちょいちょいと適当に修正して,起動したらプロンプトを 出して文字列が入力されたらそれをそのまま返すようなプログラムにしてみた. 以下のような感じ.
で,ビルドしてフラッシュROMに焼いて実行してみる.フラッシュROMへの転送の しかたは前回を参照.
teapot# cu -l /dev/cuad0 Connected Hello World! > test test > sample sample > test test >うーん,あっさり動いた.
とりあえずこれでシリアルの送受信はできるようになったので,いよいよ ブートローダー作成なのだけど,何点か決めなきゃならんことがある.
まず,ブートローダーは起動したらプロンプトを出して,入力されたコマンドに 応じて動作するというような動作にするつもり.で,コマンドには「シリアル転送で プログラムの実行形式をダウンロード」とか,「ほげほげ番地にダウンロードした プログラムを実行」みたいなのを作る.つまりコマンドベースで動作して, プログラムのダウンロードや実行を行えるようにする.ちなみにこーいうのを 一般的に「モニタ」とか言ったりする.
で,決めなきゃならんのは,シリアル経由でのプログラムのダウンロード方法だ. 世の中にはシリアル経由でファイル転送するためのXMODEMとかYMODEMとかいう 方式がいくつかあるのだけど,
あと,転送するプログラムはブートローダーがRAM上に展開するのだけど, これも実行形式ファイルのフォーマットを何にするか決めておかないといけない. 実行形式ファイルはELF形式とかモトローラのSレコード形式とかCOFF形式とか あるけど,そーいう一般的な形式にするか,それともオリジナル形式にしてしまうか.
うーん悩みどころだ.