投稿者「ハセ」のアーカイブ

2024年のGCCでH8300-elfの開発環境を整える on FreeBSD

とある件で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カードの読み書きが、まだできてない

scppを使えるようにするパッチ

以前からちょっとずつ直していたのがそこそこまで来たので公開。
scppはselective C preprocessorのことで、C言語の指定したマクロだけを展開してくれます。
scpp-0.1.tgzでググると出てきます。(たとえばこことか)
素のままのscppは色々と使えないので自分が使う機能を修正。
修正内容はパッチの頭に書いてあります。
古いツールの割にはだれもパッチを公開していないところを見ると使っている人がほとんどいないのかも。

パッチはここ

kemacs nide-patch 第13版

nide-patchの新しいのが2009-01-05に出てました。
そのままでFreeBSD7.2-stableのi386とamd64の両方でコンパイルが通って動作します。
libiconvを使って制限つきながらもUTF-8なファイルが編集できるようになっています。
パッチがバージョンアップしているのを知らずに第8版を使い続けて
いたのでいろいろ不都合が出てましたがすべて解消しました。

kemacsはまだまだ現役です。
続きを読む

TrueIDEケーブル

CFをIDEに接続できるとのことで変換アダプタを探してたんですが入手できなかったので
ネットで調べてTrueIDEケーブルを作りました。

参考にしたのはここ(Si-Linux)ここ
CFの39pinの扱いにちょっと悩みましたがIDE側はopen、CF側をGNDに落として無事にMasterとして認識されました。
久しぶりの半田ごてだったのでかなりてこずり、出来上がりはいまいち。

これにFreeNASを入れて動かしてみました。このマシン、古くてCDからの起動ができないのでFreeNASのISOイメージからディスクイメージを取り出してCFに直接書き込み、起動してみたら動いたのでそのまま使ってます。でも、まあ、遅いです(^^;ネットワークのチップはそれなりの性能が出るSIS900なのですが14Mbpsしか出ません。