since 02 Apr 2003

開発環境の整備

プログラム作成の概要

ターゲットとなるH8マイコンボード(以降、ターゲットボード)で動かすプログラ ムはPC上でのプログラム開発とは異なります。マイコンボード上で作成して、コ ンパイルして、デバッグして、、、といった事は明らかに出来ません。そこで出 番となるのがクロスコンパイルという作業です。

コンパイラやデバッガ等を一から製作するとなると、それはもう大変でしょう が、我々には心強い味方がいます。それがGCC(GNU Compiler Collection)です。 というのも、GCCを利用すると、PCで利用されているようなPentiumIVや Celeron、PowerPC等を始めとして、組み込みに利用されるARMやVRやSH/H8等に 至るまで実に様々なMPUを対象としたクロスコンパイルが可能となるのです。 先人に感謝しつつ恩恵に預かりましょう。具体的なクロスコンパイルの手順は 以下の通りです。

手順内容
1PC(以降、ホストマシン)でプログラム開発
2ホストマシンでGCCでクロスコンパイル
3ターゲットボードにプログラムを転送
4ホストマシンでデバッグ
52〜4を繰り返す

ホストマシンはLinux機でも、Win機+Cygwinでも、他PC-UNIX機でもGCCが利用 できればなんでも可です。

ソースをget

まず、基本的に参照すべきウェブサイトは、 GNU Development Tools for the Hitachi H8/300(HS) Series (以降、"sourceforge")です。 sourceforge では GNU make を前提としていますので、 お使いの環境にインストールされていない場合は、事前に用意する必要があります。 環境を整えるのに必要なものは以下の通り。

プログラム 内容 場所
binutils アセンブラ・リンカ GNUの "All GNU Packages"の"Binutils"から
GCC Cコンパイラ GCC Home Pageから
GCC用パッチ H8/300H用パッチ GNU Development Tools for the Hitachi H8/300(HS) Series から
newlib 標準Cライブラリ RedHatの "More projects..."の"newlib"から
gdb デバッガ GNUの "All GNU Packages"の"Gdb"から
h8write ライタプログラム Linux研究所の「Open SH/H8 writer」から

ちなみに、私が用意したバージョンは以下。

2003年3月時点でGCCのサイトではgcc-3.2.2が公開されていますが、 sourceforgeではgcc-3.2.1が対象となっていますので、今回はgcc-3.2.1で環 境を構築します。gdbはなるべく新しい方がいいだろうと思い、sourceforgeで はgdb-5.2.1となっていますが、今回はgdb-5.3を使用 します。2003年3月現在では、gdb-5.3でH8/300Hの シミュレーションを行うとabortしてしまいます。よってgdb-5.2.1に 変更します。以降、順次make作業を行います。順番は以下 に示す通りに行って下さい。binutilsが無いとGCCのコンパイルはでき ない等の問題が生じるので御注意。

binutilsのmake

binutilsにはアセンブラやリンカ等が含まれています。GCCをmakeするにあた り、まずbinutilsをインストールしておく必要があります。ここでは ${H8PREFIX}(/usr/local/h8)以下に必要なプログ ラムをインストールします。デフォルトでは/usr/local/以下にインストール されるようになりますが、後々他アーキテクチャ用のクロスコンパイラを構築 する際に混乱の元となることが想像されるので、H8/300H専用のディレクトリ にインストールします。

$ export H8PREFIX=/usr/local/h8
$ tar zxpvf binutils-2.13.tar.gz
$ cd binutils-2.13
$ mkdir objdir
$ cd objdir
$ ../configure --prefix=${H8PREFIX} --target=h8300-hms
$ make CFLAGS="-O2 -fomit-frame-pointer" all
# make install
(参考)hms: Hitachi Micro Systems

binutils-2.13/binutils/READMEにobjdirを作って作業せよと書いてあるので、 素直に従います。こうすることで他アーキテクチャのクロスコンパイラをmake する際に今回展開したソースをそのまま利用できます。また "-fomit-frame-pointer"オプションはGCCのオプションで、フレームポインタ を使わずにスタックポインタを使用するようにします。 Interfaceの記事をご参照。

GCCのmake

言わずとしれたGCCです。必要なのは主にCコンパイラですが、GCCにはその他 諸々のコンパイラが含まれています。newlibのヘッダファイルを利用するため、 newlib-1.11.0.tar.gzも展開し、シンボリックリンクを生成しておきます。こ れで"--with-headers"オプションはいらないはずです。またsourceforgeにも 書いてありますが、GCCをmakeする際に、binutilsをインストールしたディレ クトリにパスが通っている必要があるので、初めに環境変数${PATH}を設定し ます。

$ export PATH=${PATH}:${H8PREFIX}/bin
$ tar zxpvf gcc-3.2.1.tar.gz
$ tar zxpvf newlib-1.11.0.tar.gz
$ cd gcc-3.2.1 
$ ln -s ../newlib-1.11.0/newlib .
$ patch -p1 < ../h8300-hms-gcc-3.1-1.patch
$ mkdir objdir
$ cd objdir
$ ../configure --prefix=${H8PREFIX} --target=h8300-hms \
--enable-languages=c --with-newlib
$ make CFLAGS="-O2 -fomit-frame-pointer" all
# make install

