Hatena::ブログ(Diary)

三等兵

2012-09-17

2回目のC言語で『12ステップで作る組込みOS自作入門 』の通りに組込みOSを作ってみた

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

出版社 : カットシステム (2010/05)
発行日 : 2010/05


前回の初めてのC言語で『30日でできる!OS自作入門』の通りに初めてのOSを作ってみた - 三等兵は汎用OSでしたが今度は組込みOSです。参考書は『12ステップで作る組込みOS自作入門 』です。こいつぁすげえや。丁寧に仕上げられた良書でした。

「組込み」とタイトルがついているので興味を示す層が狭そうですが、プログラムを書く多くの人にとって役立つ内容だったと思います。

前回は必死にわかんないーわかんないーを連呼しつつ頭を抱えて苦行みたいな感覚でやっちゃいましたけど、今回はそんな苦労もあったからか余裕を持って楽しめました。

本書ではWindowsだけではなくLinuxでも開発できるよう解説されているのでどんな環境でも問題ありません。Linux入れるのがめんどくさかった私は例によってMac OS Xでやりましたが大きな問題はなかったです。よってほぼ誰でも環境を用意することができる、と言いたいところですが。

こういったクロス開発ではシリアルケーブルとか使ってマイコンとイチャイチャする必要があるのです。でも、MacBook air(MBA)だとシリアルコネクタない...あるわけない。しょぼーん。

困ったなーと思ってたら2300円ぐらいのUSBのシリアルアダプタを使えば良いらしく、それ使ってやりました。

iBUFFALO USBシリアルケーブル(USBtypeA to D-sub9ピン)0.5m ブラックスケルトン BSUSRC0605BS
B007SI18YO

この記事では組込みの事前知識ゼロからやってみた者として、Macの開発環境を紹介しつつ書籍の内容について書いてみようと思います。


12ステップの内容をまとめたスライド

OS作りは一応2回目なので余裕もあるだろうと学習した内容を1ステップずつスライドにまとめながらやりました。荒いのと正確かどうかは保証できませんが、Macで詰まる部分はだいたいメモってあります。


開発環境を整えよう

WindowsとLinuxでの開発環境は本書で紹介されています。それらのOSであれば書籍を参考にしてください。この開発環境を作る時点で詰まったときはネットで検索したりGoogle グループで質問しながらがんばりましょう。

ハードな話

ソフトな話の前にハードな話。

本書ではマイコンボードとシリアル接続しながらのクロス開発を想定して書かれています。(クロス開発ってのは大雑把に言えばPCでコード書いてPCとは別の機器でそのプログラムを動かすことを目的とした開発のこと)

必要なものと金額は下記のリンク先にまとめられています。

実際に私が購入したものは以下の写真の通りです。

f:id:sandai:20120807145443j:image

面倒であればカットシステムさんからまとめて組込OSセットを買えます。全部で9110円です。

さらにシリアルコネクタがなければそこから2200円ぐらい増えますんで1万超えちゃいます。(左上のケーブルがシリアルケーブル。シリアルコネクタが無ければ必要です。ちなみにMBAにはないです)

合わせて1万2千円になりますざまぁーありませーんというわけで、レッドブル節約すべきかすべきでないか、それが問題だなブラザー。


Macの開発環境

それじゃあMacでの開発環境について紹介していきましょう。

動作確認はLion 10.7.4(64bit)です。

セルフ・コンパイラ

まずセルフ・コンパイラを用意します。これは要はgccのことです。

MacだとXcodeとそのうちのCommand Line Toolsを入れていればgcc(llvm-gcc)もあるので何もする必要はありません。Xcodeが無ければXcodeとCommand Line Toolsで検索かけてインストールしてください。

確かXcode4.3あたりからこうなったんで、Xcode4.2なら何もしなくていいはずかな。たぶん。

クロス・コンパイラ

次はクロス・コンパイラです。これもまあgccのことです。

gccが2つ出てきちゃいましたね。

えーと、セルフ・コンパイラは大雑把に言えばPC用のgccと考えてください。PC上で動作するプログラムをコンパイルするためのgccです。そしてクロス・コンパイラは組み込み用のgccです。マイコンで動作するプログラムをコンパイルするためのgccってわけです。

さっきのセルフ・コンパイラはクロス・コンパイラをビルドするのに必要なんで用意したのです。

で、クロス・コンパイラは「必要なくなったらまとめてゴミ箱行きできるインストール方法」でいきたいと思います。全部$HOMEにまとめちゃう感じですね。

それじゃあターミナルを開いて以下のように打ってください。

ちなみに書籍中ではターミナル開いてあれこれ操作するばっかりです。ターミナルの操作が全くわからない人はこれから厳しいかもしれません。慣れればなんとかなりますのでがんばっていじってみてください。

