12ステップで作る組込みOS自作入門　環境構築　前編（2022年8月）

12ステップ本を買って、一か月近く環境構築の沼にハマってました...。ネットの記事を見ると、私と同様に「12ステップで作る組込みOS自作入門」の環境構築に手間取っている人を多く見かけます。様々な記事を探し出し、エラーが出ては調べ、修正し、色々施した結果ようやく環境構築に成功しましたので、自分も誰かの助けになればと思い、この記事を書くことにしました。長い記事になりそうだったので、前編と後編に分けました。
とはいっても、自分はよわよわ学生エンジニアもどきなので、どこかで間違っている部分が大いにあると思います。その時は修正をしていただけるとありがたいです！

# 開発環境
・ホスト　Windows11 Pro
・ゲスト　Virtualbox Ubuntu 16.04（Vagrantで作成。のちに説明）
# 用意するもの
・12ステップで作る組込みOS自作入門　
[Amazonへのリンク](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)
以下12ステップ本と表記します。

・H8/3069F マイコンボード
[秋月電子通商へのリンク](https://akizukidenshi.com/catalog/g/gK-01271/)
以下、マイコンと表記します。

・ACアダプター・・・5V1Aで十分です。フラッシュROM書き込み時で約80mAなので、それに合うようなものを用意すれば大丈夫です。コネクタは2.1mm径。
自分はこちらを使いました
[秋月電子通商へのリンク](https://akizukidenshi.com/catalog/g/gM-06096/)

・シリアルケーブル（USBシリアルでも可）
D-sub9ピンのRS232Cのものです。
最近のPCはシリアルコネクタが付いていないものが多いですが、書籍ではSerial to Serialケーブルが推奨されていました。シリアルコネクタが付いているPCでの開発がおすすめです。とは言いつつも、自分のPCもシリアルコネクタがなかったので、USB to Serialのケーブルを使いました。
自分はこれを使いました。
[秋月電子通商へのリンク](https://akizukidenshi.com/catalog/g/gM-02746/)

ネットではこちらのコネクタが使えたという記事を見つけたので、一応貼っておきます。個人的にはこちらの方がいい気がします。（下記の注意事項を参照）
[秋月電子通商へのリンク](https://akizukidenshi.com/catalog/g/gM-08343/)

**上記の「自分（この記事の筆者）が使った方の」ケーブルを使う場合は、のちに記載する注意事項を読んでいただけると嬉しいです**

参考にしていただけたら嬉しいです。

## 上記のシリアルケーブルについての注意事項(2022/08時点)
注意事項は2つあります

1.マイコンのシリアルコネクタ（メス）とそのままでは合わない。
2.デバイスドライバ上でWindows11はPL2303TAをサポートしていないと表示される。

二つとも解決できたので、解決方法を書いておきます。

### 1.マイコンのシリアルコネクタ（メス）とそのままでは合わない
これについては、（あまり行儀がいいやり方ではないのですが）マイコン側の留めネジの穴を外してしまえば問題なかったです。書き込みも出来ました。マイコン側のコネクタはメスで、留めネジの穴が付いています。つまり、シリアルケーブルについては、留めネジが付いているものを買うのが賢いです。

### 2.デバイスドライバ上でWindows11はPL2303TAをサポートしていないと表示される
デバイスドライバで確認すると「PL2303TA DO NOT SUPPROT WINDOWS 11 OR LATER, PLEASE CONTACT YOUR SUPPLIER」という文字が出てきました。（正直さすがに新しいものを買わないといけないのか、と思いました。しかし一応解決はしました。）

自分の場合だと、古いデバイスドライバをインストールしたら認識するようになってくれました。**下記リンクの古いデバイスドライバで不具合が起こっても、この記事では責任を取りかねます。あくまでも自己責任でお願いします**
それでも調子が悪い時や、認識してくれないときは、何度かインストーラを立ち上げて修復しました。その都度再起動しないといけないので、正直めんどくさかったです。そしてこのドライバでもちゃんとすべての環境で認識させられるかどうかは分かりかねます。

https://oemdrivers.com/usb-prolific-usb-to-serial-driver


一応公式のデバイスドライバのリンクも貼っておきますので、まずはこちらを試された方が良いと思います。

https://www.prolific.com.tw/US/ShowProduct.aspx?p_id=225&pcid=41


ちなみに秋月で買ったときについてきたDVDのドライバインストーラは試していません...試してみるのもいいかもしれません。

参考記事はこちらです
https://www.avrfreaks.net/forum/prolific-pl2303ta-usb-serial-and-windows-11
https://techcommunity.microsoft.com/t5/windows-11/pl2303-issues-prolific-usb-to-serial-drivers-win-11/m-p/2966957

# 環境構築　一連の流れ
長くなりますので、自分がした環境構築の一連の流れをまず書いておきます。4つのステップに分かれています。かなり丁寧めに書きますので、分かっている方はその都度読み飛ばしてもらっても構いません。前編は1と2、後編は3と4のステップについて説明していきます。

**1.　Virtualboxで、Vagrantを使ってUbuntuの仮想環境を作る**
**2.　binutils-2.19.1とgcc-3.4.6のインストール**
**3.　プログラムをコンパイルし、FDTを用いてマイコンに書き込む**
**4.　Seristerでシリアル接続の確認**

# 1. Virtualboxで、Vagrantを使ってUbuntuの仮想環境を作る
まずは仮想環境を作るところからやっていきます。WSLやCygwin、公式のVMイメージを使って試してみたこともあったのですが、自分の場合はbinutilsやgccのインストールが上手くいかなかったりしました...。なので、今回の場合はVirtualboxで仮想環境を建てていきました。

### VirtualboxとVagrantのインストール
Virtualboxのインストーラ

https://www.oracle.com/jp/virtualization/technologies/vm/downloads/virtualbox-downloads.html

ダウンロードにはOracleのアカウント登録が必要です。めんどくさいですが登録しておきましょう。
プラットフォームはWindowsなので、Windowsインストーラをクリックすればダウンロードできます。インストール方法は簡単なので省略。

Virtualbox Extensionもインストールしましょう。最新版のリンクはこちらです。

https://www.virtualbox.org/wiki/Downloads

下にスクロールしていくと、「VirtualBox x.x.x Oracle VM VirtualBox Extension Pack」というのがあります。自分のVirtualboxのバージョンを確認して、バージョンが同じExtensionをインストールしましょう。

Vagrantのインストーラ

https://www.vagrantup.com/downloads

Vagrantとは、仮想環境を簡単に建てられたり、管理できたりするソフトウェアです。共用フォルダの設定が楽ちんです。

すべてのインストールが終わったら、コマンドプロンプトでVagrantがきちんと認識できているか確認しましょう。

```:コマンドプロンプト
Vagrant -v
```
認識できていたら、Ubuntuの仮想環境を立てていきましょう。ゲストOSをVagrant cloudからインストールします。
コマンドプロンプトを立ち上げます。
```:コマンドプロンプト
mkdir vagrant_makeos
cd vagrant_makeos
vagrant init ubuntu/xenial32
```

https://app.vagrantup.com/ubuntu/boxes/xenial32

出来たらvagrant_makeosの中にVagrantfileというファイルが出来ています。そのファイルをVisual Studio Codeなどのエディタで開きましょう。

![スクリーンショット (228).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1500513/09e7c6dd-f38a-4b90-9f76-fac5cbeaf8da.png)
46行目に共有フォルダの設定があります。コメントアウトを消して、上の写真のように設定しましょう。./workspaceがホスト側のフォルダ、/home/vagrant/workspaceがゲスト側のフォルダです。出来たら保存してエディタを閉じましょう。

できたら、vagrant_makeosフォルダの中に「workspace」というフォルダを新規作成し、「workspace」の中にも「src」フォルダを新規作成していきます。12ステップ本のフォルダ構成に準ずる構成にしていきます。その後以下のコマンドを実行しましょう。一応再起動もさせておきます。（たぶんしなくてもいい）
```:コマンドプロンプト
vagrant up
vagrant reload
```
Virtualboxを立ち上げると、32bitのUbuntu16.04の仮想環境が出来ているのが確認できると思います。第一ステップがこれで終わりました。

参考記事はこちらです
https://qiita.com/aoi70/items/b66a451f4b7f5f05beec
https://imadedede.hatenablog.com/entry/2020/07/13/014241

# 2.binutils-2.19.1とgcc-3.4.6のインストール
では、仮想環境を表示させます。Virtualboxの「表示」を押すと、画面が出てきます。
#### Virtualboxを使ったことがない人向けのおすすめ記事

https://pc-karuma.net/virtualbox/

マウスポインターのキャプチャやウィンドウのスケールモードの切り替えに使うホストキーは、デフォルトでは右Ctrlに設定されていると思います。

https://mebee.info/2020/03/29/post-6931/#:~:text=VirtualBox%206.1.4-,Host%E3%82%AD%E3%83%BC%E8%A8%AD%E5%AE%9A,%E3%81%99%E3%82%8C%E3%81%B0%E3%80%81%E8%A8%AD%E5%AE%9A%E5%AE%8C%E4%BA%86%E3%81%A7%E3%81%99%E3%80%82

操作はUSキーボードに準じているので、JISキーボードとUSキーボードの差分を表を見ながら打ち込みます。

https://www.nagasaki-gaigo.ac.jp/toguchi/pc/multilingual/keyboard_us_jis.htm



始めにlogin userの名前とPasswordを聞いてくるので、どちらもVagrantと入力しましょう。
```:Ubuntu 16.04
login user vagrant
Password vagrant（実際には表示されない）
```
ログインできたと思います。
では必要なものをインストールしていきましょう。インストールするもの一覧はこちらです。
```
・gcc（最新のものでOK）
・tar（最新のものでOK。もともとインストールされているはずです）
・patch（最新のものでOK。もともとインストールされているはずです）
・make（最新のものでOK）
・gcc-3.4.6
・binutils-2.19.1
```
インストールするもの一覧の1つ目から4つ目のgccからmakeまでは、sudo apt install でインストールすれば大丈夫です。
```:Ubuntu 16.04
sudo apt install <gcc,tar,patch,make>
```
では、実際に使用するbinutils-2.19.1とgcc-3.4.6をインストールしていきましょう。.tar.gzファイルを12ステップ本の公式ホームページからダウンロードします。また、KOZOSのソースコードをアーカイブしたもの（osbook_03）もダウンロードしておきましょう。（なるべくミスを減らすため、まずは正しいソースコードを使うのが良いです）

http://kozos.jp/books/makeos/#source_code

できたら先ほど作ったsrcフォルダに、解凍したosbook_03フォルダ内の「01」フォルダをコピーします。そしてbinutils-2.19.1.tar.gzファイルとgcc-3.4.6.tar.gzファイルもsrcフォルダにコピーします。
できたら、仮想環境のコンソール内でbinutils-2.19.1とgcc-3.4.6のインストール作業に移りましょう。まずはbinutils-2.19.1からやっていきましょう。
```:Ubuntu 16.04
cd src
tar xvf binutils-2.19.1.tar.gz
cd binutils-2.19.1
mkdir build
cd build
../configure --target=h8300-elf --disable-nls --disable-werror
make
sudo make install
```
make中は長いです。気長に待ちましょう。makeをしている途中で画面が真っ暗になったら、Enterキーを押してください。おそらく単に画面がスリープモードに入っただけだと思います。
これでbinutils-2.19.1がインストール出来ました。

次にgcc-3.4.6をインストールします。こちらはbinutilsよりインストールが少し複雑です。まずは以下のコマンドを打ち込んでください。
```:Ubuntu 16.04
cd ../../
tar xvf gcc-3.4.6.tar.gz
cd gcc-3.4.6
```
ここで、書籍p17に記載されている修正を行いましょう。また、このタイミングでパッチを作っていきましょう。gcc-3.4.6フォルダ下にpatch.txtというテキストファイルを作って、以下のリンクのソースをコピー＆ペーストしましょう。

http://kozos.jp/books/makeos/patch-gcc-3.4.6-x64-h8300.txt

出来たらパッチを当てて、インストールしていきましょう。
```
patch -p0 < patch.txt
mkdir build
cd build
../configure --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c --disable-werror
make
sudo make install
```
インストールが完了したら、gcc-3.4.6フォルダを削除するか、別の関係ない場所に移動させておきましょう。でないとVagrantのrsyncでエラーを起こすらしいです。

参考記事はこちらです。
https://imadedede.hatenablog.com/entry/2020/07/13/014241
https://to-son.net/2020/04/16/12step-wsl-environment/

第二ステップが終了しました。ここまで成功したら、後はプログラムをコンパイルし、書き込み、シリアル通信が出来ているか確認します。

前編が終了しました！ここまでお疲れ様です！
後編はこちらです！

https://qiita.com/nekoshark02/items/0423fe34940711053faf