使ってみよう、linux!
GDB-H8 simulator編

(cygwin版)

GDBでH8-300Hシミュレータとして使えないか
実験した時の記録です。




まず最初に
1. 現時点で敢えてGDB上でH8シミュレータを使用する利点はない

ルネサスシミュレータの方が安定かつ高機能です。
周辺I/Oはおろかリセット機能、リセットベクタからのPCフェッチ、コマンドからの再スタートすら出来ません。
特定命令でファイルI/Oを行う機能があるようですが、…マニュアルは?
2. H8 GCC クロスコンパイラが必要

H8S/H8SX/H8300H等、シミュレータのモードを設定するために
GDB-6.8 は elf ファイルのヘッダに埋め込まれた情報を読み込むのですが
そのために最低でもbinutilsが必要です。

さらにCPUのコア部分レジスタ、

   PCなどをデバッガから変更するには現在のPC行がCソース上にないといけない

という重大なGDB上のバグ?(制約?)があるため、気軽にアセンブラの実験
を行う等が出来ないという、激烈不可解な問題があります。
このため、デバッガ上からレジスタ変更を行うにはまずはH8クロスコンパイラが
必要になってしまう訳です。

※なーーんで current_frame がアセンブラだとNULL扱いになっちゃうんでしょうね〜w
スタックフレームが無くてもレジスタ変更出来るように変えて欲しいですな〜w
R社の陰謀?


よって現時点でGDB上でH8シミュレータを使用する
利点はありません。

ルネサスの命令シミュレータの方がはるかに使いやすく、
確実に高性能・安定した環境です。



それでもH8でシミュレータを扱いたい!と思う方は以下をご覧下さい。




===インストール手順===
1. cygwin インストール
2. binutils インストール
3. gcc インストール
※最新の gcc-4.3.2 インストールには
 gmp、mpfrを事前にインストールする必要あり
4. gdb または insight-gdb インストール




H8のシミュレータをGDBで使いたい、などと思うマニアックな方は
Linuxの使い方なんてご承知の上と思いますので、
ポイントだけ書いておきます。



1.cygwinのインストール
  http://www.cygwin.com/
  からsetup/.exe をダウンロード。
  cygwin の GUI インストーラで
    Mingw
    Devel
  をInstallに指定、ダウンロードする。
  容量はおよそ2GB、少しHDDに負荷かけます。
  ※cygwinのダウンロードの際には大学系のサーバーの方が、
    インストール後に安定するみたいです。


2.binutils インストール

ftp://gcc.gnu.org/pub/ あたりから
binutils-2.18 をダウンロード、展開
$ tar xzvf binutils-2.18.tar.gz
$ cd binutils-2.18
$ ./configure --target=h8300-hitachi-elf --prefix=/usr/local/h8
$ make install



3.gcc インストール

我が家の場合はgcc make でコケたので
高精度ライブラリとやらをダウンロード&インストール
ftp://gcc.gnu.org/pub/gcc/infrastructure/
から
gmp-4.2.1.tar.bz2
mpfr-2.3.0.tar.bz2
をダウンロード、展開>インストール

tar xjvf gmp-4.2.1.tar.bz2
cd gmp-4.2.1
./configure --prefix=/usr/local
make check                   なんかエラー出るけど無視w
make
make install                  なんかエラー出るけど無視w
make check                   動いた臭い
cd ..

tar xjvf mpfr-2.3.0.tar.bz2
cd mpfr-2.3.0
./configure --prefix=/usr/local --with-gmp=/usr/local
make
make install



gcc インストール:
$ tar xzvf gcc-4.3.2.tar.gz
$ cd gcc-4.3.2
$ ./configure --target=h8300-hitachi-elf --prefix=/usr/local/h8
--enable-languages="c,c++"

tconfig.h が無いとかでエラーが出ますが…
ここはネモ○長に従って「かまわん、強引にインストールだ!」
という事で…。

次にディレクトリ下にある全部の Makefile の以下行を次のように
変更します。
  host_subdir = .
    →
  host_subdir = host-i686-pc-cygwin
全部で10個近くあって少し面倒です。


Makefileの変更が終わったら再度makeをかけます。

$ make

libc++v3

でエラーが出ますが、これはC++用の
STL/ランタイムライブラリなのでここでは
C++機能を捨てて強引にインストールします。。。

$ make install

が、このままではH8用のエミュレーションライブラリが
インストールされないので、先ほど Makefile を修正した
各ディレクトリ内で make install を実行します。


これで何とか、C++機能を捨てた上でGCCのインストールが出来ました。






