はじめに
本記事では「12ステップで作る 組込みOS自作入門」の開発環境をDockerコンテナを利用して構築するための、一通りの手順を紹介します。
「組込みOS自作入門」開発環境の構築については複数の記事で既に解説されていますが、本記事は環境構築の1つの事例として参考にしていただけると幸いです。
なお、ビルド環境を構築するための成果物 (Dockerfile等) はGithubに公開してあります。
また、本記事の手順はUbuntu 22.04をホストOSに用いてテストしています。
事前準備
私の場合は、こちらの記事を参考にして以下のハードウェアを揃えました。
H8/3069Fネット対応マイコンLANボード(完成品)
超小型スイッチングACアダプター5V1A AD-D50P100
FT232 USBシリアル変換ケーブル VE488
また、ホストOSではdocker, docker-composeを使用できる状態にします。
開発環境構築
ビルド環境の構築
Githubからリポジトリをcloneし、コンテナをビルド/実行します。
git clone https://github.com/satumaimo10/buildenv_kozos
cd buildenv_kozos
docker-compose up -d
docker exec -it (コンテナ名) bash
コンテナ内でプログラムを正しくビルドできるか確認するために、公式サイトからソースコードを取得します。
cd workspace/
curl -O http://kozos.jp/kozos/osbook/osbook_03.zip
unzip osbook_03.zip
実際にビルドしてみます。
cd ./osbook_03/01/bootload/
make
下記のように出力されれば成功です。
/usr/local/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD vector.c
/usr/local/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD startup.s
/usr/local/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD main.c
/usr/local/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD lib.c
/usr/local/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD serial.c
/usr/local/bin/h8300-elf-gcc vector.o startup.o main.o lib.o serial.o -o kzload -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD -static -T ld.scr -L.
cp kzload kzload.elf
/usr/local/bin/h8300-elf-strip kzload
ついでに、kzload
を「モトローラSレコード」というフォーマットへ変換しておきます。
make image
上記コマンドでkzload.mot
が生成され、バイナリをマイコンへ書き込めるようになります。
フラッシュライタのビルド
バイナリをマイコンへ書き込むために、フラッシュライタをホストOSでビルドします。
私の場合は、フラッシュライタとしてkz_h8write Version 0.2.1を使用しました。
操作をホストOSに切り替え、kz-h8writeをダウンロードしてビルドします。
// コンテナから退出
exit
// kz-h8writeのダウンロード/ビルド
cd ./workspace/
(kz_h8write-v0.2.1.zipを取得)
unzip kz_h8write-v0.2.1.zip
cd ./PackageFiles/src/
make
以降は、kz_h8write開発者のブログと「組込みOS自作入門」の内容を参考にしながら、kz_h8writeが正しく使用できるか確認します。
バイナリの書き込み
マイコンをフラッシュROM書き込みモードにするために、ディップ・スイッチ(マイコン右上の青いスイッチ)を以下の状態にします。
そして、マイコンを電源に接続し、USBシリアルアダプタをマイコンとPCに接続します。
その後、ホストOSでls /dev/
を実行すると、ttyUSB0
というデバイスファイルが表示されます。(環境によってデバイスファイル名は異なる可能性があります。)
このデバイスファイルを引数にして、kzload.mod
をkz_h8writeでマイコンに書き込みます。
// workspaceディレクトリへkz_h8write実行ファイルをコピー
cp kz_h8write ../../
cd ../../
// マイコンにkzload.modを書き込む
sudo ./kz_h8write -f 20 osbook_03/01/bootload/kzload.mot /dev/ttyUSB0
マイコンの動作確認
マイコンを実行するために、ディップ・スイッチを以下の状態にします。
その後、動作確認のために、screenコマンドを使用してマイコンへシリアル通信を行います。
なお、書籍ではcuコマンドが紹介されていますが、私の環境ではcuコマンドは正常に動きませんでした。
sudo screen /dev/ttyUSB0 9600
上記コマンドを実行したのち、マイコンのリセットボタン(ディップ・スイッチの右隣にある黒いスイッチ)を押すたびにHello World!
と出力されれば、動作確認に成功です。
screenコマンドからはCtrl-k a
と入力すると抜け出せます。
以上が開発環境構築の手順です。
終わりに
元々はプログラムのビルドからバイナリの書き出しまで全てコンテナ内で行うつもりでしたが、ビルドする機能のみをコンテナに分離した方が様々な環境で使えるコンテナになると考えたので、このような手順になりました。
バイナリを書き出す方法は環境によって異なると思いますが、プログラムのビルドに関しては、Dockerが使える環境であれば本記事のコンテナを利用して実現できると思います。
参考サイト
12ステップで作る 組込みOS自作入門
12ステップで作る組込みOS自作入門 環境構築 前編(2022年8月) - Qiita
クロス開発環境の構築 - ryochack.clipboard
開発環境
ホストOS:Ubuntu 22.04