「12 ステップで作る 組込み OS 自作入門」の開発環境を揃えてみる
はじめに
「12 ステップで作る 組込み OS 自作入門」は、H8 マイコンの上で実際に動作する「組込み OS」を自作するための教科書とも呼べる一冊です。しかし、この本が出版されたのは 2010 年のことであり、10 年以上経った現在ではホスト環境の状況は当時と比べて大きく変わってきています。
この記事では、書籍で取り上げられているホスト環境のうちフリーなもの⸺つまり、Windows を除いた FreeBSD、Fedora、Ubuntu⸺の現在のバージョンに加え、比較的手軽に扱える Linux 環境として名高い Raspberry Pi の上に開発環境を構築する方法を説明します。
FreeBSD 編
開発環境として利用した FreeBSD は以下の通りです。
% uname -a
FreeBSD tankan.local.kusaremkn.com 14.0-RELEASE-p5 FreeBSD 14.0-RELEASE-p5 #0: Tue Feb 13 23:37:36 UTC 2024 root@amd64-builder.daemonology.net:/usr/obj/usr/src/amd64.amd64/sys/GENERIC amd64
% cat /etc/os-release
NAME=FreeBSD
VERSION="14.0-RELEASE-p5"
VERSION_ID="14.0"
ID=freebsd
ANSI_COLOR="0;31"
PRETTY_NAME="FreeBSD 14.0-RELEASE-p5"
CPE_NAME="cpe:/o:freebsd:freebsd:14.0"
HOME_URL="https://FreeBSD.org/"
BUG_REPORT_URL="https://bugs.FreeBSD.org/"
% echo "$SHELL"
/bin/tcsh
セルフ・コンパイラ
FreeBSD や NetBSD などの BSD 系のシステムは、カーネルやデバイス・ドライバのみを提供する Linux と異なり、各種のユーティリティが揃って提供されます。これには C コンパイラをはじめとするビルド・ツールも含まれています。
書籍には「セルフ・コンパイラとして gcc が標準でインストールされます」とありますが、現代の FreeBSD(FreeBSD 10.0-RELEASE 以降)では clang が代わりに採用されています。クロス・コンパイラをビルドするにあたって、gcc と clang の差は特に問題になりませんから、改めて gcc をインストールする必要はありません。
ただし、GNU 版の make である gmake はインストールされる必要があります。FreeBSD に標準でインストールされている make は BSD make(bmake)であり、gmake のために書かれた Makefile を正しく解釈・実行できません。
gmake をインストールするには、例えば次のように実行します。ここでは pkg を利用してインストールしていますが、Ports Collection からもインストールできます。
# pkg update
# pkg install gmake
書籍には bash も必要になると書かれていますが、標準でインストールされている sh で代用できますから追加でインストールする必要はありません。
クロス・コンパイラ
ここでは、できるだけシステム全体に対する操作を避け、ユーザのホーム・ディレクトリ内で完結するように構成します。具体的には、インストール先のディレクトリとして /usr や /usr/local を指定する代わりに $HOME/.local を指定します。
$HOME/.local/bin にインストールされるコマンドを実行できるようにパスを通す必要があります。
まずは $HOME/.local/bin を作成します。
% mkdir -p "$HOME/.local/bin"
ユーザがログインするタイミングで $HOME/.local/bin にパスを通すように設定します。C Shell 系を利用している場合は $HOME/.login に以下の行を追加します。
if ( -d "$HOME/.local/bin" ) set path=("$HOME/.local/bin" $path)
Bourne Shell 系を利用している場合は $HOME/.profile に以下の行を追加しあす。
if [ -d "$HOME/.local/bin" ] ; then PATH="$HOME/.local/bin:$PATH" ; fi
これらの設定を有効にするためには、$HOME/.local/bin が存在している状態でログインしなおす必要があります。
binutils
書籍では binutils-2.19.1 が利用されていますが、サポート・ページを覗いてみると binutils-2.21 でも動作実績があると紹介されています。利用するソフトウェアはなるべく古くないほうが良いですから、ここでは binutils-2.21 をインストールします。
まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。
% cd /tmp # どこか適当なディレクトリに入る
% fetch https://kozos.jp/books/makeos/binutils-2.21.tar.gz
ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。
% mkdir -p "$HOME/.local/src"
% tar xfC binutils-2.21.tar.gz "$HOME/.local/src"
% ls -l "$HOME/.local/src"
total 9
drwxr-xr-x 17 mkn mkn 54 Mar 9 01:49 binutils-2.21
展開されたディレクトリに入ります。
% cd "$HOME/.local/src/binutils-2.21"
続いて構成の設定を行います。configure の生成に用いられている autotools のバージョンによって引数の取り方が異なる場合がありますから、一応確認しておきます。
% ./configure --help
ここで重要になる項目は、ターゲットのシステム・タイプ、各国語サポート(national language support: NLS)の無効化、及びインストール先のディレクトリです。それぞれの項目は --target=TARGET、--disable-FEATURE、及び --prefix=PREFIX に対応しています。したがって、以下のように実行すると h8300-elf をターゲットにする NLS の無効化された binutils が $HOME/.local にインストールされるように構成されます(が、後できっと失敗します)。
% ./configure --target=h8300-elf --disable-nls --prefix="$HOME/.local"
上のコマンドが成功すると、最後の行は config.status: creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで gmake を実行すると、生成された Makefile に従って binutils がビルドされます。
% gmake
上のコマンドはきっと失敗します。失敗すると、最後の行は gmake: *** [Makefile:850: all] Error 2 のようになります。これは書籍で取り上げられているエラーです。configure に --disable-werror(警告をエラーとみなさない)を添えることで解決できます。再度ビルドしてみましょう。
% ./configure --target=h8300-elf --disable-nls --disable-werror --prefix="$HOME/.local"
% gmake
上の gmake が成功すると、最後の行は gmake[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。
ここまでの操作で binutils のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。書籍では、システムの管理下にある /usr/local にインストールしているため、特権を得るためにスーパ・ユーザになっていました。しかし、ここではユーザの管理下にある $HOME/.local にインストールするため、特権は必要ありません。
% gmake install
上のコマンドが成功すると、最後の行は gmake[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。
最後にビルド作業の後片付けをしておきます。
% gmake clean
この方法でインストールした binutils をアンインストールする
上で説明した方法でインストールされた binutils をアンインストールするスマートな方法は提供されていません。つまり、gmake uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。
しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。
gcc
書籍では gcc-3.4.6 が利用されています。サポート・ページを覗いてみると gcc-4.y.z を利用することもできないわけではないようですが、gcc-3.4.6 を利用したほうが無難であるとありますから、ここでは gcc-3.4.6 をインストールします。
binutils のときと同様に、まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。
% cd /tmp # どこか適当なディレクトリに入る
% fetch https://kozos.jp/books/makeos/gcc-3.4.6.tar.gz
ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。
% tar xfC gcc-3.4.6.tar.gz "$HOME/.local/src"
% ls -l "$HOME/.local/src"
total 17
drwxr-xr-x 17 mkn mkn 57 Mar 9 02:24 binutils-2.21
drwxr-xr-x 18 mkn mkn 56 Mar 6 2006 gcc-3.4.6
展開されたディレクトリに入ります。
% cd "$HOME/.local/src/gcc-3.4.6"
書籍ではここで setenv を用いて環境変数 $SHELL に bash のパスを指定しますが、代わりに env を用いて各コマンド向けに環境変数を設定することにしましょう。
環境変数を設定しながら configure を実行するコマンドは次のようになります。ここで、configure の引数はインストール先(--prefix=PREFIX)を指定していることを除いて書籍と同じです。
% env SHELL=/bin/sh ./configure --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c --prefix="$HOME/.local"
上のコマンドが成功すると、最後の行は creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで環境変数を設定しながら gmake を実行します(が、きっと失敗します)。
% env SHELL=/bin/sh gmake
上のコマンドはきっと失敗します。失敗すると、最後のほうは次のような出力になります。
./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
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
gmake[2]: *** [libgcc.mk:134: libgcc/./_muldi3.o] Error 1
gmake[2]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc'
gmake[1]: *** [Makefile:1261: stmp-multilib] Error 2
gmake[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc'
gmake: *** [Makefile:23373: all-gcc] Error 2
これはサポート・ページで取り上げられているエラーで、64 ビットなホスト環境を利用しているときに発生します。これを修正するためには gcc-3.4.6 にパッチを当てる必要があります。パッチはサポート・ページで配られていますから、これを適用します。
% fetch -o- https://kozos.jp/books/makeos/patch-gcc-3.4.6-x64-h8300.txt | patch
そして再度ビルドします。
% env SHELL=/bin/sh gmake
上のコマンドが成功すると、最後の行は gmake[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc' のようになります。
ここまでの操作で gcc のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。binutils のときと同様に、ここでは $HOME/.local にインストールするため、特権は必要ありません。
% env SHELL=/bin/sh gmake install
上のコマンドが成功すると、最後の行は gmake[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/libiberty' のようになります。
最後にビルド作業の後片づけをしておきます。
% env SHELL=/bin/sh gmake clean
この方法でインストールした gcc をアンインストールする
上で説明した方法でインストールされた gcc をアンインストールするスマートな方法は提供されていません。つまり、gmake uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。
しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。
フラッシュ ROM 書き込みツール
書籍で利用されているフラッシュ ROM 書き込みツールは Open SH/H8 writer(h8write)です。しかし、サポート・ページや CuBeatSystems のブログ記事でも取り上げられているように h8write には問題があり、フラッシュ ROM の書き込み処理が正しく行われない場合があります。
ここでは、h8write の代わりに KOZOS に特化したフラッシュ ROM 書き込みツールである kz_h8write をインストールします。kz_h8write は https://cubeatsystems.com/kz_h8write/ で配布されています。
% cd /tmp # どこか適当なディレクトリに入る
% fetch https://cubeatsystems.com/kz_h8write/resources/kz_h8write-v0.2.1.zip
% tar xf kz_h8write-v0.2.1.zip
% mv PackageFiles "$HOME/.local/src/kz_h8write-v0.2.1"
% cd "$HOME/.local/src/kz_h8write-v0.2.1"
% cd src
% make
% install kz_h8write "$HOME/.local/bin"
% make clean
この方法でインストールした kz_h8write をアンインストールする
上で説明した方法でインストールされた kz_h8write をアンインストールするには次のように実行します。
% rm "$HOME/.local/bin/kz_h8write"
ソース・ファイルが $HOME/.local/src/kz_h8write-v0.2.1 に配置されています。これを削除するには次のように実行します。
% rm -rf "$HOME/.local/src/kz_h8write-v0.2.1"
Makefile の修正
今回インストールした構成に合わせて、Makefile を修正する必要があります。
1st ステップの(ブート・ローダの)Makefile の修正箇所は以下の通りです。実際には、これに加えて 20 行目の H8WRITE_SERDEV も適切なデバイス・ファイルの名前に修正される必要があります。
diff -Naur bootload.org/Makefile bootload/Makefile
--- bootload.org/Makefile 2010-02-28 23:23:47.000000000 +0900
+++ bootload/Makefile 2024-03-09 16:51:26.938683000 +0900
@@ -1,4 +1,4 @@
-PREFIX = /usr/local
+PREFIX = $(HOME)/.local
ARCH = h8300-elf
BINDIR = $(PREFIX)/bin
ADDNAME = $(ARCH)-
@@ -13,7 +13,7 @@
RANLIB = $(BINDIR)/$(ADDNAME)ranlib
STRIP = $(BINDIR)/$(ADDNAME)strip
-H8WRITE = ../../tools/h8write/h8write
+H8WRITE = ~$(USER)/.local/bin/kz_h8write
# FreeBSD-4.x:/dev/cuaaX, FreeBSD-6.x:/dev/cuadX, FreeBSD(USB):/dev/cuaUx
# Linux:/dev/ttySx, Linux(USB):/dev/ttyUSBx, Windows:com
6th ステップの(OS の)Makefile の修正箇所は以下の通りです。
diff -Naur os.org/Makefile os/Makefile
--- os.org/Makefile 2010-02-28 23:23:47.000000000 +0900
+++ os/Makefile 2024-03-09 17:26:21.947340000 +0900
@@ -1,4 +1,4 @@
-PREFIX = /usr/local
+PREFIX = $(HOME)/.local
ARCH = h8300-elf
BINDIR = $(PREFIX)/bin
ADDNAME = $(ARCH)-
端末エミュレータ
書籍では端末エミュレータとして cu を利用しています。cu は標準でインストールされますから、これをそのまま使うことができます。
SSH を利用してホスト環境に接続している場合
SSH を利用してホスト環境に接続している場合、cu を終了するためのコマンド ~. (チルダとドット)を打鍵すると SSH の接続が切断されてしまいます。これは、ssh を終了するためのコマンドが cu を終了するためのコマンドと同じ ~. であるからです。同様の問題は 4th ステップで lsx を起動する場面でも発生します。~C を打鍵すると、それは ssh によって受け取られてしまいます。
これらの問題を回避するには、(行の先頭で)~ を打鍵する代わりに ~~ のように打鍵します。つまり、cu を終了するには ~. の代わりに ~~. のように打鍵し、lsx を起動する場面では ~C の代わりに ~~C のように打鍵します。
XMODEM ファイル転送
4th ステップでは XMODEM によるファイル転送を行います。書籍では lrzsz パッケージをインストールし、cu と lsx を利用して XMODEM ファイル転送を実現しています。FreeBSD にインストールされている cu と lsx を組み合わせて利用する上での問題は特にありませんから、これをそのまま利用して問題ありません。
lrzsz をインストールするには、例えば次のように実行します。ここでは pkg を利用してインストールしていますが、Ports Collection からもインストールできます。
# pkg install lrzsz
書籍で述べられているように、cu から lsx を起動するには ~C と打鍵します。
FreeBSD 編のおわりに
おわりです。
書籍の著者は FreeBSD ユーザですから、演習に取り組む際のホスト環境に FreeBSD を採用することは良い選択であると言えるでしょう。
Fedora 編
開発環境として利用した Fedora は以下の通りです。
$ uname -a
Linux tankan.local.kusaremkn.com 6.7.7-200.fc39.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Mar 1 16:53:59 UTC 2024 x86_64 GNU/Linux
$ cat /etc/os-release
NAME="Fedora Linux"
VERSION="39 (Workstation Edition)"
ID=fedora
VERSION_ID=39
VERSION_CODENAME=""
PLATFORM_ID="platform:f39"
PRETTY_NAME="Fedora Linux 39 (Workstation Edition)"
ANSI_COLOR="0;38;2;60;110;180"
LOGO=fedora-logo-icon
CPE_NAME="cpe:/o:fedoraproject:fedora:39"
DEFAULT_HOSTNAME="fedora"
HOME_URL="https://fedoraproject.org/"
DOCUMENTATION_URL="https://docs.fedoraproject.org/en-US/fedora/f39/system-administrators-guide/"
SUPPORT_URL="https://ask.fedoraproject.org/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_BUGZILLA_PRODUCT="Fedora"
REDHAT_BUGZILLA_PRODUCT_VERSION=39
REDHAT_SUPPORT_PRODUCT="Fedora"
REDHAT_SUPPORT_PRODUCT_VERSION=39
SUPPORT_END=2024-11-12
VARIANT="Workstation Edition"
VARIANT_ID=workstation
$ echo "$SHELL"
/bin/bash
セルフ・コンパイラ
Fedora にはセルフ・コンパイラが標準でインストールされません。そのため、追加でインストールする必要があります。書籍では binutils、gcc、make をそれぞれインストールしていますが、ここでは総合的な開発ツールが一式揃う Development Tools グループをインストールします。
$ sudo dnf update
$ sudo dnf groupinstall 'Development Tools'
クロス・コンパイラ
ここでは、できるだけシステム全体に対する操作を避け、ユーザのホーム・ディレクトリ内で完結するように構成します。具体的には、インストール先のディレクトリとして /usr や /usr/local を指定する代わりに $HOME/.local を指定します。
Fedora では、標準でインストールされる $HOME/.bashrc によって $HOME/.local/bin にパスが通されていますから、コマンドを $HOME/.local/bin にインストールすることでそのまま実行できます。
binutils
書籍では binutils-2.19.1 が利用されていますが、サポート・ページを覗いてみると binutils-2.21 でも動作実績があると紹介されています。利用するソフトウェアはなるべく古くないほうが良いですから、ここでは binutils-2.21 をインストールします。
まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。
$ cd /tmp # どこか適当なディレクトリに入る
$ wget https://kozos.jp/books/makeos/binutils-2.21.tar.gz
ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。
$ mkdir -p "$HOME/.local/src"
$ tar xfC binutils-2.21.tar.gz "$HOME/.local/src"
$ ls -l "$HOME/.local/src"
total 0
drwxr-xr-x. 1 mkn mkn 920 Mar 10 18:35 binutils-2.21
展開されたディレクトリに入ります。
$ cd "$HOME/.local/src/binutils-2.21"
続いて構成の設定を行います。configure の生成に用いられている autotools のバージョンによって引数の取り方が異なる場合がありますから、一応確認しておきます。
$ ./configure --help
ここで重要になる項目は、ターゲットのシステム・タイプ、各国語サポート(national language support: NLS)の無効化、及びインストール先のディレクトリです。それぞれの項目は --target=TARGET、--disable-FEATURE、及び --prefix=PREFIX に対応しています。したがって、以下のように実行すると h8300-elf をターゲットにする NLS の無効化された binutils が $HOME/.local にインストールされるように構成されます(が、後できっと失敗します)。
$ ./configure --target=h8300-elf --disable-nls --prefix="$HOME/.local"
上のコマンドが成功すると、最後の行は config.status: creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで make を実行すると、生成された Makefile に従って binutils がビルドされます。
$ make
上のコマンドはきっと失敗します。失敗すると、最後の行は make: *** [Makefile:850: all] Error 2 のようになります。これは書籍で取り上げられているエラーです。configure に --disable-werror(警告をエラーとみなさない)を添えることで解決できます。再度ビルドしてみましょう。
$ ./configure --target=h8300-elf --disable-nls --disable-werror --prefix="$HOME/.local"
$ make
上の make が成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。
ここまでの操作で binutils のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。書籍では、システムの管理下にある /usr/local にインストールしているため、特権得るためにスーパ・ユーザになっていました。しかし、ここではユーザの管理下にある $HOME/.local にインストールするため、特権は必要ありません。
$ make install
上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。
最後にビルド作業の後片付けをしておきます。
$ make clean
この方法でインストールした binutils をアンインストールする
上で説明した方法でインストールされた binutils をアンインストールするスマートな方法は提供されていません。つまり、make uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。
しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。
gcc
書籍では gcc-3.4.6 が利用されています。サポート・ページを覗いてみると gcc-4.y.z を利用することもできないわけではないようですが、gcc-3.4.6 を利用したほうが無難であるとありますから、ここでは gcc-3.4.6 をインストールします。
binutils のときと同様に、まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。
$ cd /tmp # どこか適当なディレクトリに入る
$ wget https://kozos.jp/books/makeos/gcc-3.4.6.tar.gz
ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。
$ tar xfC gcc-3.4.6.tar.gz "$HOME/.local/src"
$ ls -l "$HOME/.local/src"
total 0
drwxr-xr-x. 1 mkn mkn 982 Mar 10 18:42 binutils-2.21
drwxr-xr-x. 1 mkn mkn 948 Mar 6 2006 gcc-3.4.6
展開されたディレクトリに入ります。
$ cd "$HOME/.local/src/gcc-3.4.6"
Fedora には標準で bash がインストールされています。また、ユーザのログイン・シェルには bash が設定されていますから、環境変数 $SHELL の値を改めて指定する必要はありません。
configure を実行して構成を設定します。ここで、configure の引数はインストール先(--prefix=PREFIX)を指定していることを除いて書籍と同じです。
$ ./configure --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c --prefix="$HOME/.local"
上のコマンドが成功すると、最後の行は creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで make を実行します(が、きっと失敗します)。
$ make
上のコマンドはきっと失敗します。失敗すると、最後のほうは次のような出力になります。
./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
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
make[2]: *** [libgcc.mk:134: libgcc/./_muldi3.o] Error 1
make[2]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc'
make[1]: *** [Makefile:1261: stmp-multilib] Error 2
make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc'
make: *** [Makefile:23373: all-gcc] Error 2
これはサポート・ページで取り上げられているエラーで、64 ビットなホスト環境を利用しているときに発生します。これを修正するためには gcc-3.4.6 にパッチを当てる必要があります。パッチはサポート・ページで配られていますから、これを適用します。
$ wget -O- https://kozos.jp/books/makeos/patch-gcc-3.4.6-x64-h8300.txt | patch -p0
そして再度ビルドします。
$ make
上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc' のようになります。
ここまでの操作で gcc のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。binutils のときと同様に、ここでは $HOME/.local にインストールするため、特権は必要ありません。
$ make install
上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/libiberty' のようになります。
最後にビルド作業の後片づけをしておきます。
$ make clean
この方法でインストールした gcc をアンインストールする
上で説明した方法でインストールされた gcc をアンインストールするスマートな方法は提供されていません。つまり、make uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。
しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。
フラッシュ ROM 書き込みツール
書籍で利用されているフラッシュ ROM 書き込みツールは Open SH/H8 writer(h8write)です。しかし、サポート・ページや CuBeatSystems のブログ記事でも取り上げられているように h8write には問題があり、フラッシュ ROM の書き込み処理が正しく行われない場合があります。
ここでは、h8write の代わりに KOZOS に特化したフラッシュ ROM 書き込みツールである kz_h8write をインストールします。kz_h8write は https://cubeatsystems.com/kz_h8write/ で配布されています。
$ cd /tmp # どこか適当なディレクトリに入る
$ wget https://cubeatsystems.com/kz_h8write/resources/kz_h8write-v0.2.1.zip
$ unzip kz_h8write-v0.2.1.zip
$ mv PackageFiles "$HOME/.local/src/kz_h8write-v0.2.1"
$ cd "$HOME/.local/src/kz_h8write-v0.2.1"
$ cd src
$ make
$ install kz_h8write "$HOME/.local/bin"
$ make clean
この方法でインストールした kz_h8write をアンインストールする
上で説明した方法でインストールされた kz_h8write をアンインストールするには次のように実行します。
$ rm "$HOME/.local/bin/kz_h8write"
ソース・ファイルが $HOME/.local/src/kz_h8write-v0.2.1 に配置されています。これを削除するには次のように実行します。
$ rm -rf "$HOME/.local/src/kz_h8write-v0.2.1"
グループ dialout への参加
Fedora における /dev/tty* の所有グループは dialout に設定されています。また、所有グループに対して書き込みと読み込みが許可されています。ここでは、ユーザを dialout グループに参加させることで /dev/tty* に対するアクセスを許可します。これによって、フラッシュ ROM の書き込み時や H8 マイコンとの通信時に特権を得る必要がなくなります。
次のように実行すると、ユーザ mkn がグループ dialout に参加します。
$ sudo usermod -aG dialout mkn
この設定は次回のログインから適用されます。
Makefile の修正
今回インストールした構成に合わせて、Makefile を修正する必要があります。
1st ステップの(ブート・ローダの)Makefile の修正箇所は以下の通りです。実際には、これに加えて 20 行目の H8WRITE_SERDEV も適切なデバイス・ファイルの名前に修正される必要があります。
diff -Naur bootload.org/Makefile bootload/Makefile
--- bootload.org/Makefile 2010-02-28 23:23:47.000000000 +0900
+++ bootload/Makefile 2024-03-10 19:07:44.645773040 +0900
@@ -1,4 +1,4 @@
-PREFIX = /usr/local
+PREFIX = $(HOME)/.local
ARCH = h8300-elf
BINDIR = $(PREFIX)/bin
ADDNAME = $(ARCH)-
@@ -13,7 +13,7 @@
RANLIB = $(BINDIR)/$(ADDNAME)ranlib
STRIP = $(BINDIR)/$(ADDNAME)strip
-H8WRITE = ../../tools/h8write/h8write
+H8WRITE = $(HOME)/.local/bin/kz_h8write
# FreeBSD-4.x:/dev/cuaaX, FreeBSD-6.x:/dev/cuadX, FreeBSD(USB):/dev/cuaUx
# Linux:/dev/ttySx, Linux(USB):/dev/ttyUSBx, Windows:comX
6th ステップの(OS の)Makefile の修正箇所は以下の通りです。
diff -Naur os.org/Makefile os/Makefile
--- os.org/Makefile 2010-02-28 23:23:47.000000000 +0900
+++ os/Makefile 2024-03-10 19:14:51.230040070 +0900
@@ -1,4 +1,4 @@
-PREFIX = /usr/local
+PREFIX = $(HOME)/.local
ARCH = h8300-elf
BINDIR = $(PREFIX)/bin
ADDNAME = $(ARCH)-
端末エミュレータ
書籍では「minicom、kermit のいずれかを利用する」とありますが、ここでは FreeBSD と同じように cu を用いる方法を紹介します。
cu をインストールするには次のように実行します。
$ sudo dnf inatall cu
ここでインストールされる cu は FreeBSD に標準でインストールされている cu とは異なるものであることに注意してください。特に、XMODEM によるファイル転送を行うために sx を起動する場面では ~C の代わりに ~+ を打鍵する必要があります。また、その際 Local command? のプロンプトは表示されません。
SSH を利用してホスト環境に接続している場合
SSH を利用してホスト環境に接続している場合、cu を終了するためのコマンド ~. (チルダとドット)を打鍵すると SSH の接続が切断されてしまいます。これは、ssh を終了するためのコマンドが cu を終了するためのコマンドと同じ ~. であるからです。
これらの問題を回避するには、(行の頭で)~ を打鍵する代わりに ~~ のように打鍵します。つまり、cu を終了するには ~. の代わりに ~~. のように打鍵し、sx を起動する場面では ~+ の代わりに ~~+ のように打鍵します。
XMODEM ファイル転送
4th ステップでは XMODEM によるファイル転送を行います。Fedora には lrzsz が標準でインストールされていますから、追加のインストールは必要ありません。しかし、lsx の代わりに sx を指定する必要があります。
書籍では cu から lsx を起動するために ~C と打鍵していますが、Fedora にインストールされた cu から sx を起動するには ~+ と打鍵します。この際、プロンプトが表示されないことに注意してください。例えば、XMODEM でファイルを転送する際の画面は次のようになります。
$ cu -l ttyUSB0 -s 9600
Connected.
kzload (kozos boot loader) started.
kzload> load
~+sx kozos
Sending kozos, 11 blocks: Give your local XMODEM receive command now.
Bytes Sent: 1536 BPS:279
Transfer complete
XMODEM receive succeeded.
Fedora 編のおわりに
おわりです。
Ubuntu 編
開発環境として利用した Ubuntu は以下の通りです。
$ uname -a
Linux tankan.local.kusaremkn.com 6.5.0-25-generic #25~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Feb 20 16:09:15 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
$ echo "$SHELL"
/bin/bash
セルフ・コンパイラ
Ubuntu にはセルフ・コンパイラが標準でインストールされていません。そのため、追加でインストールする必要があります。書籍では binutils、gcc、make をそれぞれインストールしていますが、ここでは総合的な開発ツールが一式揃う build-essential パッケージをインストールします。
$ sudo apt update
$ sudo apt install build-essential
クロス・コンパイラ
ここでは、できるだけシステム全体に対する操作を避け、ユーザのホーム・ディレクトリ内で完結するように構成します。具体的には、インストール先のディレクトリとして /usr や /usr/local を指定する代わりに $HOME/.local を指定します。
Ubuntu では、標準でインストールされる $HOME/.profile によって、$HOME/.local/bin が存在する場合に $HOME/.local/bin にパスが通されます。この設定を有効にするためには、$HOME/.local/bin が存在している状態でログインしなおす必要があります。
$HOME/.local/bin を作成するには次のように実行します。
$ mkdir -p "$HOME/.local/bin"
binutils
書籍では binutils-2.19.1 が利用されていますが、サポート・ページを覗いてみると binutils-2.21 でも動作実績があると紹介されています。利用するソフトウェアはなるべく古くないほうが良いですから、ここでは binutils-2.21 をインストールします。
まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。
$ cd /tmp # どこか適当なディレクトリに入る
$ wget https://kozos.jp/books/makeos/binutils-2.21.tar.gz
ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。
$ mkdir -p "$HOME/.local/src"
$ tar xfC binutils-2.21.tar.gz "$HOME/.local/src"
$ ls -l "$HOME/.local/src"
total 4
drwxrwxr-x 17 mkn mkn 4096 Mar 10 22:28 binutils-2.21
展開されたディレクトリに入ります。
$ cd "$HOME/.local/src/binutils-2.21"
続いて構成の設定を行います。configure の生成に用いられている autotools のバージョンによって引数の取り方が異なる場合がありますから、一応確認しておきます。
$ ./configure --help
ここで重要になる項目は、ターゲットのシステム・タイプ、各国語サポート(national language support: NLS)の無効化、及びインストール先のディレクトリです。それぞれの項目は --target=TARGET、--disable-FEATURE、及び --prefix=PREFIX に対応しています。したがって、以下のように実行すると h8300-elf をターゲットにする NLS の無効化された binutils が $HOME/.local にインストールされるように構成されます(が、後できっと失敗します)。
$ ./configure --target=h8300-elf --disable-nls --prefix="$HOME/.local"
上のコマンドが成功すると、最後の行は config.status: creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで make を実行すると、生成された Makefile に従って binutils がビルドされます。
$ make
上のコマンドはきっと失敗します。失敗すると、最後の行は make: *** [Makefile:850: all] Error 2 のようになります。これは書籍でも取り上げられているエラーです。configure に --disable-werror(警告をエラーとみなさない)を添えることで解決できます。再度ビルドしてみましょう。
$ ./configure --target=h8300-elf --disable-nls --disable-werror --prefix="$HOME/.local"
$ make
上の make が成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。
ここまでの操作で binutils のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。書籍ではシステムの管理下にある /usr/local にインストールしているため、特権得るためにスーパ・ユーザになっていました。しかし、ここではユーザの管理下にある $HOME/.local にインストールするため、特権は必要ありません。
$ make install
上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。
最後にビルド作業の後片付けをしておきます。
$ make clean
この方法でインストールした binutils をアンインストールする
上で説明した方法でインストールされた binutils をアンインストールするスマートな方法は提供されていません。つまり、make uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。
しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。
gcc
書籍では gcc-3.4.6 が利用されています。サポート・ページを覗いてみると gcc-4.y.z を利用することもできないわけではないようですが、gcc-3.4.6 を利用したほうが無難であるとありますから、ここでは gcc-3.4.6 をインストールします。
binutils のときと同様に、まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。
$ cd /tmp # どこか適当なディレクトリに入る
$ wget https://kozos.jp/books/makeos/gcc-3.4.6.tar.gz
ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。
$ tar xfC gcc-3.4.6.tar.gz "$HOME/.local/src"
$ ls -l "$HOME/.local/src"
total 8
drwxrwxr-x 17 mkn mkn 4096 Mar 10 22:32 binutils-2.21
drwxrwxr-x 18 mkn mkn 4096 Mar 6 2006 gcc-3.4.6
展開されたディレクトリに入ります。
$ cd "$HOME/.local/src/gcc-3.4.6"
Ubuntu には標準で bash がインストールされています。また、ユーザのログイン・シェルには bash が設定されていますから、環境変数 $SHELL の値を改めて指定する必要はありません。
configure を実行して構成を設定します。ここで、configure の引数はインストール先(--prefix=PREFIX)を指定していることを除いて書籍と同じです。
$ ./configure --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c --prefix="$HOME/.local"
上のコマンドが成功すると、最後の行は creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで make を実行します(が、きっと失敗します)。
$ make
上のコマンドはきっと失敗します。失敗すると、最後のほうは次のような出力になります。
In function ‘open’,
inlined from ‘collect_execute’ at ./collect2.c:1537:22:
/usr/include/x86_64-linux-gnu/bits/fcntl2.h:50:11: 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] Error 1
make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc'
make: *** [Makefile:23373: all-gcc] Error 2
これは書籍で取り上げられているエラーで、open(2) の第 2 引数に O_CREAT がある場合には第 3 引数にファイルモードを指定する必要があるというものです。これに対応するパッチがサポート・ページで配られていますから、これを適用します。
$ wget -O- https://kozos.jp/books/makeos/patch-gcc-3.4.6-gcc4.txt | patch -p0
そして再度ビルドします(が、きっとまた失敗します)。
$ make
上のコマンドはきっと失敗します。失敗すると、最後のほうは次のような出力になります。
./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
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
make[2]: *** [libgcc.mk:134: libgcc/./_muldi3.o] Error 1
make[2]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc'
make[1]: *** [Makefile:1261: stmp-multilib] Error 2
make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc'
make: *** [Makefile:23373: all-gcc] Error 2
これはサポート・ページで取り上げられているエラーで、64 ビットなホスト環境を利用しているときに発生します。これを修正するためには gcc-3.4.6 にパッチを当てる必要があります。パッチはサポート・ページで配られていますから、これを適用します。
$ wget -O- https://kozos.jp/books/makeos/patch-gcc-3.4.6-x64-h8300.txt | patch -p0
そして再度ビルドします。
$ make
上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc' のようになります。
ここまでの操作で gcc のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。binutils のときと同様に、ここでは $HOME/.local にインストールするため、特権は必要ありません。
$ make install
上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/libiberty' のようになります。
最後にビルド作業の後片づけをしておきます。
$ make clean
この方法でインストールした gcc をアンインストールする
上で説明した方法でインストールされた gcc をアンインストールするスマートな方法は提供されていません。つまり、make uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。
しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。
フラッシュ ROM 書き込みツール
書籍で利用されているフラッシュ ROM 書き込みツールは Open SH/H8 writer(h8write)です。しかし、サポート・ページや CuBeatSystems のブログ記事でも取り上げられているように h8write には問題があり、フラッシュ ROM の書き込み処理が正しく行われない場合があります。
ここでは、h8write の代わりに KOZOS に特化したフラッシュ ROM 書き込みツールである kz_h8write をインストールします。kz_h8write は https://cubeatsystems.com/kz_h8write/ で配布されています。
$ cd /tmp # どこか適当なディレクトリに入る
$ wget https://cubeatsystems.com/kz_h8write/resources/kz_h8write-v0.2.1.zip
$ unzip kz_h8write-v0.2.1.zip
$ mv PackageFiles "$HOME/.local/src/kz_h8write-v0.2.1"
$ cd "$HOME/.local/src/kz_h8write-v0.2.1"
$ cd src
$ make
$ install kz_h8write "$HOME/.local/bin"
$ make clean
この方法でインストールした kz_h8write をアンインストールする
上で説明した方法でインストールされた kz_h8write をアンインストールするには次のように実行します。
$ rm "$HOME/.local/bin/kz_h8write"
ソース・ファイルが $HOME/.local/src/kz_h8write-v0.2.1 に配置されています。これを削除するには次のように実行します。
$ rm -rf "$HOME/.local/src/kz_h8write-v0.2.1"
グループ dialout への参加
Ubuntu における /dev/tty* の所有グループは dialout に設定されています。また、所有グループに対して書き込みと読み込みが許可されています。ここでは、ユーザを dialout グループに参加させることで /dev/tty* に対するアクセスを許可します。これによって、フラッシュ ROM の書き込み時や H8 マイコンとの通信時に特権を得る必要がなくなります。
次のように実行すると、ユーザ mkn がグループ dialout に参加します。
$ sudo usermod -aG dialout mkn
この設定は次回のログインから適用されます。
Makefile の修正
今回インストールした構成に合わせて、Makefile を修正する必要があります。
1st ステップの(ブート・ローダの)Makefile の修正箇所は以下の通りです。実際には、これに加えて 20 行目の H8WRITE_SERDEV も適切なデバイス・ファイルの名前に修正する必要があります。
diff -Naur bootload.org/Makefile bootload/Makefile
--- bootload.org/Makefile 2010-02-28 23:23:47.000000000 +0900
+++ bootload/Makefile 2024-03-10 23:48:10.226242456 +0900
@@ -1,4 +1,4 @@
-PREFIX = /usr/local
+PREFIX = $(HOME)/.local
ARCH = h8300-elf
BINDIR = $(PREFIX)/bin
ADDNAME = $(ARCH)-
@@ -13,7 +13,7 @@
RANLIB = $(BINDIR)/$(ADDNAME)ranlib
STRIP = $(BINDIR)/$(ADDNAME)strip
-H8WRITE = ../../tools/h8write/h8write
+H8WRITE = $(HOME)/.local/bin/kz_h8write
# FreeBSD-4.x:/dev/cuaaX, FreeBSD-6.x:/dev/cuadX, FreeBSD(USB):/dev/cuaUx
6th ステップの(OS の)Makefile の修正箇所は以下の通りです。
diff -Naur os.org/Makefile os/Makefile
--- os.org/Makefile 2010-02-28 23:23:47.000000000 +0900
+++ os/Makefile 2024-03-10 23:49:44.856629651 +0900
@@ -1,4 +1,4 @@
-PREFIX = /usr/local
+PREFIX = $(HOME)/.local
ARCH = h8300-elf
BINDIR = $(PREFIX)/bin
ADDNAME = $(ARCH)-
端末エミュレータ
書籍では「minicom、kermit のいずれかを利用する」とありますが、ここでは FreeBSD と同じように cu を用いる方法を紹介します。
cu をインストールするには次のように実行します。
$ sudo apt inatall cu
ここでインストールされる cu は FreeBSD に標準でインストールされている cu とは異なるものであることに注意してください。特に、XMODEM によるファイル転送を行うために sx を起動する場面では ~C の代わりに ~+ を打鍵する必要があります。また、その際 Local command? のプロンプトは表示されません。
SSH を利用してホスト環境に接続している場合
SSH を利用してホスト環境に接続している場合、cu を終了するためのコマンド ~. (チルダとドット)を打鍵すると SSH の接続が切断されてしまいます。これは、ssh を終了するためのコマンドが cu を終了するためのコマンドと同じ ~. であるからです。
これらの問題を回避するには、(行の先頭で)~ を打鍵する代わりに ~~ のように打鍵します。つまり、cu を終了するには ~. の代わりに ~~. のように打鍵し、sx を起動する場面では ~+ の代わりに ~~+ のように打鍵します。
XMODEM ファイル転送
4th ステップでは XMODEM によるファイル転送を行います。書籍では lrzsz パッケージをインストールし、cu と lsx を利用して XMODEM ファイル転送を実現しています。
lrzsz をインストールするには次のように実行します。
$ sudo apt install lrzsz
書籍では cu から lsx を起動するために ~C と打鍵していますが、Ubuntu にインストールされた cu から sx を起動するには ~+ と打鍵します。この際、プロンプトが表示されないことに注意してください。例えば、XMODEM でファイルを転送する際の画面は次のようになります。
$ cu -l ttyUSB0 -s 9600
Connected.
kzload (kozos boot loader) started.
kzload> load
~+sx kozos
Sending kozos, 11 blocks: Give your local XMODEM receive command now.
Bytes Sent: 1536 BPS:279
Transfer complete
XMODEM receive succeeded.
Ubuntu 編のおわりに
おわりです。
Raspberry Pi 編(64 bit システム)
開発環境として利用した Raspberry Pi は Raspberry Pi 4 Model B です。Raspberry Pi OS Lite をインストールしています。
$ uname -a
Linux bontan.local.kusaremkn.com 6.6.20+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.6.20-1+rpt1 (2024-03-07) aarch64 GNU/Linux
$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
$ echo "$SHELL"
/bin/bash
セルフ・コンパイラ
Raspberry Pi OS には総合的な開発ツールが一式揃う build-essential パッケージが標準でインストールされているはずです。これを確かめるには次のように実行します。示されている最後の行のように build-essential から始まる行があれば build-essential パッケージはインストールされています。
$ apt list --installed build-essential
Listing... Done
build-essential/stable,now 12.9 arm64 [installed]
インストールされていない場合はインストールします。次のように実行します。
$ sudo apt update
$ sudo apt install build-essential
クロス・コンパイラ
ここでは、できるだけシステム全体に対する操作を避け、ユーザのホーム・ディレクトリ内で完結するように構成します。具体的には、インストール先のディレクトリとして /usr や /usr/local を指定する代わりに $HOME/.local を指定します。
Raspberry Pi OS では、標準でインストールされる $HOME/.profile によって、$HOME/.local/bin が存在する場合に $HOME/.local/bin にパスが通されます。この設定を有効にするためには、$HOME/.local/bin が存在している状態でログインしなおす必要があります。
$HOME/.local/bin を作成するには次のように実行します。
$ mkdir -p "$HOME/.local/bin"
binutils
書籍では binutils-2.19.1 が利用されていますが、サポート・ページを覗いてみると binutils-2.21 でも動作実績があると紹介されています。利用するソフトウェアはなるべく古くないほうが良いですから、ここでは binutils-2.21 をインストールします。
まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。
$ cd /tmp # どこか適当なディレクトリに入る
$ wget https://kozos.jp/books/makeos/binutils-2.21.tar.gz
ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。
$ mkdir -p "$HOME/.local/src"
$ tar xfC binutils-2.21.tar.gz "$HOME/.local/src"
$ ls -l "$HOME/.local/src"
total 4
drwxr-xr-x 17 mkn mkn 4096 Mar 12 12:39 binutils-2.21
展開されたディレクトリに入ります。
$ cd "$HOME/.local/src/binutils-2.21"
続いて構成の設定を行いますが、configure の生成に用いられている autotools のバージョンによって引数の取り方が異なる場合がありますから、一応確認しておきます。
$ ./configure --help
ここで重要になる項目は、ターゲットのシステム・タイプ、各国語サポート(national language support: NLS)の無効化、及びインストール先のディレクトリです。それぞれの項目は --target=TARGET、--disable-FEATURE、及び --prefix=PREFIX に対応しています。したがって、以下のように実行すると h8300-elf をターゲットにする NLS の無効化された binutils が $HOME/.local にインストールされるように構成されます(が、きっと失敗します)。
$ ./configure --target=h8300-elf --disable-nls --prefix="$HOME/.local"
上のコマンドはきっと失敗します。失敗すると、最後の行は configure: error: cannot guess build type; you must specify one のようになります。これは現在の環境を推測できなかったことを報告していますから、手動して指定してやることで問題を解決できます。64 bit な Raspberry Pi OS のシステムは aarch64-unknown-linux-gnu と表現されます。
$ ./configure --build=aarch64-unknown-linux-gnu --target=h8300-elf --disable-nls --prefix="$HOME/.local"
上のコマンドが成功すると、最後の行は config.status: creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで make を実行すると、生成された Makefile に従って binutils がビルドされます。
$ make
上のコマンドはきっと失敗します。失敗すると、最後の行は make: *** [Makefile:850: all] Error 2 のようになります。これは書籍でも取り上げられているエラーです。configure に --disable-werror(警告をエラーとみなさない)を添えることで解決できます。再度ビルドしてみましょう。
$ ./configure --build=aarch64-unknown-linux-gnu --target=h8300-elf --disable-nls --disable-werror --prefix="$HOME/.local"
$ make
上の make が成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。
ここまでの操作で binutils のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。書籍ではシステムの管理下にある /usr/local にインストールしているため、特権得るためにスーパ・ユーザになっていました。しかし、ここではユーザの管理下にある $HOME/.local にインストールするため、特権は必要ありません。
$ make install
上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。
最後にビルド作業の後片付けをしておきます。
$ make clean
この方法でインストールした binutils をアンインストールする
上で説明した方法でインストールされた binutils をアンインストールするスマートな方法は提供されていません。つまり、make uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。
しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。
gcc
書籍では gcc-3.4.6 が利用されています。サポート・ページを覗いてみると gcc-4.y.z を利用することもできないわけではないようですが、gcc-3.4.6 を利用したほうが無難であるとありますから、ここでは gcc-3.4.6 をインストールします。
binutils のときと同様に、まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。
$ cd /tmp # どこか適当なディレクトリに入る
$ wget https://kozos.jp/books/makeos/gcc-3.4.6.tar.gz
ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。
$ tar xfC gcc-3.4.6.tar.gz "$HOME/.local/src"
$ ls -l "$HOME/.local/src"
total 8
drwxr-xr-x 17 mkn mkn 4096 Mar 12 13:15 binutils-2.21
drwxr-xr-x 18 mkn mkn 4096 Mar 6 2006 gcc-3.4.6
展開されたディレクトリに入ります。
$ cd "$HOME/.local/src/gcc-3.4.6"
Raspberry Pi OS には標準で bash がインストールされています。また、ユーザのログイン・シェルには bash が設定されていますから、環境変数 $SHELL の値を改めて指定する必要はありません。
configure を実行して構成を設定します。ここで、configure の引数はホスト環境(--host=HOST)とインストール先(--prefix=PREFIX)を指定していることを除いて書籍と同じです。
$ ./configure --host=aarch64-unknown-linux-gnu --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c --prefix="$HOME/.local"
上のコマンドが成功すると、最後の行は creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで make を実行します(が、きっと失敗します)。
$ make
上のコマンドはきっと失敗します。失敗すると、最後のほうは次のような出力になります。
./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
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
make[2]: *** [libgcc.mk:134: libgcc/./_muldi3.o] Error 1
make[2]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc'
make[1]: *** [Makefile:1261: stmp-multilib] Error 2
make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc'
make: *** [Makefile:23373: all-gcc] Error 2
これはサポート・ページで取り上げられているエラーで、64 ビットなホスト環境を利用しているときに発生します。これを修正するためには gcc-3.4.6 にパッチを当てる必要があります。パッチはサポート・ページで配られていますから、これを適用します。
$ wget -O- https://kozos.jp/books/makeos/patch-gcc-3.4.6-x64-h8300.txt | patch -p0
そして再度ビルドします。
$ make
上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc' のようになります。
ここまでの操作で gcc のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。binutils のときと同様に、ここでは $HOME/.local にインストールするため、特権は必要ありません。
$ make install
上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/libiberty' のようになります。
最後にビルド作業の後片づけをしておきます。
$ make clean
この方法でインストールした gcc をアンインストールする
上で説明した方法でインストールされた gcc をアンインストールするスマートな方法は提供されていません。つまり、make uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。
しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。
フラッシュ ROM 書き込みツール
書籍で利用されているフラッシュ ROM 書き込みツールは Open SH/H8 writer(h8write)です。しかし、サポート・ページや CuBeatSystems のブログ記事でも取り上げられているように h8write には問題があり、フラッシュ ROM の書き込み処理が正しく行われない場合があります。
ここでは、h8write の代わりに KOZOS に特化したフラッシュ ROM 書き込みツールである kz_h8write をインストールします。kz_h8write は https://cubeatsystems.com/kz_h8write/ で配布されています。
$ cd /tmp # どこか適当なディレクトリに入る
$ wget https://cubeatsystems.com/kz_h8write/resources/kz_h8write-v0.2.1.zip
$ unzip kz_h8write-v0.2.1.zip
$ mv PackageFiles "$HOME/.local/src/kz_h8write-v0.2.1"
$ cd "$HOME/.local/src/kz_h8write-v0.2.1"
$ cd src
$ make
$ install kz_h8write "$HOME/.local/bin"
$ make clean
この方法でインストールした kz_h8write をアンインストールする
上で説明した方法でインストールされた kz_h8write をアンインストールするには次のように実行します。
$ rm "$HOME/.local/bin/kz_h8write"
ソース・ファイルが $HOME/.local/src/kz_h8write-v0.2.1 に配置されています。これを削除するには次のように実行します。
$ rm -rf "$HOME/.local/src/kz_h8write-v0.2.1"
グループ dialout への参加
Raspberry Pi OS における /dev/tty* の所有グループは dialout に設定されています。また、所有グループに対して書き込みと読み込みが許可されています。ここでは、ユーザを dialout グループに参加させることで /dev/tty* に対するアクセスを許可します。これによって、フラッシュ ROM の書き込み時や H8 マイコンとの通信時に特権を得る必要がなくなります。
次のように実行すると、ユーザ mkn がグループ dialout に参加します。
$ sudo usermod -aG dialout mkn
この設定は次回のログインから適用されます。
Makefile の修正
今回インストールした構成に合わせて、Makefile を修正する必要があります。
1st ステップの(ブート・ローダの)Makefile の修正箇所は以下の通りです。実際には、これに加えて 20 行目の H8WRITE_SERDEV も適切なデバイス・ファイルの名前に修正される必要があります。
diff -Naur bootload.org/Makefile bootload/Makefile
--- bootload.org/Makefile 2010-02-28 14:23:47.000000000 +0000
+++ bootload/Makefile 2024-03-12 14:37:04.388656811 +0000
@@ -1,4 +1,4 @@
-PREFIX = /usr/local
+PREFIX = $(HOME)/.local
ARCH = h8300-elf
BINDIR = $(PREFIX)/bin
ADDNAME = $(ARCH)-
@@ -13,7 +13,7 @@
RANLIB = $(BINDIR)/$(ADDNAME)ranlib
STRIP = $(BINDIR)/$(ADDNAME)strip
-H8WRITE = ../../tools/h8write/h8write
+H8WRITE = $(HOME)/.local/bin/kz_h8write
# FreeBSD-4.x:/dev/cuaaX, FreeBSD-6.x:/dev/cuadX, FreeBSD(USB):/dev/cuaUx
# Linux:/dev/ttySx, Linux(USB):/dev/ttyUSBx, Windows:comX
6th ステップの(OS の)Makefile の修正箇所は以下の通りです。
diff -Naur os.org/Makefile os/Makefile
--- os.org/Makefile 2010-02-28 14:23:47.000000000 +0000
+++ os/Makefile 2024-03-12 14:39:34.094981324 +0000
@@ -1,4 +1,4 @@
-PREFIX = /usr/local
+PREFIX = $(HOME)/.local
ARCH = h8300-elf
BINDIR = $(PREFIX)/bin
ADDNAME = $(ARCH)-
端末エミュレータ
ここでは FreeBSD と同じように cu を用いる方法を紹介します。
cu をインストールするには次のように実行します。
$ sudo apt inatall cu
ここでインストールされる cu は FreeBSD に標準でインストールされている cu とは異なるものであることに注意してください。特に、XMODEM によるファイル転送を行うために sx を起動する場面では ~C の代わりに ~+ を打鍵する必要があります。また、その際 Local command? のプロンプトは表示されません。
SSH を利用してホスト環境に接続している場合
SSH を利用してホスト環境に接続している場合、cu を終了するためのコマンド ~. (チルダとドット)を打鍵すると SSH の接続が切断されてしまいます。これは、ssh を終了するためのコマンドが cu を終了するためのコマンドと同じ ~. であるからです。
これらの問題を回避するには、(行の先頭で)~ を打鍵する代わりに ~~ のように打鍵します。つまり、cu を終了するには ~. の代わりに ~~. のように打鍵し、sx を起動する場面では ~+ の代わりに ~~+ のように打鍵します。
XMODEM ファイル転送
4th ステップでは XMODEM によるファイル転送を行います。書籍では lrzsz パッケージをインストールし、cu と lsx を利用して XMODEM ファイル転送を実現しています。
lrzsz をインストールするには次のように実行します。
$ sudo apt install lrzsz
書籍では cu から lsx を起動するために ~C と打鍵していますが、Raspberry Pi OS にインストールされた cu から sx を起動するには ~+ と打鍵します。この際、プロンプトが表示されないことに注意してください。例えば、XMODEM でファイルを転送する際の画面は次のようになります。
$ cu -l ttyUSB0 -s 9600
Connected.
kzload (kozos boot loader) started.
kzload> load
~+sx kozos
Sending kozos, 11 blocks: Give your local XMODEM receive command now.
Bytes Sent: 1536 BPS:279
Transfer complete
XMODEM receive succeeded.
Raspberry Pi 編(64 bit システム)のおわりに
おわりです。
Raspberry Pi の上でコンパイラをコンパイルすると時間が掛かりますね。
Raspberry Pi 編(32 bit システム)
開発環境として利用した Raspberry Pi は Raspberry Pi 4 Model B です。Raspberry Pi OS Lite をインストールしています。
$ uname -a
Linux bontan.local.kusaremkn.com 6.1.0-rpi7-rpi-v8 #1 SMP PREEMPT Debian 1:6.1.63-1+rpt1 (2023-11-24) aarch64 GNU/Linux
$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 12 (bookworm)"
NAME="Raspbian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
$ echo "$SHELL"
/bin/bash
セルフ・コンパイラ
Raspberry Pi OS には総合的な開発ツールが一式揃う build-essential パッケージが標準でインストールされているはずです。これを確かめるには、次のように実行します。示されている最後の行のように build-essential から始まる行があれば build-essential パッケージはインストールされています。
$ apt list --installed build-essential
Listing... Done
build-essential/stable,now 12.9 armhf [installed]
インストールされていない場合はインストールします。次のように実行します。
$ sudo apt update
$ sudo apt install build-essential
クロス・コンパイラ
できるだけシステム全体に対する操作を避け、ユーザのホーム・ディレクトリ内で完結するように構成します。具体的には、インストール先のディレクトリとして /usr や /usr/local を指定する代わりに $HOME/.local を指定します。
Raspberry Pi OS では、標準でインストールされる $HOME/.profile によって、$HOME/.local/bin が存在する場合に $HOME/.local/bin にパスが通されます。この設定を有効にするためには、$HOME/.local/bin が存在している状態でログインしなおす必要があります。
$HOME/.local/bin を作成するには次のように実行します。
$ mkdir -p "$HOME/.local/bin"
binutils
書籍では binutils-2.19.1 が利用されていますが、サポート・ページを覗いてみると binutils-2.21 でも動作実績があると紹介されています。利用するソフトウェアはなるべく古くないほうが良いですから、ここでは binutils-2.21 をインストールします。
まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。
$ cd /tmp # どこか適当なディレクトリに入る
$ wget https://kozos.jp/books/makeos/binutils-2.21.tar.gz
ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。
$ mkdir -p "$HOME/.local/src"
$ tar xfC binutils-2.21.tar.gz "$HOME/.local/src"
$ ls -l "$HOME/.local/src"
total 4
drwxr-xr-x 17 mkn mkn 4096 Mar 13 10:17 binutils-2.21
展開されたディレクトリに入ります。
$ cd "$HOME/.local/src/binutils-2.21"
続いて構成の設定を行いますが、configure の生成に用いられている autotools のバージョンによって引数の取り方が異なる場合がありますから、一応確認しておきます。
$ ./configure --help
ここで重要になる項目は、ターゲットのシステム・タイプ、各国語サポート(national language support: NLS)の無効化、及びインストール先のディレクトリです。それぞれの項目は --target=TARGET、--disable-FEATURE、及び --prefix=PREFIX に対応しています。よって、以下のように実行すると h8300-elf をターゲットにする NLS の無効化された binutils が $HOME/.local にインストールされるように構成されます(が、きっと失敗します)。
$ ./configure --target=h8300-elf --disable-nls --prefix="$HOME/.local"
上のコマンドはきっと失敗します。失敗すると、最後の行は configure: error: cannot guess build type; you must specify one のようになります。これは現在の環境を推測できなかったことを報告していますから、手動して指定してやることで問題を解決できます。32 bit な Raspberry Pi OS のシステムは armhf-unknown-linux-gnu と表現されます。
$ ./configure --build=armhf-unknown-linux-gnu --target=h8300-elf --disable-nls --prefix="$HOME/.local"
上のコマンドが成功すると、最後の行は config.status: creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで make を実行すると、生成された Makefile に従って binutils がビルドされます。
$ make
上のコマンドはきっと失敗します。失敗すると、最後の行は make: *** [Makefile:850: all] Error 2 のようになります。これは書籍でも取り上げられているエラーです。configure に --disable-werror(警告をエラーとみなさない)を添えることで解決できます。再度ビルドしてみましょう。
$ ./configure --build=armhf-unknown-linux-gnu --target=h8300-elf --disable-nls --disable-werror --prefix="$HOME/.local"
$ make
上の make が成功すると、最後の行は gmake[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。
ここまでの操作で binutils のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。書籍ではシステムの管理下にある /usr/local にインストールしているため、特権得るためにスーパ・ユーザになっていました。しかし、ここではユーザの管理下にある $HOME/.local にインストールするため、特権は必要ありません。
$ make install
上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。
最後にビルド作業の後片付けをしておきます。
$ make clean
この方法でインストールした binutils をアンインストールする
上で説明した方法でインストールされた binutils をアンインストールするスマートな方法は提供されていません。つまり、make uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。
しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。
gcc
書籍では gcc-3.4.6 が利用されています。サポート・ページを覗いてみると gcc-4.y.z を利用することもできないわけではないようですが、gcc-3.4.6 を利用したほうが無難であるとありますから、ここでは gcc-3.4.6 をインストールします。
binutils のときと同様に、まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。
$ cd /tmp # どこか適当なディレクトリに入る
$ wget https://kozos.jp/books/makeos/gcc-3.4.6.tar.gz
ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。
$ tar xfC gcc-3.4.6.tar.gz "$HOME/.local/src"
$ ls -l "$HOME/.local/src"
total 8
drwxr-xr-x 17 mkn mkn 4096 Mar 13 10:27 binutils-2.21
drwxr-xr-x 18 mkn mkn 4096 Mar 6 2006 gcc-3.4.6
展開されたディレクトリに入ります。
$ cd "$HOME/.local/src/gcc-3.4.6"
Raspberry Pi OS には標準で bash がインストールされています。また、ユーザのログイン・シェルには bash が設定されていますから、環境変数 $SHELL の値を改めて指定する必要はありません。
configure を実行して構成を設定します。ここで、configure の引数はホスト環境(--host=HOST)とインストール先(--prefix=PREFIX)を指定していることを除いて書籍と同じです。
$ ./configure --host=armhf-unknown-linux-gnu --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c --prefix="$HOME/.local"
上のコマンドが成功すると、最後の行は creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで make を実行します。
$ make
上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc' のようになります。
ここまでの操作で gcc のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。binutils のときと同様に、ここでは $HOME/.local にインストールするため、特権は必要ありません。
$ make install
上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/libiberty' のようになります。
最後にビルド作業の後片づけをしておきます。
$ make clean
この方法でインストールした gcc をアンインストールする
上で説明した方法でインストールされた gcc をアンインストールするスマートな方法は提供されていません。つまり、make uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。
しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。
フラッシュ ROM 書き込みツール
書籍で利用されているフラッシュ ROM 書き込みツールは Open SH/H8 writer(h8write)です。しかし、サポート・ページや CuBeatSystems のブログ記事でも取り上げられているように h8write には問題があり、フラッシュ ROM の書き込み処理が正しく行われない場合があります。
ここでは、h8write の代わりに KOZOS に特化したフラッシュ ROM 書き込みツールである kz_h8write をインストールします。kz_h8write は https://cubeatsystems.com/kz_h8write/ で配布されています。
$ cd /tmp # どこか適当なディレクトリに入る
$ wget https://cubeatsystems.com/kz_h8write/resources/kz_h8write-v0.2.1.zip
$ unzip kz_h8write-v0.2.1.zip
$ mv PackageFiles "$HOME/.local/src/kz_h8write-v0.2.1"
$ cd "$HOME/.local/src/kz_h8write-v0.2.1"
$ cd src
$ make
$ install kz_h8write "$HOME/.local/bin"
$ make clean
この方法でインストールした kz_h8write をアンインストールする
上で説明した方法でインストールされた kz_h8write をアンインストールするには次のように実行します。
$ rm "$HOME/.local/bin/kz_h8write"
ソース・ファイルが $HOME/.local/src/kz_h8write-v0.2.1 に配置されています。これを削除するには次のように実行します。
$ rm -rf "$HOME/.local/src/kz_h8write-v0.2.1"
グループ dialout への参加
Raspberry Pi OS における /dev/tty* の所有グループは dialout に設定されています。また、所有グループに対して書き込みと読み込みが許可されています。ここでは、ユーザを dialout グループに参加させることで /dev/tty* に対するアクセスを許可します。これによって、フラッシュ ROM の書き込み時や H8 マイコンとの通信時に特権を得る必要がなくなります。
次のように実行すると、ユーザ mkn がグループ dialout に参加します。
$ sudo usermod -aG dialout mkn
この設定は次回のログインから適用されます。
Makefile の修正
今回インストールした構成に合わせて、Makefile を修正する必要があります。
1st ステップの(ブート・ローダの)Makefile の修正箇所は以下の通りです。実際には、これに加えて 20 行目の H8WRITE_SERDEV も適切なデバイス・ファイルの名前に修正される必要があります。
diff -Naur bootload.org/Makefile bootload/Makefile
--- bootload.org/Makefile 2010-02-28 14:23:47.000000000 +0000
+++ bootload/Makefile 2024-03-13 10:49:49.432805405 +0000
@@ -1,4 +1,4 @@
-PREFIX = /usr/local
+PREFIX = $(HOME)/.local
ARCH = h8300-elf
BINDIR = $(PREFIX)/bin
ADDNAME = $(ARCH)-
@@ -13,7 +13,7 @@
RANLIB = $(BINDIR)/$(ADDNAME)ranlib
STRIP = $(BINDIR)/$(ADDNAME)strip
-H8WRITE = ../../tools/h8write/h8write
+H8WRITE = $(HOME)/.local/bin/kz_h8write
# FreeBSD-4.x:/dev/cuaaX, FreeBSD-6.x:/dev/cuadX, FreeBSD(USB):/dev/cuaUx
# Linux:/dev/ttySx, Linux(USB):/dev/ttyUSBx, Windows:comX
6th ステップの(OS の)Makefile の修正箇所は以下の通りです。
diff -Naur os.org/Makefile os/Makefile
--- os.org/Makefile 2010-02-28 14:23:47.000000000 +0000
+++ os/Makefile 2024-03-13 10:54:16.609975593 +0000
@@ -1,4 +1,4 @@
-PREFIX = /usr/local
+PREFIX = $(HOME)/.local
ARCH = h8300-elf
BINDIR = $(PREFIX)/bin
ADDNAME = $(ARCH)-
端末エミュレータ
ここでは FreeBSD と同じように cu を用いる方法を紹介します。
cu をインストールするには次のように実行します。
$ sudo apt inatall cu
ここでインストールされる cu は FreeBSD に標準でインストールされている cu とは異なるものであることに注意してください。特に、XMODEM によるファイル転送を行うために sx を起動する場面では ~C の代わりに ~+ を打鍵する必要があります。また、その際 Local command? のプロンプトは表示されません。
SSH を利用してホスト環境に接続している場合
SSH を利用してホスト環境に接続している場合、cu を終了するためのコマンド ~. (チルダとドット)を打鍵すると SSH の接続が切断されてしまいます。ssh を終了するためのコマンドが cu を終了するためのコマンドと同じ ~. であるからです。
これらの問題を回避するには、(行の先頭で)~ を打鍵する代わりに ~~ のように打鍵します。つまり、cu を終了するには ~. の代わりに ~~. のように打鍵し、sx を起動する場面では ~+ の代わりに ~~+ のように打鍵します。
XMODEM ファイル転送
4th ステップでは XMODEM によるファイル転送を行います。書籍では lrzsz パッケージをインストールし、cu と lsx を利用して XMODEM ファイル転送を実現しています。
lrzsz をインストールするには次のように実行します。
$ sudo apt install lrzsz
書籍では cu から lsx を起動するために ~C と打鍵していますが、Raspberry Pi OS にインストールされた cu から sx を起動するには ~+ と打鍵します。この際、プロンプトが表示されないことに注意してください。
Raspberry Pi 編(32 bit システム)のおわりに
おわりです。
おわりに
おわりです(おわりです)。
参考
-
坂井弘亮. 12 ステップで作る 組込み OS 自作入門. 株式会社カットシステム, 2010-06-10, 544p., ISBN 978-4-87783-239-1.
取り上げている書籍です。とても良い本ですから、図書館や書店に立ち寄って是非一度手に取ってみてください。
-
坂井弘亮. 12ステップで作る 組込みOS自作入門. 12ステップで作る 組込みOS自作入門. (accessed 2024-03-10).
サポート・ページです。演習に取り組む中で問題に直面した場合、まずはこのページを読むことをおすすめします。
-
shinta. H8/3069F writer for KOZOS - kz_h8write 「h8writeリベンジ解決編」. CuBeatSystems. 2011-05-26. (accessed 2024-03-10).
kz_h8write の作者のブログ記事です。オリジナルの h8write が持つ H8/3069F の ROM 書き込みシーケンスの問題について詳しく説明されています。
Discussion