cd ~
mkdir 12step
cd 12step
mkdir build src tools

12stepというディレクトリをホームディレクトリに作成して、その下にbuild、src、toolsというディレクトリも作成しました。(ホームディレクトリはFinderのメニューバーから「移動>ホーム」で開かれるとこです)

  • build
    • インストールするツールをビルドするとこ
  • src
    • ここで12stepで開発していくプログラムを置きます
  • tools
    • クロス・コンパイラとか、その他必要なツールはここに置きます

これからクロス・コンパイラをダウンロードしてインストールします。ダウンロードするパッケージは以下の通り。

インストールは以下の記事を参考にしています。


まずは、12stepディレクトリのbuildディレクトリにパッケージをダウンロードします。

cd ~/12step/build
curl -O http://ftp.gnu.org/gnu/binutils/binutils-2.19.1.tar.bz2
curl -O http://ftp.gnu.org/gnu/gmp/gmp-5.0.5.tar.bz2
curl -O http://www.multiprecision.org/mpc/download/mpc-0.9.tar.gz
curl -O http://ftp.gnu.org/gnu/mpfr/mpfr-3.1.1.tar.gz
curl -O http://ftp.gnu.org/gnu/gcc/gcc-4.7.1/gcc-4.7.1.tar.gz

これらはターミナルから実行するコマンドですよ。じゃあ、5つダウンロードできたらそれぞれビルドしていきます。

binutils
cd ~/12step/build
tar jxvf binutils/binutils-2.19.1.tar.bz2
cd binutils-2.19.1
./configure --target=h8300-elf --disable-nls --disable-werror --prefix=$HOME/12step/tools
make
make install
gmp
cd ~/12step/build
tar jxvf gmp-5.0.5.tar.bz2
cd gmp-5.0.5
./configure --prefix=$HOME/12step/tools/gmp
make
make check
make install
mpfr
cd ~/12step/build
tar zxvf mpfr-3.1.1.tar.gz
cd mpfr-3.1.1
./configure --prefix=$HOME/12step/tools/mpfr --with-gmp=$HOME/12step/tools/gmp
make
make check
make install
mpc
cd ~/12step/build
tar zxvf mpc-0.9.tar.gz
cd mpc-0.9
./configure --prefix=$HOME/12step/tools/mpc --with-gmp=$HOME/12step/tools/gmp --with-mpfr=$HOME/12step/tools/mpfr
make
make check
make install
gcc
cd ~/12step/build
tar zxvf gcc-4.7.1.tar.gz
cd gcc-4.7.1
./configure --target=h8300-elf -disable-nls --disable-threads --disable-shared --disable-werror --enable-languages=c --prefix=$HOME/12step/tools --with-gmp=$HOME/12step/tools/gmp --with-mpfr=$HOME/12step/tools/mpfr --with-mpc=/usr/local/mpc
make     
make install

以上です。ビルドしてできたファイルは全て~/12step/toolsのtoolsディレクトリ以下にあります。

h8write

h8writeは、PCで書いたプログラムをマイコンのフラッシュROMに書き込むことができます。これもtoolsディレクトリ以下に入れます。

ただし、Lion以降はkz-h8writeでないと動作しないかもしれません。(32bitカーネルなら普通のh8writeで問題ないかと。h8writeを使うなら書籍を参考にビルドしたら、~/12step/tools以下にh8writeというファイルを置いてください)

そういうわけでkz-h8writeを使わせてもらいます。

ダウンロードして解凍したら~/12step/build/以下にkz_h8write-v0.1.0を置いてください。あとは以下のコマンドを実行するだけです。

cd ~/12step/build/kz_h8write-v0.1.0/src
make
mv kz_h8write ~/12step/tools/kz_h8write

クロス・コンパイラの用意は以上で終わりです。


シリアルコネクタが無いPCでの準備

次はシリアル接続できるようにするための準備です。

PCにシリアルコネクタが無い場合はUSBシリアルケーブルみたいなのが必要です。とりあえずネットで調べてみるとMacであれば下の機器で問題ないと書いてあったので、私もこれを買いました。

iBUFFALO USBシリアルケーブル(USBtypeA to D-sub9ピン)0.5m ブラックスケルトン BSUSRC0605BS
B007SI18YO

Windows向けと書かれてますが心配いりません。Macでも利用することができます。そのためにはMac用のドライバが必要でして、それは下記のURL先からダウンロードしてインストールしてください。

Snow Leopardであればx86 (32-bit)のドライバですね。(64bitで動作させていればx64です。こういうことしてなければ32bitで起動してるはずです)

Lion以降はx64のドライバをインストールしてください。

ドライバ名の確認

ドライバをインストールできたらUSBシリアルケーブルのドライバ名を確認します。

まずはUSBシリアルケーブルを接続してください。そしてターミナルから以下のようにコマンドを実行します。

