『12ステップで作る組み込みOS自作入門』という本を読みながらH8/3069Fマイコンボード上で動くOSを少しずつ書いております。もともとUbuntu18.04LTS上で開発していたのですが、PCを新調してUbuntu20.04LTSを入れたので、環境構築し直したときのメモを残しておきます。
ステップ0. セルフコンパイラとmakeのインストール
自身の環境にコンパイラとmakeが入っていない場合、インストールしておきましょう。
$ sudo apt update $ sudo apt install gcc make
なお、ここで入れたコンパイラは(64bit)Linux上で動き、(64bit)Linux用のプログラムを作るためのコンパイラで、セルフコンパイラと呼ばれます。続くステップではセルフコンパイラを用いることで、(64bit)Linux上で動き、H8マイコン用のプログラムを作るためのクロスコンパイラをビルドしていきます。
ステップ1. binutilsのビルド
binutilsのアーカイブから圧縮ファイルをダウンロードします。『12ステップで作る組み込みOS自作入門』(以下、参考書と呼ぶ)ではbinutils-2.19.1.tar.gzを利用していますが、アーカイブを見る限りドンピシャのものがありません。最新版を入れても良いのですが、間をとってbinutils-2.27.tar.gzをダウンロードしました。
ダウンロードしたアーカイブを解凍しましょう。
$ tar xzvf binutils-2.27.tar.gz
後は参考書と同様にH8マイコン用にビルドします。
$ cd binutils-2.27 $ ./configure --target=h8300-elf --disable-nls $ make $ sudo make install
ステップ2. コンパイラのビルド
ブラウザからgccのアーカイブをダウンロードします。参考書と同様にgcc-3.4.6.tar.gzをダウンロードしました。
ダウンロードしたアーカイブを解凍しましょう。
$ tar xzvf gcc-3.4.6.tar.gz
参考書と同様にH8マイコン用にビルドします。
$ cd gcc-3.4.6.tar.gz $ ./configure --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c $ make $ sudo make install
クロスコンパイラのビルドですが、高確率でいくつかエラーが出ます。
collect2.oのエラー
次のようなエラーが生じました。
In function ‘open’, inlined from ‘collect_execute’ at ./collect2.c:1537:22: /usr/include/x86_64-linux-gnu/bits/fcntl2.h:50:4: error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT or O_TMPFILE in second argument needs 3 arguments 50 | __open_missing_mode (); | ^~~~~~~~~~~~~~~~~~~~~~ make[1]: *** [Makefile:1388: collect2.o] エラー 1
参考書にも記載がありますが、gcc-3.4.6/gcc/collect2.cの1537行目を次のように書き換えると解決します。
/* 1537行目 */ - redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT); + redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT, 0755);
recog.cのエラー
参考書には記載がない次のようなエラーが出ました。
./libgcc2.c: In function `__muldi3': ./libgcc2.c:537: error: unrecognizable insn: (insn 244 243 245 0 ./libgcc2.c:528 (set:HI (reg:HI 3 r3) (const_int 4294967222 [0xffffffb6])) -1 (nil) (nil)) ./libgcc2.c:537: internal compiler error: in extract_insn, at recog.c:2083
こちらの方法に従って、gcc-3.4.6/gcc/config/h8300/h8300.c 内のいくつかの行を書き直すとエラーが解決しました。本当に助かりました。
/* 55行目 */ - static void h8300_emit_stack_adjustment (int, unsigned int); + static void h8300_emit_stack_adjustment (int, HOST_WIDE_INT); /* 56行目 */ - static int round_frame_size (int); + static HOST_WIDE_INT round_frame_size (HOST_WIDE_INT); /* 371行目 */ - h8300_emit_stack_adjustment (int sign, unsigned int size) +h8300_emit_stack_adjustment (int sign, HOST_WIDE_INT size) /* 400-401行目 */ - static int - round_frame_size (int size) + static HOST_WIDE_INT + round_frame_size (HOST_WIDE_INT size)
core dump エラー
binutilsのバージョンが古いと、コンパイルが通ってもリンク時に以下のようなcore dumpエラーが生じることがあります。
[libgcc.mk:1828: libgcc.a] 中止 (コアダンプしました)
このエラーはbinutilsのバージョンをある程度最新のものにすると解決できます。binutils-2.14ではこのエラーが発生しましたが、binutils-2.27では発生しませんでした。
ステップ3. h8writeのビルド
Open SH/H8 writer のページからh8write.cをインストールして手元でビルドしましょう。
$ gcc h8write.c -o h8write -Wall
実行ファイルも置いてありますが、ソースファイルを手元でビルドした方が良さげです。ビルド後の実行ファイルは好きなところに移動しときましょう。私はクロスコンパイラにならって/usr/local/h8write/binというディレクトリを作りその下に移動させました。
ステップ4. minicomのインストール
最後にシリアルコンソールをLinuxにインストールしましょう。いくつか選択肢がありますが、私はminicomを使っています。
$ sudo apt install minicom
デフォルトのシリアル通信の設定ではH8マイコンとうまく通信できないので、参考書の通りにボーレートやパリティの設定をすれば設定完了です。
その他
- apt install したものは /usr/bin以下に配置される
- apt show gcc とすると、apt install を使ってインストールしたgcc(/usr/bin/gcc)の情報が表示される
- make install したものはデフォルトでは/usr/local以下に配置される