12ステップで作る組込みOS自作入門#1
組込みの仕事を始めて3年位たつが、修正の仕事ばかりできちんと基礎を理解できていなかったと思い、再度勉強をすることにした。
勉強方法としては、上記の「12ステップで作る組込みOS自作入門」を読みつつ、実際にプログラムを作ってH8/3069Fマイコンボードに組み込む流れで。
環境はこんな感じ。
・USB Serial Port
・H8/3069Fマイコンボード
1stステップでは「開発環境の作成」。
まず初めにクロス開発環境を作るが、GNU/Linuxを用意するのが面倒なので今回はWindows7(32bit)にCygwinをインストールする(本でも一応勧められている)。
CygwinはH8/3069Fマイコンボード付属のCDに入っていたのでそれをインストール。ちなみにバージョンはversion 2.78.2.9。
次にGNUプロジェクトが提供しているgccというコンパイラとbinutilsというアセンブラ・リンカ等のツール類をインストール。
こちらはこの本の作者のHP(http://kozos.jp/books/makeos/)から入手したファイルを使用。
binutilsはインストールできたがgccでビルド時にエラーが発生。
"/usr/bin/install: permission denied"と出ているが権限の問題ではない様子。
ググッて調べてみるとgcc-3.4.6フォルダのMakefileの変数INSTALLが悪さをしているらしい。
binutils-2.19.1フォルダのMakefileの変数INSTALLをコピペしてみるとインストールが出来た。
ここでやっとプログラムファイルの作成に入る。
main()関数とスタートアップ、割り込みベクタ、ライブラリ関数、シリアル・デバイス・ドライバ、ヘッダファイル、リンカ・スクリプト、Makefileを作成する。
ヘッダファイルの説明で「typedefによって定義された型をヘッダファイルの上で利用すると、ヘッダファイルの依存関係ができてしまい、インクルード時に順番などを考慮する必要がある」とあるのが分からなかったがとりあえず後回しに。
とりあえず忘れそうなので各ファイルをざっとおさらい。
スタートアップ : 各種初期化を行ったあとにmain関数を呼び出すファイル。アセンブラで作成。
割り込みベクタ : 関数へのポインタを定義。現在startのみ。
ライブラリ関数 : 標準ライブラリを使わないためライブラリ関数を作成する。現在1文字送信と文字列送信のみ。
シリアル・デバイス・ドライバ : デバイスドライバ(シリアルポート)。デバイスの初期化、送信可能かの確認、1文字送信を行う。
リンカ・スクリプト : 実行形式ファイルのメモリ配置を定義(メモリ・マップ)。
Makefile : コンパイル・リンクを行い実行形式を作成する手順。
ファイルを作成後にmakeコマンドでコンパイル・リンカを行う。
その後、make imageコマンドでファームウェア「kzload」をELF形式からモトローラSレコード・フォーマット(mot)に変換し、「kzload.mot」を作成する。
その後、make writeコマンドでkzload.motをH8/3069Fマイコンボードに転送を行う(DSWはON-ON-OFF-ON)。
この時、com1 port errorが発生。
MakefileのH8WRITE_SERDEVをCOM1に修正したが直らなかったが、USB Serial PortのUSBを抜き差しするとなぜか転送が成功した…。
今回作成したプログラムは"Hello World!"という文字列をシリアル出力するので、確認にはシリアルポートの入出力を行う端末シミュレータが必要となるため、Tera Termをインストール。特に問題は起きないためインストール手順は省略。
DSWをON-OFF-ON-OFFにしてリセットを行うと、Tera Termに"Hello World!"が出力。
無事成功!!
ここまでに5時間ちょいくらい…環境構築さえなければ…!