ls /dev/tty.*
/dev/tty.Bluetooth-Modem     /dev/tty.Bluetooth-PDA-Sync     /dev/tty.usbserial-FTG6PQ4H

ls /dev/tty.*の部分がコマンドで、その下の行がコマンドを実行した結果です。結果のうち、「/dev/tty.usbserial-FTG6PQ4H」がこのデバイス名です。同じようにして自分のデバイス名を確認できたら後から使うので覚えておいてください。


1stステップだけ学習講座

以上の設定でどうやって学習していくかを1stステップを例に書いときます。

ソースコードの置き場所

1stステップはHello Worldを表示するプログラムを書くんですが、それぞれのファイルの置き場所は~/12step/src以下になります。

ディレクトリの構造は、

  • 12step
    • tools
    • src
      • 01
        • bootload
          • main.c
          • startup.s
          • ...
      • 02
        • bootload
          • ...

こんな形です。srcディレクトリの下に1stステップのコード、2ndのコードと並べていきます。src以下は書籍の通りなんでよくわかんなかったら書籍も参考にしてください。確かstep1にディレクトリ構造の図があったと思います。

Makefile

で、書籍の通りにコードを書くときMakefileの部分だけそのままじゃうまくいきません。書籍ではクロス・コンパイラを/usr/local以下に配置した形になってますが、こっちは~/12step/tools以下に置いてますからね。

それで、こっちの環境で動作させるためにはMakefileを以下のように直してください。

PREFIX = ~/12step/tools
ARCH = h8300-elf
BINDIR = $(PREFIX)/bin
ADDNAME = $(ARCH)-
.
.
.
H8WRITE = ../../../tools/kz_h8write

H8WRITE_SERDEV = /dev/tty.usbserial-FTG6PQ4H

これらのうち、H8WRITE_SERDEV = /dev/tty.usbserial-FTG6PQ4Hだけ皆さんそれぞれ違う記述になるはずです。ここはさっき確認したUSBシリアルケーブルのデバイス名を書いてください。

あと「H8WRITE = ../../../tools/kz_h8write」も単純なh8writeを使ってるなら、「H8WRITE = ../../../tools/h8write」としておいてください。

プログラムのビルドとフラッシュROMへの書き込み

指示された通り全てコードを書いて、Makefileもこっちの設定用にできたらビルドします。cd 12step/src/01/bootloadでmakeすると下記のように出力されれば成功です。

cd ~/12step/src/01/bootload
make
~/12step/tools/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD vector.c
~/12step/tools/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD startup.s
~/12step/tools/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD main.c
~/12step/tools/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD lib.c
~/12step/tools/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD serial.c
~/12step/tools/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
~/12step/tools/bin/h8300-elf-strip kzload

次にmake imageというコマンドを実行してください。下記のように出力されるはずです。

make image
~/12step/tools/bin/h8300-elf-objcopy -O srec kzload kzload.mot

今度はマイコンのフラッシュROMにプログラムを書き込む作業をします。まずマイコンとMBAを接続します。

f:id:sandai:20120824122228j:image

次に書籍でも解説されていますがディップスイッチというのを書き込みモードにします。こうすることでフラッシュROMにプログラムを書き込めるようになります。

f:id:sandai:20120824122317j:image

この青いディップスイッチの右隣にポチっとあるのがリセットボタンです。一応試しにポチっとおしといてください。

それじゃあフラッシュROMに書き込みを行います。ターミナルからmake writeを実行してください。次のようになったら成功です。

make write
../../../tools/kz_h8write -3069 -f20 kzload.mot /dev/tty.usbserial-FTG6PQ4H
=================================================
 H8/3069F Flash Writer for KOZOS (Version 0.1.0)
 Copyright(C) 2011-2012 Shinichiro Nakamura
=================================================
Bitrate sequence: Done.
Inquiry device: Done.
Select device: Done.
Inquiry clock mode: Done.
Select clock mode: Done.
Select bitrate: Done.
Waiting for erase done:...
Programming:.....
Program: Done.
Complete.
フラッシュROMから起動

じゃあプログラムを実行してみましょう。書籍にもありますがcuコマンドを使って接続します。

まずはマイコンのディップスイッチを下の画像のようにします。

f:id:sandai:20120824122347j:image

ターミナルから下記のように実行してください。これは書籍でいうところのCUを使ってます。特に問題はないので、CU使っちゃってかまいません。

sudo cu -l /dev/tty.usbserial-FTG6PQ4H
Password:

「usbserial-ほにゃらら」の部分は自分のデバイス名にしてEnter押します。すると、Passwordを聞かれるのでいつもログインに使ってるパスワードを入力してください。

うまく接続されたらConnectied.と表示されるはずなので、ここでリセット・ボタンをポチっと押してみてください。

