H8/3048FをLinuxで使う

秋月のキットにもなって最近流行りのH8/3048Fですが, これの開発環境を Linuxで構築する例について紹介します. ここでは, H8/3048Fをモード7(外部 バスなし, 内蔵ROMモード)で動かすことを仮定していますが, 他のチップやモー ドで動かす場合でも参考になるでしょう.

この話は現在まだ実験中ですので, 変わる可能性があります. Contributionは 歓迎します.

H8のマニュアルを入手する

日立に頼んでもよいのでしょうが, WebページにPDFファイル形式で置いてあり ます. 日本 語はここ, 英語はここのど こかにあります. 私はLinuxで使えるAcrobat Reader 3.0Jを持っていない ので(どこかにありますか?)英語版しか見ていません.

GNUのツールをインストールする

H8/3048FはGNUのbinutilやgccでサポートされています. これを使えば, Cでプ ログラムを書いてバイナリに落とすことができます.

まず, 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 --local-prefix=/usr/local
--buildオプションは普通は付けなくてもよいはずなのですが, 私のマシンではうまく認識されなかったので付けています. --localオプションは付けないと/usrの下に作ら れてしまって気持ち悪いので付けています.

次に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とかな んとかエラーが出てしまうと思います.

newlibをインストールする

ここで, newlibをインストールします. newlibはFSFがGPLに沿って配布し ている組み込みCPU用のlibc相当のライブラリです. archieで探してみて下さ い. 私はftp.sra.co.jpで見つけました. 本家CygnusのFTPサイトにもあります.

さて, これを同様に/usr/local/srcの下に展開します. そして コンパイルです.

cd /usr/local/src/newlib-1.7.1/
./configure --target=h8300-hms
make
make install
これで, Cの標準ライブラリがインストールされました. ただし, ファイルシ ステムなどがないので, printfなどの関数は使えません. しか し, それ以外の関数は使えるようになります. 試しにサンプルプログラムをコ ンパイルしてみて下さい. 前回のようなエラーも出ないはずです.

g++をインストールする

ついでに, g++もインストールしましょう. 今まではlibcがなかったのでイン ストールできなかったのですが, これでインストールできるようになりました.
cd /usr/local/src/gcc-2.7.2.2/
make LANGUAGES=c++
make LANGUAGES=c++ install
objective-cが必要な人はそれもどうぞ. 私は使わないのでコンパイルしませ んでした.

gdbをインストールする

gdb, すごいです. H8/300のリモートデバッグだけでなく, シミュレータもつ いています. こんなものがタダで手に入っていいんだろうかと思うほどです.

さて, インストールは簡単で, 普通に取ってきて普通にコンパイルするだけで す.

cd /usr/local/src/gdb-4.18
make --target h8300-hms
make install

gdbで遊んでみる

gccとgdbを入れたので, とりあえず動くか確かめてみることができます. 適当 なプログラムを書いて下さい. ここでは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
てな感じで, 実行した命令数やサイクル数まで出てきます.

書き込み回路を作る

CPUを単体で買ってきた人は, 書き込み回路を作りましょう. ここでは, シリ アルポートに接続するアダプタを作成します. 私の回路を参考にして下さい. 以下, この回路 を前提として話を進めます.

独自に回路を作ろうとする方は, くれぐれも高電圧をかけすぎないように注意 して下さい. 普通の端子にかけてはいけないのはもちろんですが, 電源を切る ときVppの方が先に切れるようにしないと, すぐ壊れてしまいます.

CPUボードを作る

相手側のH8/3048F CPUボードがないと話になりませんので, 用意して下さい. 最低限この回路を作れば, あとはI/Oポートを好 きに使えます.

書き込みプログラム

Linuxが走っているホストのシリアルポートからプログラムをターゲットにダ ウンロードするプログラムを作ります. 作るのが面倒でしたらh8commを使って下さい. インストール方法はh8commのインストール, h8commの使用方 法はh8commマニュアルをご覧下さい.

h8comm -d -r sample.bin
とすると, sample.binというバイナリファイルを読んでRAM上に ロードさせ, 実行させます. その後デバッグモードに入り, stdinをシリアル へ, シリアルの内容をstdoutに出します.

プログラムのバイナリを作る

最初は練習としてRAM領域だけで動作するプログラムを作ってみます. h8comm を使って, 自分で書いたプログラムをブートストラップローダの代わりに実行 します. H8/3048 のRAM領域は狭いのでこの方式では大きなファイルはロードできません.

まず, サンプルの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
とします.

ROM化

さて, いよいよROMにプログラムを焼き込むことにします. ROMに焼き込めるプ ログラムを作るには次のことに注意しなくてはなりません. サンプルのプログラムを書いたら(sample2.cというプログラム名であると仮定 します), コンパイルして実行します.
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.bin
C標準ライブラリを使用している時はファイルサイズが大きいためなかなか終 わらないはずです. 気長に待ちましょう.

書き込みが終わったら即座にプログラムが走り出します. (-dオ プションを付けていない時は書き込み後リセット状態で停止します)

ROM書き込み回路を外してみて下さい. ROMに書かれているプログラムがリセッ ト後にスタンドアローンで走り始めます.

終わりに

ちゃんと動きましたか? 自分の環境以外で試していないので, インストールな どがうまく行かないかもしれません. その時は状況と共に連絡をして頂けると 幸いです.
iwata@tsl.pe.u-tokyo.ac.jp
Last modified: Wed Jul 8 20:08:34 1998