とある件でAVRからMMCカードに書き込みしたくなったので、AmazonでマイクロSDカード用のモジュールを買ったのですが、動作確認のためにH8を使おうと思い立ったのがドツボでした。gccのビルドでハマり、gdbのビルドでハマり、まともに動くようになるまでかなり時間を使いました。無駄にした時間は帰ってきませんが、記事にして消化することにしました。
その昔(15年ぐらい前?)AKI-H8/3069FのLAN付きのものを買って持ってまして、その当時はGCC4.2とか、gdb6.8とかビルドして使ってました。H8300はまだメジャーな石で雑誌などにも色々取り上げられて需要があったようです。私の仕事でもH8Sを使ってましたし。portsにh8用のgccもあったような。野良ビルドする人は当時からあんまりいないですね。
時は過ぎ去り2024年、AVRやARM、RISCVが花盛りな今、すでにディスコンなH8ですよ。野良ビルドしたのは以下のものです。ちなみにFreeBSD-14.0R上です。
- binutils-2.42
- gcc-13.2.0
- gdb-14.2
- newlib.4.4.0-20231231
gccのビルドに必要なgmp, mpfr, mpc, texinfo, gnu makeはpkgで入れます。また、新し目のNative gccも入れといてください。私はgcc12を使いました。
すでに複数gccが入っている場合は名前でソートしたときに一番前に来るものを使ったほうが良いです。ビルドするgdbがlibstdc++.so.6を要求するのですが、それぞれのgccが自分のlibstdc++.so.6を入れてくれているので、使ったgccとリンクされるlibstdc++.so.6の組み合わせが壊れて動かない、という現象が発生します(ハマりポイント)。ld.soが共有ライブラリを探す順番に影響されるのでldconfig -r で一覧を見て、一番最初にlibstdc++.so.6を提供しているgccを使う、というのが正しいです。
binutilsのconfigureです。お作法として展開したフォルダ内にビルド用のフォルダを掘ってそこでconfigureを動かします。インストール先はhomeのdev/h8300になります。
../configure --disable-nls \
--target=h8300-elf --prefix=$HOME/dev/h8300
次にgccのconfigure。対象の言語はCのみです。CCとCXXは自身の環境のgccを入れてください。
../configure \
--target=h8300-elf --prefix=$HOME/dev/h8300 --with-newlib \
--disable-nls --enable-languages=c \
--with-gmp=/usr/local --with-mpfr=/usr/local --with-mpc=/usr/local \
--disable-gcov --disable-bootstrap --disable-libsanitizer --disable-libssp \
--disable-libgomp --disable-libvtv \
CC=gcc12 CXX=g++12
次にnewlibのconfigure。ここ( https://blueeyes.sakura.ne.jp/2019/05/22/2363/ )を参考にしました。非常にためになりました。
../configure \
--target=h8300-elf --prefix=$HOME/dev/h8300 \
--disable-nls --disable-werror --disable-bootstrap \
--disable-newlib-supplied-syscalls \
--enable-newlib-reent-small --disable-newlib-wide-orient \
--enable-newlib-nano-malloc --enable-lite-exit \
--enable-newlib-global-atexit --enable-target-optspace
次にgdbの configure。MONIX用にgdb/h8300-tdep.c内にある h8300_break_insn[] をSleep命令からTRAPA #3 { 0x57, 0x30 } に書き換えてます。
../configure --disable-nls \
--target=h8300-elf --prefix=$HOME/dev/h8300 \
--disable-werror --disable-bootstrap \
CC=gcc12 CXX=g++12
無事にgmake; gmake installが完了すると自分のhomeの下、dev/h8300/bin/h8300-elf-gccが動くと思います。あ、gdbのsimはうまく動きませんでした。
動かしてる環境ですが、MONIX ( http://kuwa.s256.xrea.com/monix/index.html )のgdb-stub(udp)でデバッグ出来てます。break張って止めるだけですが。MMCカードからの読み込み、書き込みにも成功しました。AKI-H8/3069F LAN付きは16MbitのDRAMが乗ってて、書き込み回数を気にせず Try & Errorが出来るのでお試しには重宝します。
ただ、当初の目的であるところのAVRでSDカードの読み書きが、まだできてない…