「組込みOS自作入門」Dockerを利用した開発環境構築

# はじめに
本記事では[「12ステップで作る 組込みOS自作入門」](https://www.amazon.co.jp/12%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%A7%E4%BD%9C%E3%82%8B%E7%B5%84%E8%BE%BC%E3%81%BFOS%E8%87%AA%E4%BD%9C%E5%85%A5%E9%96%80-%E5%9D%82%E4%BA%95-%E5%BC%98%E4%BA%AE/dp/4877832394)の開発環境をDockerコンテナを利用して構築するための、一通りの手順を紹介します。
「組込みOS自作入門」開発環境の構築については複数の記事で既に解説されていますが、本記事は環境構築の1つの事例として参考にしていただけると幸いです。
なお、ビルド環境を構築するための成果物 (Dockerfile等) は[Github](https://github.com/satumaimo10/buildenv_kozos)に公開してあります。
また、本記事の手順はUbuntu 22.04をホストOSに用いてテストしています。

# 事前準備
私の場合は、[こちらの記事](https://qiita.com/nekoshark02/items/a5a95e732fcd3003dede)を参考にして以下のハードウェアを揃えました。

[Ｈ８／３０６９Ｆネット対応マイコンＬＡＮボード（完成品）](https://akizukidenshi.com/catalog/g/gK-01271/)
[超小型スイッチングＡＣアダプター５Ｖ１Ａ　ＡＤ－Ｄ５０Ｐ１００](https://akizukidenshi.com/catalog/g/gM-06096/)
[ＦＴ２３２　ＵＳＢシリアル変換ケーブル　ＶＥ４８８](https://akizukidenshi.com/catalog/g/gM-08343/)

また、ホストOSではdocker, docker-composeを使用できる状態にします。

# 開発環境構築

## ビルド環境の構築
Githubからリポジトリをcloneし、コンテナをビルド/実行します。
```bash
git clone https://github.com/satumaimo10/buildenv_kozos
cd buildenv_kozos
docker-compose up -d
docker exec -it (コンテナ名) bash
```

コンテナ内でプログラムを正しくビルドできるか確認するために、公式サイトからソースコードを取得します。
```bash
cd workspace/
curl -O http://kozos.jp/kozos/osbook/osbook_03.zip
unzip osbook_03.zip
```

実際にビルドしてみます。
```bash
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](https://ja.osdn.net/projects/kz-h8write/)を使用しました。

操作をホストOSに切り替え、kz-h8writeをダウンロードしてビルドします。

```bash
// コンテナから退出
exit

// kz-h8writeのダウンロード/ビルド
cd ./workspace/
(kz_h8write-v0.2.1.zipを取得)
unzip kz_h8write-v0.2.1.zip
cd ./PackageFiles/src/
make
```
以降は、[kz_h8write開発者のブログ](http://shinta-main-jp.blogspot.com/2011/05/h83069f-writer-for-kozos-kzh8write.html)と「組込みOS自作入門」の内容を参考にしながら、kz_h8writeが正しく使用できるか確認します。

### バイナリの書き込み

マイコンをフラッシュROM書き込みモードにするために、ディップ・スイッチ（マイコン右上の青いスイッチ）を以下の状態にします。

<img width="400" alt="switch_01.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471917/52afbef6-9b18-aa4f-9f3e-55f6afb88935.jpeg">

そして、マイコンを電源に接続し、USBシリアルアダプタをマイコンとPCに接続します。
その後、ホストOSで`ls /dev/`を実行すると、`ttyUSB0`というデバイスファイルが表示されます。（環境によってデバイスファイル名は異なる可能性があります。）
このデバイスファイルを引数にして、`kzload.mod`をkz_h8writeでマイコンに書き込みます。

```bash
// workspaceディレクトリへkz_h8write実行ファイルをコピー
cp kz_h8write ../../
cd ../../

// マイコンにkzload.modを書き込む
sudo ./kz_h8write -f 20 osbook_03/01/bootload/kzload.mot /dev/ttyUSB0
```

### マイコンの動作確認
マイコンを実行するために、ディップ・スイッチを以下の状態にします。

<img width="400" alt="switch_02.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471917/20b81717-f656-b7c2-5cbc-6044f24694d8.jpeg">

その後、動作確認のために、screenコマンドを使用してマイコンへシリアル通信を行います。
なお、書籍ではcuコマンドが紹介されていますが、私の環境ではcuコマンドは正常に動きませんでした。
```bash
sudo screen /dev/ttyUSB0 9600
```

上記コマンドを実行したのち、マイコンのリセットボタン（ディップ・スイッチの右隣にある黒いスイッチ）を押すたびに`Hello World!`と出力されれば、動作確認に成功です。
screenコマンドからは`Ctrl-k a`と入力すると抜け出せます。

以上が開発環境構築の手順です。

# 終わりに
元々はプログラムのビルドからバイナリの書き出しまで全てコンテナ内で行うつもりでしたが、ビルドする機能のみをコンテナに分離した方が様々な環境で使えるコンテナになると考えたので、このような手順になりました。
バイナリを書き出す方法は環境によって異なると思いますが、プログラムのビルドに関しては、Dockerが使える環境であれば本記事のコンテナを利用して実現できると思います。

# 参考サイト
[12ステップで作る 組込みOS自作入門](http://kozos.jp/books/makeos/)
[12ステップで作る組込みOS自作入門　環境構築　前編（2022年8月） - Qiita](https://qiita.com/nekoshark02/items/a5a95e732fcd3003dede)
[クロス開発環境の構築 - ryochack.clipboard](https://ryochack.hatenadiary.org/entry/20110515/1305400022)

# 開発環境
ホストOS：Ubuntu 22.04