[読書メモ]12ステップで作る組込みOS自作入門: 1stステップ 開発環境の作成(と序章)

この本は、H8マイコンで動く独自OSを作成する。
ソースコードは2000行弱しかないので、シンプルだが全貌が分かりやすい。
作成するのは、ブートストラップ、ドライバ、スレッド、スケジューラ、メモリ管理、タスク間通信あたりで、逆にサポートしていないのは、ファイルシステム、タイマーサービス、LAN機能、リアルタイム性etcとなっている。

OSには汎用OSと組み込みOSがある。
汎用OSは、悪意のある人も含めいろんな人が書いたプログラムが動くので、基本的に性悪説になる。
組み込みは、たとえば家電製品だと追加でアプリの登録はNGなので、性善説で作られることが多い。
また組み込み向けはタイミングが大事だったりするので、優先度管理の機能が充実していたりする。

この書籍のOS開発はgccで行われる。
実行環境はlinux,cygwin,FreeBSD等、何でもよい。


プログラムが動くターゲットデバイスが異なるCPUの場合、クロスコンパイラが必要となる
GCCでH8向けのクロス開発環境を構築するには、以下のコマンドを実行する

1.binutilのインストール

tar xvzf binutils-2.19.1.tar.gz
cd binutils-2.19.1
./configure --target=h8300-elf --disable-nls
make
sudo make install



問題がなければ/usr/local/binに以下のようなコマンドができる
h8300-elf-as、h8300-elf-ld

また、/usr/local/h8300-elf/の下にもプログラムが作られる(シンボリックリンク?)
こちらは、コマンド名に接頭語がつかない。

2.gccのインストール

tar xvzf gcc-3.4.6.tar.gz
cd gcc-3.4.6
#setenv SHELL /usr/local/bin/bash
./configure --target=h8300-elf --diable-nls --disable-threads --disable-shared --enable-languages=c
# ./configure --target=h8300-elf --diable-nls --disable-threads --disable-shared --enable-languages=c --disable-werror
make
sudo make install




gccのビルド中に、gcc/collect2.cのopenシステムコール呼び出しでコンパイルエラーが出る場合がある。
この場合は、第三引数にパーミッション「0755」を追加する。



H8はフラッシュメモリにブートローダを持っていて、書き込みにはフリーソフトのh8writeを使用する。
(Windows環境だと、RenesasがFDTというツールを用意していて、これを使ってもよい)

h8write.cをwindowsで使う場合は、defineでWIN32を有効にしたうえで、使用するシリアルポートを定義する。


ここまで作ったら、Hello Worldのプログラムを作る。
表示はputsで指定するけど、H8マイコンはディスプレイを持おらずputs関数は使えないので自作する必要がある(シリアルに出力する)。一部の標準ライブラリ関数に関しては、glibcをリンクすれば使えるのだけど、コードサイズが大きくなるし、全部自作したほうが面白いので、この本では使用しないらしい。

ソースは下記のURLからDL可能。
(LICENSEを見るとコピーOKらしいので全部転記してもよいのですが、リンクだけの紹介にしておきます。)

http://kozos.jp/books/makeos/
http://kozos.jp/kozos/osbook/osbook_03/01/bootload/




で、今回作るソースは以下の8本。
各コードの詳細は2ndステップ以降らしいけど、普通にCの開発経験があればリンカオプション以外は簡単に理解できるレベルになっている

main.c     
    hello worldの本体
 
startup.s  
    スタートアップルーチン/ラベル_startが存在する
    アセンブラで記述されており、ここからmain()がコールされる
 
vector.c   
    割り込みベクタ
    今は、start()しかなく、これはstartup.sの_startラベルに対応している
 
lib.h/lib.c
    標準ライブラリ関数を入れるところ
    今はputs,putcしかない。
    putsはputcを使って実装されている
    (なので、今のところputcだけがHW依存になっている)
    putcはserial.cの関数を使っている
 
serial.h/serial.c
    シリアルデバイスドライバ
    0xffffb0,ffffb8,ffffc0のアドレスを直指定で、データのr/wを行っている。
    (シリアルは3つあるらしくプログラムでは0xffffb8から8byte分を使っている)
    クロックを元に9600bpsを算出してるっぽい。
 
defines.h 
    NULLとかuint8,uint16などのdefine
 
ld.scr
    リンカスクリプト
    ここで、各処理が何番地にマッピングされるかを決めているらしい。
    割り込みベクタはCPUの仕様として0番地から始まるので、開始アドレスを決めている。
    ここは、まだ良く分からないけど3章で説明されるらしい...
 
Makefile
    普通のmakefile



Makefileを見ると、クロスコンパイル用のgccを使ってELFのバイナリを出力している。
h8writeはモトローラのSレコードフォーマット(.mot)しか解釈できないので、その後”objcopy -O srec”で.motファイルに変換している。


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

関連記事

コメントを残す

メールアドレスが公開されることはありません。