[UP] [TOP] [Japanese] [English]
一年以上前にこの文章を書いて以来ほとんど放ってあったのですが, 今でもた まに反響があるものですから, 少し書き直しました.

LinuxでH8/3048Fのクロス開発をする

一年前は「最近流行の」と書いたのですが, 最近ではH8/3048Fは定番としてすっ かり定着した感があります. 最近ではH8関係のWebページもたくさんあるので すが, このページも参考程度に見ていただければ幸いです. 私は, H8/3048Fはチップだけで使うのが正統派(必要なところに直接載っける!) だと思っていますので,ここではH8/3048Fをモード7(外部バスなし, 内蔵ROMモー ド)で動かすことを仮定しています. また, AKI-H8がなくてもいいように最後 に回路図例なども載っけておきました. しかし, 他のモードでも, あるいはH8/3048Fに限らず他のCPUのクロス開発で も参考になると思います.

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

最近どこにマニュアルがあるのかはよく知らないのですが, 多分日立のホーム ページのどこかに置いてあるでしょう. (素人が苦労してメーカに資料請求し ていた昔とは隔世の感があります.) 一年前には次のWebページにPDFファイル形式で置いてありました. 日本 語はここ, 英語はここのど こかにあります.

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

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 -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に書かれているプログラムがリセッ ト後にスタンドアローンで走り始めます.

FAQ

途中で``no such 386 instruction'' などと言われる.
ご想像どおり, H8/300のアセンブラの代わりにもとから入っているアセン ブラが実行されてしまっています. それはなぜか? を解明するために, 作成中 のgccバイナリ(./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のオプションで切り替えることができるので気を付け ましょう.

最後の書き込みプログラムがうまく動かない
シリアルポートが空いていますか? gettyなどで埋まってませんか?
書き込みプログラムが止まらない
相手がつながっていないなど, 何か異常があると止まらなくなることが あります. (単にさぼっているだけ) Ctrl-cやkillで強制終了させて下さい.
cygwin32を使ってWindows上では動かせないか?
自作の書き込みプログラム以外は, 同じようにやればインストールでき るはずです. 書き込みプログラムも実はcygwinに対応してあるので, 普通に makeすれば出来るはずです. しかし, いくつか不具合があります. 上の不具合のせいであまり使いものになりませんが, 直すつもりもありません.

ちなみに, 「異常があると止まらなくなる」というのは致命的に見えますが, 無理やりポートに何かデータを入れてやれば通信エラーが検出されて止まりま す. 私はピンセットで無理矢理GNDなどとショートさせて信号を入れていま した.

終わりに

ちゃんと動きましたか? 自分の環境以外で試していないので, インストールな どがうまく行かないかもしれません. その時は状況と共に連絡をして頂けると 幸いです.
kp9m-iwt@asahi-net.or.jp
Last modified: Fri Apr 16 23:16:00 1999
[UP] [TOP] [Japanese] [English]

Last Modified: Thu Apr 5 15:51:41 2001 | Written by iwatam (kp9m-iwt@asahi-net.or.jp)