(注意)このブログは本家のほうの文章部分のみの転載です.ソースコードの配布,画像などについては本家のほうを参照してください.文章中のリンク先は面倒なのですべて本家のほうに変換してしまっているのでご注意ください.

前回はシリアル送信で 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とかいう方式がいくつかあるのだけど,
  • (案1)XMODEMあたりをてきとうに実装する.
    • 長所...世の中になるXMODEMに対応したファイル転送アプリを使って転送できる.
    • 短所...とくになし.
  • (案2)てきとうな独自プロトコルを作って実装する.
    • 長所...好きにプロトコルを作れるので,どうにでもなる.
    • 短所...ファイル転送アプリを自作する必要あり.
うーんどうしようかなあ.

あと,転送するプログラムはブートローダーがRAM上に展開するのだけど,これも実行形式ファイルのフォーマットを何にするか決めておかないといけない.実行形式ファイルはELF形式とかモトローラのSレコード形式とかCOFF形式とかあるけど,そーいう一般的な形式にするか,それともオリジナル形式にしてしまうか.

うーん悩みどころだ.