サンプルプログラムの使い方

サンプルプログラムのコンパイル・実行を通じて、機械研的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$ 

と表示される。予想に反してこのメッセージが表示された時は、 大抵エディタで編集してセーブするのを忘れていたりするので、 きちんとセーブしたかどうか、あるいは別のフォルダの プログラムをコンパイルしようとしていないか確認しよう。

コンパイルの結果、以下のファイルが生成されている。

main.o
ramcrt0.o
service.o

俗に言うオブジェクトファイルである。 気にしなくていいだろう。

sample.map

リンカが出力するファイルで、どこに何を配置したかが書かれている。 興味があれば覗いてみるといい。

sample.mot

H8に送信するべきファイルだ。

sample.coff

デバッグ情報などが格納されたファイルだ。後々役に立つだろう。

転送&実行

まず、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!"が表示されたはずだ。めでたしめでたし。


不幸にしてトラブったら…最寄りの生き字引に相談だ!
その後、この文書を改善することをくれぐれもお忘れなく!


H8モニターのページへ