ここで1つ不思議な事が。RedHat8.0 on DELL Inspiron(Celeron 1.2GHz RAM 512MB)で、X上のgnome-terminal 2.0.1からGCC のmakeを行ってみると、途中でgnome-terminalがお亡くなりになります。 dmesgやmessagesを見る限りおそらくgnome-terminalの問題なのだと思うので すが詳しくは分かりません。タブを1つ追加し、新規タブの方をactiveにした ままコンパイルを実行すると最後まで無事に到達しました。kterm等なら問題 ないかもしれませんが、gnome-terminal以外は試していません。デスクトップ 機で試したときは問題なかった気がするのですが、無意識のうちにタブの切替 えをしていたのでしょうか。(11 Apr 2003 追記)

RedHat 9.0 on DELL Inspiron(Celeron 1.2GHz RAM 512MB)では何事もなくmakeが通ることを確認しました。またデスクトップ 機ではRedHat 8.0、9.0共エラー無くmakeできました。(06 Jul 2003追記)

newlibのmake

C言語用の標準ライブラリとしては"glibc2.0"がPC-UNIXでは標準ですが、組み 込み機器ではglibcではサイズが大きすぎて問題があります。限られた資源を 最大限に活用するために、それに見合ったライブラリを使用する必要がありま す。そこで登場するのが"newlib"です。ただし、ファイルシステムなどは存在 しないため、すべての関数が使用できるわけではありません。

$ cd newlib-1.11.0
$ mkdir objdir
$ cd objdir
$ ../configure --prefix=${H8PREFIX} --target=h8300-hms
$ make CFLAGS="-O2 -fomit-frame-pointer" all
# make install

configure時に"target-libgloss"ディレクトリは対応していません旨のメッセー ジが出るが、H8/300Hではこのディレクトリは関係ないので気にしなくて大丈 夫です。

gdbのmake

gdbはデバッガとしての機能だけでなく、H8/300Hのシミュレータとして動作す ることが可能です。2003年3月時点でgdb-5.3を利用しようと試みましたが、 gdb-5.3ではH8/300Hのシミュレートでabort します。 そこで、gdb-5.2.1 を利用することにします。

$ tar zxpvf gdb-5.2.1.tar.gz
$ cd gdb-5.2.1
$ mkdir objdir
$ cd objdir
$ ../configure --prefix=${H8PREFIX} --target=h8300-hms
$ make CFLAGS="-O2 -fomit-frame-pointer" all
# make install
# echo "${H8PREFIX}/lib" >> /etc/ld.so.conf
# /sbin/ldconfig

下2行はmake install中に「${H8PREFIX}/libを/etc/ld.so.cashに追加して下 さい」旨の表示が出るので実行します。これでlibraryが読み込めるようにな ります。私はlibraryはまとめて管理した方が楽だと思っているのでこの方式 を取りましたが、その他${LDPATH}環境変数を設定する方式等、いくつか表示 されますので、お好きな方法で構いません。

h8writeのコンパイル

AKI-H8/3048F用マザーボード(M/B)はAKI-H8/3048Fマイコンボード(ターゲット ボード)へプログラムを書き込む「ライタ」の役割も担っています。ユーザは、 ホストマシンであるPCからシリアルケーブル、M/Bを通じてAKI-H8/3048Fマイ コンボードへプログラムを書き込みます。書き込む際のスイッチの設定はM/B の取り扱い説明書をご参照ください。

ターゲットボードへの書き込みを行うためには、PC上で「ライタプログラム」 を走らせる必要があります。しかし秋月電子製のライタプログラムはWindows 専用であるので、残念ながら今回ターゲットとしているホストマシン(Linux機) では実行することができません。(wineを使って実行されている人もいるよう ですが;^p)そこでLinux用のライタプログラムを用意する必要があります。私 が利用させてもらっているのは三岩氏が 「Linux研究所」で公開されている「Open SH/H8 writer(h8write)」 です。詳しくはそちらをご覧下さい。

$ gcc -O2 -o h8write h8write.c
# cp h8write /usr/local/bin/h8write

当然ですが、h8writeを格納する場所はPATHさえきちんと通っていれば、まっ たくお好みで構いません。/usr/binでも${HOME}/binでも。

実際に使用する場合には、フラッシュROMへの書き込み回数のログを取ってお いた方が嬉しいかなと思い、以下のようなシェルスクリプトを書いて "${HOME}/bin/h8w"に保存し、PATHを通して"h8w hoge.mot"のように使用して います。

#!/bin/bash

WRITE_FILE="${HOME}/.h8w.log"

# ログファイルが無ければ作る
if [ ! -f ${WRITE_FILE} ]; then
  echo "0" > ${WRITE_FILE}
fi

WRITE_NUM=`cat ${WRITE_FILE}`
WRITE_NUM=`expr ${WRITE_NUM} + 1`

# H8/3048Fにmotファイル"$1"を書き込み
h8write -3048 $1

# H8書き込み回数をログファイルに記録
echo ${WRITE_NUM} > ${WRITE_FILE}

# 終了時にこれまでのH8書き込み回数を表示
echo "[${WRITE_NUM}] times"

私はAKI-H8/3069Fを試していた際に既に使用していたので、このライタプログ ラムを使っています。他にも諸兄が開発されているものがありますので、それ らを使っても問題ないと思います。

修正


AKI-H8の開発をGCCで行う ホームページ