12ステップで作る組込みOS自作入門 1stステップ ~開発環境の構築

# はじめに
OSの下回りについて知識がなかったので、今回この本を購入して勉強しようと思います。
[12ステップで作る 組込みOS自作入門](http://kozos.jp/books/makeos/)

# 変更履歴
2020/12/31
PCを新しくしたので、本記事を更新しました。

2021/11/03
cygwinのバージョンが64bitを使用する場合用に、本記事を更新しました。

# 用語集

## GUIとCUI
・GUIはマウスからの操作を主体にしたインターフェース
・CUIはキーボードからのコマンド入力を主体にしたインターフェース

## 組込みOSと汎用OSの違い
・組込みOSは「すべてのアプリケーションは悪さをしない」性善説に基づいたアーキテクト
・汎用OSは「悪さをするアプリケーションがいる」性悪説に基づいたアーキテクト
　→　仮想メモリ、プロセスなどシステム全体へ影響しない仕組み

## クロス開発とセルフ開発の違い
・クロス開発は「開発環境と実行環境が異なる」
・セルフ開発は「開発環境と実行環境が同一」

## ファームウェアとソフトウェア
・ファームウェアはハードウェアを動かすためのソフトウェア
　→　基本的にユーザーが書き換え、入れ替えを想定していないところが異なる

# 開発環境の構築

## 使用するマイコン
H8/3069F

## 開発環境
ノートPC：Windows10  64bit
ソフトウェア：Cygwin

## 組込み機器のプログラム実行
①PC上でプログラムを開発
②組込み機器に対応した機械語を生成

# 構築手順
## 1.セルフコンパイラの環境作成
Cygwin（64bit）のインストール（https://www.cygwin.com のsetup-x86_64.exe）

### 補足
・インストールするPCが64bitの場合、32bitをインストールした場合、正しく動作しない可能性
　があるので、PCのbit数に適したバージョンをインストールする。

## 2.Cygwinのインストール内容

Devel以下、次の4つのコンテンツ（最新のバージョン）をインストールする
![無題0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418028/43c75367-e91f-58a9-1620-15b617ff65b2.png)
### 1.binutils
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418028/5753f72b-af37-c254-c18d-4be599288922.png)
### 2.gcc
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418028/c595f73b-d095-d91c-f625-bc48e18724a5.png)
### 3.make
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418028/a66c1a3a-5e07-3683-b554-15c77d0140cc.png)
### 4.patch（64bitの場合、パッチファイルの適用）
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418028/63ff748e-6f6a-60d3-0bcf-cdc592296a21.png)

## 3.クロスコンパイラの作成
以下のファイルを取得
・binutils-2.19.1( http://www.ring.gr.jp/pub/GNU/binutils/ )
・gcc-3.4.6( http://www.ring.gr.jp/pub/GNU/gcc/ )
・Teraterm( https://ja.osdn.net/projects/ttssh2/releases/ )

## 4.圧縮ファイルの配置
・「C:\cygwin\home\ユーザ名」の配下にbinutils-2.19.1.tar.gzとgcc-3.4.6.tar.gzを配置

## 5.cygwinでの操作
### binutils
```bash:cygwin
$ 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
$ make install
```

### gcc-3.4.6
```bash:cygwin
$ tar xvf gcc-3.4.6.tar.gz
$ cd gcc-3.4.6
```

### パッチファイルのインストール（64bit）
・こちら( http://kozos.jp/books/makeos/patch-gcc-3.4.6-x64-h8300.txt )の内容を
ファイルをpatch.txtで保存。解凍した「gcc-3.4.6」直下に配置。

```bash:cygwin
$ patch -p0 < patch.txt 
```

### config.guessファイルの更新（64bit）
・こちら( https://github.com/gcc-mirror/gcc/blob/master/config.guess )の内容を
「gcc-3.4.6」内にある全ての「config.guess」ファイルに反映する。

#### 補足
・config.guessファイルを更新しない場合、次のコマンド実行時にエラーと
　修正先URLが出る。「ftp://ftp.gnu.org/pub/gnu/config」
　こちらのサイトの内容のソースコードのコピーがGitにある。

### gcc\collect2.cの更新
・書籍17ページに記載の修正を行う。

```bash:cygwin
$ mkdir build
$ cd build
$ ./configure --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c --disable-werror
$ make
$ make install
```

### 書籍のソースコード一式
こちら(http://kozos.jp/kozos/osbook/) の「osbook_03.zip」
解凍したフォルダの階層を「osbook/src/01/bootload/以下ソースコード」に合わせ、
「C:/cygwin/home/ユーザ名」の配下に配置する。
以降、Makefileの変更を極力避けるために、フォルダの配置を合わせて指定する。

### kz_h8write
シリアル通信でH8/3069FのフラッシュROMに書き込みを行うツール
もともとのh8_writeの改良版ツールとなる。
こちら(https://cubeatsystems.com/kz_h8write/) 
解凍したフォルダのPackageFiles\bin\kz_h8write.exeを以下に置く
・「C:/cygwin/home/ユーザ名/osbook/src/tools/h8write」
・「kz_h8write.exe」を「h8write.exe」にリネーム

## 6.プログラムのビルド
上記の設定で、開発環境の準備完了。ビルド・実行に関しては以下を実施。

### プログラムのビルド
「C:/cygwin/home/ユーザ名/osbook/src」以下各章ごとで開発したソースを置く。

### 1章での開発の場合
Cygwinで「C:/cygwin/home/ユーザ名/osbook/src/01/bootload」まで移動

### Makefileの以下の箇所を変更
H8WRITE_SERDEV = comXX 
（自分のWindows PCの場合はcom5で接続されている。ポート番号はTeratermで確認する）

```bash:cygwin
$ make
$ make image
```

もしも、コンパイルで生成したファイルを削除したい場合は make cleanを実行

## 7.ボードへの書き込みと実行
### 1章での開発の場合
Cygwinで「C:/cygwin/home/ユーザ名/osbook/src/01/bootload」まで移動



### ボードをROM書き込み用にスイッチを合わせる（ON,ON,OFF,ON）
```bash:cygwin
$ make write
```
もしも書き込みに失敗した場合は、ボードのリセットボタンを押下して
もう一度書き込みを行う。

### ボードをROM読み込み用にスイッチを合わせる（ON,OFF,ON,OFF）
### Teratermを開き、シリアルデバイスを実行
comXX（Makefileで変更した番号）を選択し、実行。
リセットボタンを押下するとコンソールに表示される。

これで開発できる。長かった（20時間くらいをこれに費やした…）