sudo cu -l /dev/tty.usbserial-FTG6PQ4H
Connected.
Hello World!

こんな感じでHello World!と表示されたら成功です。

学習の流れ

2ndでは~/12step/src/01を~/12step/src/02にコピーして書籍の通りにコードを修正しながら進めていく形になります。書き込みとプログラムの起動についてはさっきやったような感じですね。

あとは、エラーなどで詰まったところがあったらスライドで確認してみてください。細かい部分はメモってませんが、大きなエラーは内容と解決方法をメモってあります。

それ以外は書籍の通り進めていけば問題はないでしょう。


書籍について

入門と冠された本としては比較的高いレベルが求められます。高いといってもたいていの人は一般教養レベルでしょと言われるぐらいものでして、プログラミング初心者だと誰か指導してくれる人がいないと辛いって感じですね。

組込みの知識ゼロでも問題はありませんでした。ほとんど全て解説してくれるので、前提としてC言語だけ文法とかなんとなく理解できていれば大丈夫です。

コードは一生考えてもわからん!ってほど難しいところは無かったと思います。アルゴリズムやデータ構造はシンプルなものだし、動作に必要なコード以外はほとんど書かれていないので行数が少なく読みやすいはずです。文章は丁寧にまとまっていて構成がよく練られているといった印象を受けました。下手に話が展開していかないよう配慮している部分も好感が持てます。

開発は最初にひと通り動く小さなプログラムを書いて、それを毎ステップごとに少しずつコードを修正、追加していきながらOSを開発していくって流れです。

こういうのいいですよね。次はこういう機能を実装するからコードをこういうふうに書き換えるよ、こういうファイルを追加するよ、ってことが把握できるので理解しやすいですし、自分でOSを作っている感じがして楽しみながら開発することができます。

コードの量は最終的に2700行ぐらいで、毎ステップに書くコード量が200〜300行前後とバランスが良いですね。

だいたいの人は本書のうち第1部まで問題なく理解できるはずで、鬼門は後半の第2部の7thステップと8thステップでしょう。特に8thステップが私みたいになんちゃってでやってると、ここで壁にぶち当たります。

この部分を理解できているかどうかで9thステップに続く内容の理解度に影響してくるはずなので、難しいと感じたならめんどくさがらずにメモをとりつつ細かく流れを整理しておきましょう。

ここは中盤ながらのラスボスですね。中ボスなんだけどラスボス並みに強いじゃねえかっていう中ボスです。そうですね、バルバトスですね。

特技がストーカーで口を開く度にぶるぅぅあああああ!!と叫ぶバルバトス。タンスの角に小指をぶつけてぶるぅぅああああ!と泣き叫ぶバルバトス。人気のラーメン店で並んでいるとおばさんに横入りされてぶるぅああああ!と悔し泣きするバルバトス。バルバトスがぶるあああ!!過ぎて生きているのが辛い…。何の話か分からない人はスルーしてください。


他の組込みの書籍を知らないのでなんともいえませんがOS本の入門書としてなら良書だと思います。すごくわかりやすかったので。たぶん組込みの入門書としてもこの出来なら評価は高そうですね。

全体的に構成が丁寧で内容が分かりやすくまとまっており、文章に対するコード量の比もバランスがとれていて、自分でコード書きながら理屈も学べる良い本でした。

おそらく「組込み」というタイトルで興味を持つ層が限られているような気がします。しかし、プログラムを書く多くの人にとって役に立つ内容だったと思いますよ。関心の輪を広げてチャレンジしてみてはいかがでしょうか。

個人的には汎用OSより先にこっちやってみる方が良いかなと感じました。なんで、単純にOSに興味があるけどOS作り未経験な人もどうぞ。

本書であれば高度な知識を必要とせず最後までやり遂げられるでしょう。それにブートローダ作って実行ファイルを解析したり、ファイル転送のプロトコルを実装したりといったことを入門レベルで実践できるので楽しいですよ。

というわけで、前回でもそうでしたが、フルスクラッチでOS作るってのはどういうことか今回も良く身に染みました。なんだかんだと大変でしたが楽しかったです。

では、もしやってみようと挑戦する方がいらっしゃれば楽しんでやってみてください。

kappakappa 2014/03/29 10:24 大変丁寧なメモを残してくださり、ありがとうございました。自分もこの本を買って勉強していたのですが、Macの情報が無くて困っていました。

kappakappa 2014/03/29 10:24 大変丁寧なメモを残してくださり、ありがとうございました。自分もこの本を買って勉強していたのですが、Macの情報が無くて困っていました。

kappakappa 2014/03/29 10:24 大変丁寧なメモを残してくださり、ありがとうございました。自分もこの本を買って勉強していたのですが、Macの情報が無くて困っていました。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

リンク元