12ステップで作る組み込みOS自作入門

本とハードが届いてみたらめちゃ面白そうだったので、思わず始めてしまいました。TOEICなんてどうでもええ!

著者も書いている通り環境構築が一番の壁のようで、私も大いに躓きました。先人たちの情報をググりまくることでStep1を無事クリアできたので、私自身もトライ&エラーの跡を記録しておきたいと思います。GNUツールでの開発はおろかLinuxも素人なので的はずれな情報になってしまうかもしれませんが。

モノの準備

まずは私のマシン環境の紹介から。

  • DELL Inspiron 14 5000 (ノートPC)
  • Ubuntu 16.04 LTS 日本語 Remix

64bit環境です。次に購入したもの。

変換ケーブルを直接ボードに挿せば延長ケーブルいらないやん!と思ってたんですが、固定用のネジ部分がかちあって挿せません。ネジを外して無理やり挿しても通信が不安定になる、ということなので、素直に延長ケーブルも買いましょう。私は短さで選びました。
ネジ+スペーサーはマイコンボードにつける足です。これがないとむき出しの端子が足替わりになってしまいます。持ってない人は是非合わせての購入をオススメ。

f:id:marlesan:20160904050732j:plain:w400
こんな感じで開発してます。

開発環境の構築

はじめにボソっと書いたとおりLinux素人なもので、「あるソフトウェアが必要なときにそのソースファイルを取得して自環境でビルドする」という手順自体ほぼ初めて触れました。だいたい、次のような感じです。

  1. 作業用フォルダを作り、そこに移動
    • ホームに直接ソースをDLして作業すると後で泣きたくなると思います
  2. ソースファイル(圧縮されている)をダウンロード
  3. 解凍し、展開されたフォルダに移動
  4. build フォルダを作り、そこに移動
  5. ../configure でMakefileを作る
  6. make でビルド実行
  7. sudo make install で、ビルドされたバイナリをシステムにインストール

今回ビルドしたのは binutils, gcc, kz_h8write の3つでした。正確に言うと、他にもたくさんビルドしまくりましたが、結局必要なのはこの3つでした。順に使用したコマンドなど書きつけていきます(覚えてるかな…)。

Guake

その前に、使ってるターミナルを紹介しておきます。F12でパッパッと出し入れできる便利なヤツです。

$ sudo apt install guake

binutils

binutils はバージョン 2.27 を選択。本で紹介されてるものより新しいです。はじめ「lex っていうコマンドが使えないぜ」とエラーになったので、flex をインストールしています。この手のエラーを吐かれたら指摘されたコマンドを実行してみると、インストールすべきパッケージの候補を教えてくれます。

$ sudo apt install flex

改めて binutils を入れます。lex 以外の要因でもエラーでビルドが止まりましたが、これは本の助言通り --disable-werror のオプションを足してやり過ごしました。

$ cd ~/workshed /* 普段使ってる作業フォルダ */
$ mkdir src     /* 今回の作業フォルダ */
$ cd src
$ wget http://core.ring.gr.jp/pub/GNU/binutils/binutils-2.27.tar.gz
$ tar zxvf binutils-2.27.tar.gz
$ cd binutils-2.27
$ mkdir build
$ cd build
$ ../configure --target=h8300-elf --disable-nls --disable-werror
$ make
$ sudo make install

新しい binutils を使う場合の指示が公式サポートページにあるので対応しましょう。

gcc

ここが鬼門でしょう。binutils と同じノリで「新しい方がいい!」と 5.4.0 のビルドを試みましたが数時間格闘した末に諦めました。素人は素直に本と同じ 3.4.6 をビルドするのが賢いと思われます。ただし、64bit環境では本にない手順が必要です。これも公式サポートページで詳細を確認してください。

以下のコマンドリストにはこのパッチを当てる手順も入っています。

$ cd ~/workshed/src
$ wget http://core.ring.gr.jp/pub/GNU/gcc/gcc-3.4.6/gcc-3.4.6.tar.gz
$ tar zxvf gcc-3.4.6.tar.gz
$ cd gcc-3.4.6
$ gedit gcc/collect2.c /* 本で解説されている修正を行う */
$ wget http://kozos.jp/books/makeos/patch-gcc-3.4.6-x64-h8300.txt
$ patch -p0 < patch-gcc-3.4.6-x64-h8300.txt /* 64bit環境用のパッチを適用 */
$ mkdir build
$ cd build
$ ../configure --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c --disable-werror
$ make
$ sudo make install

ビルドが結構長いのでコーヒーでもキメながら待ちます。

kz_h8write

シリアル通信でH8/3069FのフラッシュROMに書き込みを行うツールです。h8write の改良版ということで最初からこちらを利用しています(Ubuntu + h8write だと書き込みごとにプロセスのkillだかマシン再起動が必要らしい…)。

配布サイトです。ブラウザから kz_h8write-v0.2.1.zip をダウンロードして作業フォルダに移動させました。

$ cd ~/workshed/src
$ unzip kz_h8write-v0.2.1.zip
$ cd PackageFiles/src
$ make

kz_h8write というバイナリがビルドされます。これはKOZOSのプロジェクトフォルダに配置する想定なので make install しません。また、ブートローダー用Makefileの H8WRITE の値を kz_h8write に対応するのを忘れないようにします(バイナリの名前を h8write に変えるでもよさそうです)。

というわけで開発環境の構築はほぼ終わりです。「ほぼ」というのは、USB-シリアル変換ケーブルを使う場合、そのセットアップも必要になるかと思います。以下、はじめに紹介したBUFFALOのBSUSRC0605BSをUbuntuで使う場合の手順をまとめます。

BSUSRC0605BS ドライバのインストール

正確にはこの製品に使われているチップのドライバが必要です。いや、もしかしたらデフォルトで入ってるかも…。確かめる前にドライバを手動で導入したのでわからないんですよね。変換ケーブルをUSBポートに挿して$ dmesgを実行し、

[87560.045514] usb 1-3: new full-speed USB device number 11 using xhci_hcd
[87560.235826] usb 1-3: New USB device found, idVendor=0403, idProduct=6001
[87560.235839] usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[87560.235847] usb 1-3: Product: USB HS SERIAL CONVERTER
[87560.235854] usb 1-3: Manufacturer: FTDI
[87560.235859] usb 1-3: SerialNumber: FT0H4ELF
[87560.240220] ftdi_sio 1-3:1.0: FTDI USB Serial Device converter detected
[87560.240394] usb 1-3: Detected FT232BM
[87560.240744] usb 1-3: FTDI USB Serial Device converter now attached to ttyUSB0

こんな感じのログが末尾にあれば使える状態だと思います。どうも反応ないらしいとなったら、次に進んでください。

ドライバはこちらから環境に合わせて入手します。ここでは Linux-64bit です。

$ cd ~/workshed/src
$ wget http://www.ftdichip.com/Drivers/D2XX/Linux/libftd2xx-x86_64-1.3.6.tgz
$ tar zxvf libftd2xx-x86_64-1.3.6.tgz
/* 以下、展開された中にある ReadMe.txt に従った手順 */
$ cd release/build
$ sudo -s
# cp libftd2xx.* /usr/local/lib
# chmod 0755 /usr/local/lib/libftd2xx.so.1.3.6
# ln -sf /usr/local/lib/libftd2xx.so.1.3.6 /usr/local/lib/libftd2xx.so
# exit

あとはコードをゴリゴリ書いていくのみ!

f:id:marlesan:20160904050814j:plain:w400
Step1完遂、歓喜のリセット連打。たぶん皆やる。