組込みOSをつくってわくわく[1ステップ後編] | とらのブログ

とらのブログ

ジャグリングが趣味のプログラマー(?)が綴る適当な日記

ホテルで暮らしているうちになるべく更新しようという魂胆。
間違えて書いたものを消してしまうことが多々あるので、気をつけます。

モチベーションがめっさ下がりますね。
結構書いたあとだったのに。。

***


今回はあの世界一有名なプログラムを作成するところから始まります。

…そう、ハローワールド。


printで簡単にかけてしまうプログラムですが、
今回はフルスクラッチでOSを作成することを目的としています。
つまり、printfは存在しません。


あ、フルスクラッチは1から新規で作成することを指すそうです。


さてさて。
ボードにはディスプレイが無いのでシリアルで出力します。
よって、下記が必要と考えられます。
・Hello Worldを出力するメインプログラム
・シリアルデバイスを制御するプログラム(ドライバ)
・文字の出力関数を記述するライブラリファイル


それに加えて用意するのが、以下のようです。
・スタートアップ
・割込みベクタ定義
・リンカスクリプト
・(makefile)


スタートアップはメイン関数を実行する前の準備を行うプログラムで、アセンブラで記述します。
割込みベクタ定義は、割込み関数を登録するためのファイル。
配列があり、その中に関数の実行アドレスを格納していきます。
これを割込みベクタテーブルと呼ぶことにします。
リンカスクリプトは関数やデータのメモリ配置を決めるためのファイルです。
makefileはなくても出来なくはないので()にしています。あると楽。


ファイル数だと10個。270用程度です。
今回は動くものを作る、という思想の元、とにかく写していきます。
ここ↓にソースコードが置いてあるので、コピーして使用することもできます。

http://kozos.jp/books/makeos/
まあ、コピーしたら負けだと思っていますが。


アセンブラやmakefileの書き方はわけわけめですが、気にせず写します。
細かいことは後だー!
しかし、makefileはあまり扱っていないので、後々勉強することにする。


ほぼ全部写しなのですが、makefileの一部を書き換えています。
H8writerはcygwin\tools\に入れているので、makefileのH8writeへの
パス指定を下記へ変更。


H8WRITE = = ../../../tools/h8write/


書き忘れていましたが、プログラムが置いてあるのはcygwin\home\01\bootloadです。
今後02,03とフォルダを作成し、同様の構成にしていきます。
もうひとつ、シリアルの接続先を下記に変更します。


H8WRITE_SERDEV = com4


同じwindows環境でも数字は違うと思うので、デバイスマネージャー等で確認する
必要があります(comなのは変わらない)。


準備完了。
cygwinでカレントディレクトリに移動します。

> make
> make image

このコマンドでkzload.motというファイルができます。
あとはこのファイルをROMに書き込むだけです。
makefileは本当に便利ですね。

次に、ボードのディップスイッチ(4個のスイッチが並んでいるやつ)
の3以外をすべてONに切り替えます。
この状態で電源をONにすると、書き込みモードで起動するので、


> male write

を実行します。これだけ。

makefileは本当に便利ですね。(大事なことなので(ry)


電源をオフにし、今度はスイッチの1,3のみONにします。
そしてteratermを立ち上げ、ボードに接続します。
さあ、電源ONだ!Hello world来い!




…あれ、出ない。。。
と思っていたら刺す電源アダプタを間違えていました。
PSP充電してどうすんのさ。

気を取り直して、再度電源ON。

…今度はすんなり出ました。
LEDが光ったりが無いので、電源がONになっているか不安になりますが、
間違いなくシリアル出力できているので成功です。


余談:プログラム実行のイメージ
何ステップか先まで読み進めているので、ちょっとまとめてみます。


電源が入るとCPUはアドレス0番地から実行を始めます。
0番地には、リンカスクリプトで割込みベクタテーブルを配置します。
つまり、電源が入るとテーブルの0番目の要素に登録された関数が実行されます。
ここにはスタートアップを登録しておくので、スタートアップルーチンが実行されます。
スタートアップはルーチンの最後にメイン関数を呼びます。
メイン関数が呼ばれたら、後は普段良く見る処理ですね。


今回のスタートアップはメイン関数を呼ぶだけの処理です。
割込みベクタへの登録は、特別な処理をするわけではなく、
ファイルに書いておくだけです(ソースコ-ド見ればわかりますね)。


これにて1ステップ目終了です。
1回1回が濃いので、なかなかまとめ切れませんね。。
せめて面白おかしく、と思ってもウィットにとんだことを
言えるわけもなく。しばらく模索しつつ進めていきます。


今回文字を出力したので、次回は数字出力です。
こんな感じですが、よろしくお願いいたします。


前:組込みOSをつくってわくわく[1ステップ] (環境構築)
次:組込みOSをつくりんだりんだ[2-1]