まず, binutilとgccをftpでとってきて下さい. メジャーなのでどこにでもあ るでしょう. ここでは, /usr/local/srcにそれらを展開するこ とを仮定します.
次に, binutilをコンパイルしましょう.
cd /usr/local/src/binutil-2.8 ./configure --target=h8300-hms make make installこれで, アセンブラやリンカが使えるようになりました. Cがいらないのなら 次はいりませんが, 多分そんな人はいないでしょう. gccを次にコンパイルし ます.
まず, libcが存在しないので, コンパイラにそれを教えなくてはなりません.
config/h8300/t-h8300
をエディタで開いて,
LIBGCC2_CFLAGS = -g -O2 -DDF=SF -DDI=SI $(GCC_CFLAGS) $(LIBGCC2_INCLUDES)を
LIBGCC2_CFLAGS = -g -O2 -DDF=SF -DDI=SI $(GCC_CFLAGS)\ $(LIBGCC2_INCLUDES) -Dinhibit_libcに書き換えます. そしてconfigureを起動します.
cd /usr/local/src/gcc-2.7.2.2 ./configure --build=i586-linux --target=h8300-hms --prefix=/usr/local
--build
オプションは普通は付けなくてもよいはずなのですが,
私のマシンではうまく認識されなかったので付けています.
--prefix
オプションは付けないと/usr
の下に作ら
れてしまって気持ち悪いので付けています. これに関しては一番下のFAQもご
らん下さい.
次にmakeします.
make LANGUAGES=cこれでクロスCコンパイラが出来ました. C++が欲しいという人はもう少し待っ て下さい.
Cコンパイラをインストールします.
make LANGUAGES=c install最後に, デフォルトではクロス環境で浮動小数点はうまく使えないことになっ ていますので(ホストとターゲットで形式が違うかもしれないので), float.h をインクルードするときにエラーを出すようになっています. しかし, 多分同 じでしょうから, x86用のfloat.hをコピーしてしまいます.
cp /usr/lib/gcc-lib/i486-linux/2.7.2.2/include/float.h /usr/local/lib/gcc-lib/h8300-hms/2.7.2.2/include/float.hさて, うまく出来ましたでしょうか. 簡単なテストプログラムを作ってみて下 さい. ただし, その時に, ライブラリ関数を使ってはいけません.
sample.c
を作ったら, コンパイルしてみます.
h8300-hms-gcc sample.c -o sampleちゃんと動いたでしょうか. たぶん
cannot open crt0.o
とかな
んとかエラーが出てしまうと思います.
さて, これを同様に/usr/local/src
の下に展開します. そして
コンパイルです.
cd /usr/local/src/newlib-1.7.1/ ./configure --target=h8300-hms make make installこれで, Cの標準ライブラリがインストールされました. ただし, ファイルシ ステムなどがないので,
printf
などの関数は使えません. しか
し, それ以外の関数は使えるようになります. 試しにサンプルプログラムをコ
ンパイルしてみて下さい. 前回のようなエラーも出ないはずです.
cd /usr/local/src/gcc-2.7.2.2/ make LANGUAGES=c++ make LANGUAGES=c++ installobjective-cが必要な人はそれもどうぞ. 私は使わないのでコンパイルしませ んでした.
さて, インストールは簡単で, 普通に取ってきて普通にコンパイルするだけで す.
cd /usr/local/src/gdb-4.18 make --target h8300-hms make install
sample.c
とします.
さて, sample.cをコンパイルします.
h8300-hms-gcc sample.c -o sample出来たら, gdbを立ち上げます.
h8300-hms-gdb sampleここで, マシン名をセットします.
(gdb) set machine h8300hそして, 次のコマンドを入れます.
(gdb) target sim (gdb) load sample (gdb) runすると, 普通のgdbのようにプログラムが走り始めます. runの前にブレークポ イントの設定などがいつものように出来ます. さらに,
info
target
とすると
Symbols from "/home/iwata/src/h8/sample". simulator: Attached to sim running program /home/iwata/src/h8/sample #instructions executed 30 #cycles (v approximate) 56 #real time taken 0.0000 #virtual time taked 0.0000 #compiles 15 #cache size 1000 While running this, GDB does not access memory from... Local exec file: `/home/iwata/src/h8/h8prog', file type coff-h8300. Entry point: 0xf300 0x0000f300 - 0x0000f366 is .text 0x0000fe00 - 0x0000fe02 is .stackてな感じで, 実行した命令数やサイクル数まで出てきます.
独自に回路を作ろうとする方は, くれぐれも高電圧をかけすぎないように注意 して下さい. 普通の端子にかけてはいけないのはもちろんですが, 電源を切る ときVppの方が先に切れるようにしないと, すぐ壊れてしまいます.
h8comm
の使用方
法はh8commマニュアルをご覧下さい.
h8comm -d -r sample.binとすると, sample.binというバイナリファイルを読んでRAM上に ロードさせ, 実行させます. その後デバッグモードに入り, stdinをシリアル へ, シリアルの内容をstdoutに出します.
まず, サンプルのCプログラムを作成します. ここではCのライブラリは使えま せん. プログラムが大きくなりすぎてRAMの中に収まらなくなってしまうから です. 数行程度の短いプログラムで試してみて下さい.
ldのコマンドファイルとしてh8ram.xを使用します. h8commをインストールし たならば, /usr/local/lib/h8の下にコピーされているはずです.
例えば, sample.cのバイナリを作りたいとすると
h8300-hms-gcc -O -mh -mrelax -T /usr/local/lib/h8/h8ram.x sample.c -o sample h8300-hms-objcopy -O binary -R .stack sample sample.binこれで, sample.binという名前のバイナリファイルができます. ちなみに,
-mh
オプションはH8/300Hのコードを吐かせるオプショ
ン, -mrelax
はジャンプを最適化してくれるオプションです. 詳
しくはGCCのマニュアルを見て下さい. H8/300Hで-mhオプションを付けないと,
64Kより上のメモリに直接アクセスできなくなることがあるようです. 特に最
適化オプションを付けないとなるようです.
これを実行するには
h8comm -d -r sample.binとします.
h8300-hms-gcc -O -mh -mrelax -T /usr/local/lib/h8/h8ram.x -nostartfiles /usr/local/lib/h8/romcrt0.o sample2.c -o sample h8300-hms-objcopy -O binary -R .stack sample2 sample2.bin
-nostartfiles
というオプションは, 標準のcrt0.oを読み込まな
いというオプションです.
これを書き込んで実行します.
h8comm -d sample2.binC標準ライブラリを使用している時はファイルサイズが大きいためなかなか終 わらないはずです. 気長に待ちましょう.
書き込みが終わったら即座にプログラムが走り出します. (-d
オ
プションを付けていない時は書き込み後リセット状態で停止します)
ROM書き込み回路を外してみて下さい. ROMに書かれているプログラムがリセッ ト後にスタンドアローンで走り始めます.
./xgcc
)に次のオプションをつけて実行してみて
下さい.
./xgcc --print-search-dirsディレクトリの名前がずらずらと出てきます. そこの
programs:
の行に注目してください. そこで出てきたディレクトリにH8/300用の
アセンブラなどが入っていますか?
多くの場合, /usr/local/libの下にbinutilsがインストールされているのに gccは/usr/libの下を見ていることが原因です. gccのconfigure時に --prefix=/usr/local をつけて, gccを/usr/localの下に入れましょう.
これに限らず, prefixの問題(/usr/libか/usr/local/libか)ではまることが多 いようです. configureのオプションで切り替えることができるので気を付け ましょう.
ちなみに, 「異常があると止まらなくなる」というのは致命的に見えますが, 無理やりポートに何かデータを入れてやれば通信エラーが検出されて止まりま す. 私はピンセットで無理矢理GNDなどとショートさせて信号を入れていま した.