組込プログラムではリセットスタートで起動し、自分自身で必要なハードウェアの初期化をするプログラムが基本となります。
そのようなプログラムの例としてROMモニタをとりあげます。
ここではROMモニタをソースから構築してCPUボードに書込むまでの手順を説明します。
ターゲットボードとしてJSD製のH8S2212A CPUボードを使います。
H8S2212UはUSB経由のブート書込が可能なCPUで、CPUボードはUSBバスパワーで動作しますので専用のケーブル・電源なしでプログラムの開発ができる便利なボードです。

ブート書込みの準備

赤枠で囲んだ4本のジャンパをすべて差し込んでからUSBケーブルに接続します。
これでブート書込みの準備が出来ました。
※ブート書込を失敗したりやり直す場合は一度USBケーブルを抜いて接続し直して下さい。
プロジェクトはJDEのインストールで /usr/src/jde/work/H8S2212-A/mon_H8S2212A/mon_H8S2212A.jpr
にインストールされます。
ソースが存在しない場合はこちらからダウンロードして /usr/src に保存しCygwinウィンドウで tar コマンドを使って展開して下さい。
メニューからプロジェクト mon_H8S2212A.jpr を開き
(再構築)をクリックします。
コンパイルメッセージ欄に「コンパイルとリンクが終わりました」と表示されたら構築完了です。
エラーが発生した時は下図と較べて設定を確認して下さい。

どのようなメモリ配置でプログラムが作成されたかを確認するにはメッセージ欄の文字 mon_H8S2212A.map をダブルクリックします。
表示されたエディタウィンドウでまず .text という文字列を検索してみます。
.textはプログラムのセクションでプログラムが0x00001000から0x6880のサイズで展開されていることを示しています。
同様に .vectors .bss .heap .stack について検索するとメモリ配置がCPUの内蔵ROM、RAMの範囲を超えていないことを確認できます。
リンカスクリプトで定義されたROM、RAMの範囲を超えるとリンカエラーになりますからこのマップファイルを確認しなければならないことはほとんどありませんが、
組込プログラムで解決できないトラブルが発生したときには念のためにマップファイルを確認することを覚えておくと役立ちます。

次にmon_H8S2212A.motをダブルクリックして生成された転送用のSフォーマットファイルを見てみます。
これは下図のようにプログラムのバイナリデータをアスキー文字でフォーマット化したものです。
先頭5-8文字がアドレスで続いて16進表記のデータが続き最後の2文字がチェックサムになっています。
通常はこのファイルを意識する必要はありませんがどのような形式のファイルが生成・転送されるかを知るために一度は確認しておくと何かの時に役立ちます。

次に ブート書込ツールを使って構築したモニタプログラムをターゲットボードに書き込みます。
プログラムのブート書込を参考にしてブート書込をおこなってください。
書き込んだモニタを起動してみます。
USBケーブルを外し、赤枠で囲んだジャンパを外してからケーブルを再接続します。
LEDが点滅を開始したらモニタが正常に動作しています。

※このボードではBOOTとMONのシルクが逆になっています、モニタを起動するときは上図で左側のジャンパを外すようにしてください。
通信プログラムを起動してENTERキーをたたくとモニタプロンプトが表示され、’?’を入力するとモニタコマンド一覧が表示されます。

シンプルなprintfプロジェクトを作成して構築、書込・実行します。

ソースは下図に表示している7行が全てです。
組込プログラムではmain()から抜けないのが原則なので、printf()を実行した後にforループで停止します。
puts関数やprintf関数を利用する場合は、syscalls_newlib.S を、プロジェクトに追加 して下さい。

正常に構築が終了したらプログラムの転送・書込みに進みます。
エラーが発生したときはエラーの書込と修正を参考にして構築完了するまで修正をおこないます。
CPUボードにUSBケーブルを接続しモニタが起動してLEDが点滅していることを確認します。

ROM化ボタンをクリックしてプログラムの書き込みを開始します。
通信プログラムが起動しターゲットボードにプログラムを転送して実行します。

通信画面で最後に表示されている"Hello world."が実行されたプログラムの出力です。
それ以外はモニタが出力した表示出力です。
プログラム開始アドレスが0x00008100、サイズが0x0000A97D=43,389byteとなっています。
1行だけのプログラムなのにサイズがかなり大きくなっているのはprintfを使うと多くのライブラリ関数を必要とするためです。
使っているライブラリ関数の一覧は printf.map で確認することができます。
ROM化されたプログラムがある場合はモニタを起動してRUNコマンドでプログラムを実行することができます。
下図が実行画面です、モニタからRUNコマンドで実行した場合にはプログラムステータスが表示されます。

ジャンパを取り外すとパワーオンリセットでプログラムを実行することができます。

下図が実行画面です、パワーオンリセットで実行する場合はプログラムの出力だけが表示されます。

printfを使うとソースはシンプルでも生成されたプログラムはかなり大きくなります、ここではプログラムサイズが小さくて済む文字列入出力を説明します。
メニューからプロジェクト /usr/src/jde/tutorial/puts/puts.jpr を開き
(再構築)をクリックします。
コンパイルメッセージ欄に「コンパイルとリンクが終わりました」と表示されたら構築完了です。
エラーが発生した時は下図と較べて設定を確認して下さい。 ソースは下図に表示している12行が全てです。
conio.c に、puts() に関する記述してありますので、プロジェクトに必要となります。
puts関数やprintf関数を利用する場合は、syscalls_newlib.S を、プロジェクトに追加 して下さい。
ROM化ボタンをクリックしてプログラムの書き込みを開始します。
通信プログラムが起動しターゲットボードにプログラムを転送して実行します。

プログラムサイズが 0x00000804=2052byte とprintfを使った場合に較べてたいへんコンパクトになっています。
サンプルプログラムではforループ中で文字入力待ちをしていますのでキーボードをたたく毎に文字列が出力されます。