サンプルプログラムのコンパイル・実行を通じて、機械研的H8開発の流れを掴む。
samples/の下には幾つかのディレクトリが有るはずだ。
samples/ hello_world/ 3069S.H Makefile main.c : : cost_model/ 3069S.H Makefile main.c : :
基本的に一つのプログラムは一つのディレクトリを占有する。
とりあえず、一番基本的なプログラムであるhello_worldについて説明する。
hello_world/配下には以下のファイルが有る(と思う)。
hello_world/ 3069S.H Makefile mon_func.h main.c ram3069.x ramcrt0.S service.c
大抵のファイルについて、詳しく内容を理解する必要は無い。
全てのファイルはテキストファイルで、可能な限り注釈を付けてあるから、暇なら覗いてみると良い。terapadやnotepadにでもドラッグ&ドロップすれば見れるはずだ。
通常ユーザーが変更するのはmain.cだけだと思っていい。
中身はよくあるC言語の入門プログラムである。
#include <stdio.h>
int main()
{
printf("hello,world!\r\n");
}
\r\nっていう綴は見なれないかも知れない。
H8には画面もプリンターも接続されていない。 接続されているのはシリアルの端末だ(大抵はteratermかハイパーターミナルが起動したパソコンのはず。)シリアル端末では、\rでカーソルが左端に、\nで次の行に移動する。多分、両方やるのが望みの動作だろう。
何の事か分からなければ\rを削ってみるのは良い実験になる。爆発したりはしないはずだ、たぶん。
~/$ cd samples/hello_world/ ~/samples/hello_world$ make /usr/local/bin/h8300-hms-gcc -mh -mint32 -Wall -g -O2 -c ramcrt0.S -o ramcrt0.o /usr/local/bin/h8300-hms-gcc -mh -mint32 -Wall -g -O2 -c main.c -o main.o main.c: 関数 `main' 内: main.c:6: 警告: 制御が非 void 関数の終りに到達しました /usr/local/bin/h8300-hms-gcc -mh -mint32 -Wall -g -O2 -c service.c -o service.o /usr/local/bin/h8300-hms-ld ramcrt0.o main.o service.o --just-symbols=../../monit or-1.2-3069/monitor.coff -Map sample.map -mh8300h -nostartfiles -relax -lm -lc -lg cc -L/usr/local/h8300-hms/lib/h8300h/int32 -L/usr/local/lib/gcc-lib/h8300-hms/`/us r/local/bin/h8300-hms-gcc -dumpversion`/h8300h/int32 -T ram3069.x -o sample.coff /usr/local/bin/h8300-hms-size -Ax sample.coff sample.coff : section size addr .text 0x18e 0x400004 .data 0x0 0x400192 .bss 0x100000 0x400192 .stack 0x0 0x5ffff8 .ostack 0x0 0x5ffffc .vectors 0x0 0x500192 Total 0x10018e /usr/local/bin/h8300-hms-objcopy -v -O srec sample.coff sample.mot sample.coff(coff-h8300) から sample.mot(srec) へコピーします ~/samples/hello_world$
一箇所、警告が出ている場所が有る。 この場合、main関数が明確な返り値を返していないのが問題らしい。
#include <stdio.h>
int main()
{
printf("hello,world!\r\n");
return 0; /* とりあえず0を返すことにする */
}
を付け加えれば、警告は出なくなる。 警告が出ていてもコンパイルは完了するが、 警告を出すようなプログラムはバグや勘違いの元になるので、警告は潰していくように勤めよう。 再びコンパイルすると、次のようになる。
~/samples/hello_world$ make /usr/local/bin/h8300-hms-gcc -mh -mint32 -Wall -g -O2 -c main.c -o main.o /usr/local/bin/h8300-hms-ld ramcrt0.o main.o service.o --just-symbols=../../monit or-1.2-3069/monitor.coff -Map sample.map -mh8300h -nostartfiles -relax -lm -lc -lg cc -L/usr/local/h8300-hms/lib/h8300h/int32 -L/usr/local/lib/gcc-lib/h8300-hms/`/us r/local/bin/h8300-hms-gcc -dumpversion`/h8300h/int32 -T ram3069.x -o sample.coff /usr/local/bin/h8300-hms-size -Ax sample.coff sample.coff : section size addr .text 0x190 0x400004 .data 0x0 0x400194 .bss 0x100000 0x400194 .stack 0x0 0x5ffff8 .ostack 0x0 0x5ffffc .vectors 0x0 0x500194 Total 0x100190 /usr/local/bin/h8300-hms-objcopy -v -O srec sample.coff sample.mot sample.coff(coff-h8300) から sample.mot(srec) へコピーします ~/samples/hello_world$
先ほどのコンパイルと比べて、出力メッセージの行数がかなり減っていることに注意しよう。
先ほどのコンパイルではservice.cやramcrt0.Sといったファイル(説明は後ほど)がコンパイルされているが、
今回はコンパイルされていない。
これらのファイルは前回のコンパイル時から変更されていないので、コンパイルしなおす必要は無い。
makeはそれを察知してコンパイルを省略する。
もしコンパイルするべきファイルが全く無いなら
~/samples/hello_world$ make make: `all' に対して行うべき事はありません。 ~/samples/hello_world$
と表示される。予想に反してこのメッセージが表示された時は、 大抵エディタで編集してセーブするのを忘れていたりするので、 きちんとセーブしたかどうか、あるいは別のフォルダの プログラムをコンパイルしようとしていないか確認しよう。
コンパイルの結果、以下のファイルが生成されている。
俗に言うオブジェクトファイルである。 気にしなくていいだろう。
リンカが出力するファイルで、どこに何を配置したかが書かれている。 興味があれば覗いてみるといい。
H8に送信するべきファイルだ。
デバッグ情報などが格納されたファイルだ。後々役に立つだろう。
まず、teratermなりハイパーターミナルなりkermitなりminicomなりを用意しよう。
設定はモニターとの通信を参考にする。
H8をパソコンと接続し、電源を投入すれば、以下のような文字列が 表示されるはずだ。
H8 Monitor ver 1.2 Kyoto University Mechatronics Creaters ready >
ready >と表示されていれば、モニタはユーザーの指示を待っている状態だ。 まずはプログラムを転送しよう。そのためにはlコマンドをモニターに対して指示する。
H8 Monitor ver 1.2 Kyoto University Mechatronics Creaters ready > l Please send S record file . ( [ESC] to abort. )
これでモニターはこちらの送信を待つ状態になっている。 teratermやハイパーターミナルを操作して、コンパイルの結果出来ているはずのsample.motを送信すればよい。 メニューから、「テキストファイルの送信」なり「ファイルの送信」なりを選択してsample.motを送信すること。 teratermでは[File]-[Send file]を選択すれば良い。
ready > l Please send S record file . ( [ESC] to abort. ) Filename : sample.mot Data size : 515 Bytes Start Address : 0x400100 ready >
転送は一瞬で終る筈だ。上記のように表示されているだろうか?
失敗したら、[ESC]をおして転送を中断し、もう一度やり直すこと。
次に、転送したプログラムを実行する。gコマンドをモニタに指示しよう。
ready > g Go! hello,world! ready >
プログラムが実行されて"hello,world!"が表示されたはずだ。めでたしめでたし。
不幸にしてトラブったら…最寄りの生き字引に相談だ!
その後、この文書を改善することをくれぐれもお忘れなく!