4.gdb または insight-gdb インストール


私の場合、まず最初に GDB のインストールを試みました。
gnu.org (http://ftp.gnu.org/gnu/gdb/)  から gdb6.8 をダウンロードして
解凍、make します。
$ tar xzvg gdb-6.8.tar.gz
$ /usr/src/gdb/configure --target=h8300-hitachi-hms
            --prefix=/usr/local/h8
$ make


ここでCUIのデバッガでは使いずらかったので Insight-gdb 
をインストールする事にしました。


ここ(  ftp://mirrors.kernel.org/sources.redhat.com/insight/releases/ からダウンロードし、make 解凍、コンフィギュア、make をかけます。


$ tar xjvf insight-6.8.tar.bz2
$ ./configure --target=h8300-hitachi-elf --prefix=/usr/local/h8
$ make


(私の場合はここで   make install  をかけずに make をかけた
  ディレクトリから、ビルドで出来上がったバイナリ gdb.exe  
  を呼び出しました。)







ではビルトしたH8用GDB上で実際にプログラムを
実行してみましょう。
以下はテストコードです。


boot.s:

   .h8300h             <− コレがないと動きません
   .section    .text
   .global     _Start
_Start:
   mov.l     #0x0100,er7
   mov.b     #1,r0l
   mov.b     #1,r0l
   mov.b     #1,r0l
   mov.b     #1,r0l
   JMP      @_Start
   nop




makefile:

TARGET=main.elf

PREFIX=/usr/local/h8/bin/h8300-hitachi-elf

AS=gcc.exe
LD=ld.exe
CC=gcc.exe

ASFLAGS= -c -Wa,--gstabs -mh
#CFLAGS= -c -x c -g -mh -save-temps
CFLAGS= -c -x c -g -mh

OBJS= boot.o \
   main.o

.SUFFIXES: .c .o .s .o

.c.o:
    $(PREFIX)-$(CC) $(CFLAGS) $< -o $@

.s.o:
    $(PREFIX)-$(AS) $(ASFLAGS) $< -o $@


all : $(TARGET)

$(TARGET) : $(OBJS) main.lds Makefile
    $(PREFIX)-$(LD) -mh8300helf -t main.lds $(OBJS) -o $@
            <= -mh8300helf がないとシミュレータで
            動かない。。


main.o : main.c

boot.o : boot.s


gdbs :
    /usr/local/h8/bin/h8300-hitachi-elf-gdb.exe -w -x boot.cmd

clean :
    rm -rf $(OBJS) $(TARGET)



main.lds:

OUTPUT_FORMAT("elf32-h8300")
OUTPUT_ARCH(h8300h)
ENTRY(_Start)
SECTIONS
{
   .text 0x0 :
   {
      *(.text);
   }
}





GDB を起動して実際に実行してみました。


$ /usr/local/XXX/gdb.exe -w

(以下、GDBのコンソール上で)
(gdb) file main.elf
(gdb) target sim
(gdb) load
(gdb) break *0x0
(gdb) run
(gdb) si


簡単なソースでは安定して動作しました。
複雑なソースは全く試していないため
実際に動くかは分かりません。



なお、H8ソースを記述するにあたってハマった点があります。

アセンブラソース内で .h8300h 擬似命令を宣言し、
リンク時にリンカで -mh8300helf オプションを指定しないと
GDBシミュレータがH8-300Hに切り替わってくれません。


elfファイル内のヘッダによりGDBがシミュレータのモード変更を
行うのは、最近の GDB になってからのようです。
昔はGDBのコマンドでシミュレータのモードを切り替えていたようですが、
このコマンドはGDB-6.8系では削除されたようです。







本ページの最初の部分で述べた通り、
ルネサス公式のシミュレータの方が
断然便利です。
品質、使いやすさなど。
わざわざGDBによるH8シミュレータを行うとしたら、
自作で内蔵I/Oの作り込みを行う目的ぐらいでは
ないでしょうか。

私も内蔵I/Oの試作を試みましたが、
H8-300H 自体をそう何度も使う機会が無い事もあり、途中で投げ出しています。
数台程度でしか使用しないというのであればオンチップブレークの
ある H8S 、H8Tiny、R8、SHなどの他のCPUを採用した方が良いのではと思います。

「オレはデバッグに時間を全くかけないぜ!!」
という自信のある人にしてみたら、H8-300Hの方が
部品単価的に断然有利なのでしょうが…




追記:
SHクロス環境をcygwinでやってみました。
その時の記録が以下です。
   使ってみよう、linux! GDB-H8 simulator編(おまけ、SH)






ほーむ