フルスクラッチの“Hello World”を動かしてみよう:H8マイコンボードで動作する組み込みOSを自作してみよう!(1)(3/3 ページ)
学習用、ホビー用の組み込みOSとして「KOZOS」があります。本連載では「KOZOS」を使ってH8/3069Fマイコンボード上でいろいろと実験をしつつ、フルスクラッチで組み込みOSを自作していく過程を体験してみます。最終的にはソフトウェア完全自作のWebサーバを動かします。
3.3.ファームウェア転送用アプリケーションの準備
H8はフラッシュROMを内蔵しており、シリアル経由でプログラムを書き込むことができます(ROMライタは不要です)。
この書き込みには「Open SH/H8 writer」(通称「h8write」)というフリーソフトウェアが利用できます。h8writeは以下からダウンロードできます。FreeBSD、GNU/Linux、Windows共通で利用できます。
関連リンク: | |
---|---|
⇒ | Open SH/H8 writer |
上記Webサイトにソースコードがありますので、先頭行にあるOSの指定を環境に合わせて修正し、以下のようにしてコンパイルして実行形式を作成しておきます。
% gcc h8write.c -o h8write -Wall
なお、フラッシュROMの書き込みは、「FDT(Flash Development Toolkit)」というメーカー純正のツールでも行えます。ただ、こちらはWindows用しかありません。
3.4.端末エミュレータの準備
本稿で説明している「Hello World!」はシリアル経由で“Hello World!”という文字列を出力するものです。このため、シリアル通信用のアプリケーションをPC側にインストールする必要があります。
シリアル通信用アプリケーションには、以下があります。これらは「端末エミュレータ」などと呼ばれます。
- FreeBSD、GNU/Linuxなど……「cu」「kermit」「minicom」など
- Windows……「TeraTerm」「ハイパーターミナル」など
Windowsの場合は「TeraTerm」、GNU/Linuxの場合は「minicom」がいいでしょう。まずはこれらをインストールしておきます。
3.5.ソースコードの準備
KOZOSはオープンソースソフトウェアです。ソースコードはKOZOSのWebサイトで公開されています。
ただし、上記Webサイトの情報は、筆者が開発を進めるたびにその都度公開している情報のため、あまりまとまっていません。今回は初心者向けということで、書籍用に整理されたソースコードを利用します。
参考文献[2]のWebサイトから「osbook_03.zip」をダウンロードしてください。解凍すると図12のフォルダ構成でファイルが展開されます。
osbook_03 ─┬─ 01 ── bootload ── main.c ┐ │ startup.s │(1stステップのソースコード) │ vector.c │ │ … ┘ ├─ 02 ── bootload ── … (2ndステップのソースコード) ├─ 03 ── bootload ── … (3rdステップのソースコード) … └─ 12 ┬─ bootload ── … (12thステップのブートローダーのソースコード) └─ os ───── … (12thステップのOSのソースコード)
図12 ソースコードのフォルダ構成 |
これは筆者の書籍「12ステップで作る組込みOS自作入門」(参考文献[1])の各章(ステップ)に応じたソースコードになっています。
そして本来ならば、フルスクラッチというならばこれを写経して……といいたいところですが、ここはソースコードをそのまま利用してしまいましょう。解凍したフォルダに「tools」というフォルダを作成し、h8writeを図13の構成で配置します。
osbook_03 ─┬─ 01 ── bootload ── main.c ┐ │ startup.s │(1stステップのソースコード) │ vector.c │ │ … ┘ ├─ 02 ── bootload ── … (2ndステップのソースコード) ├─ 03 ── bootload ── … (3rdステップのソースコード) … ├─ 12 ┬─ bootload ── … (12thステップのブートローダーのソースコード) │ └─ os ───── … (12thステップのOSのソースコード) └ tools── h8write─── h8write.c (h8writeのソースコード) h8write (h8writeの実行ファイル)
さらにPCのシリアルポートに合わせて、表2を参考にして「osbook_03/01/bootload/Makefile」の「H8WRITE_SERDEV」を修正します。
OS | デバイスファイル名 | |
---|---|---|
FreeBSD-4.xでPC付属のシリアルポートを利用 | /dev/cuaaX | |
FreeBSD-6.xでPC付属のシリアルポートを利用 | /dev/cuadX | |
FreeBSDでUSBシリアルアダプターを利用 | /dev/cuaUX | |
LinuxでPC付属のシリアルポートを利用 | /dev/ttySX | |
LinuxでUSBシリアルアダプターを利用 | /dev/ttyUSBX | |
Windows | comX | |
表2 シリアルのデバイスファイル名 |
表2中のデバイスファイル名の「X」の部分は、環境によって異なってきます。FreeBSD/Linuxでは多くの場合は「0」ですが、以下で説明する「make write」を試してみてダメなようなら「1」で試してみてください。WindowsはPC付属のシリアルポートでは「1」の場合が多いかと思いますが、これもダメなら「2」「3」と試してみてください。USBシリアルアダプターを利用している場合は、「4」「5」あたりになることが多いようです。
例えば、「osbook_03/01/bootload/Makefile」では「H8WRITE_SERDEV」は、
H8WRITE_SERDEV = /dev/cuad0
のように定義されていますが、Windowsで「com4」を利用するのであれば、
H8WRITE_SERDEV = com4
のように修正します。
3.6.ファームウェアのビルド
さて、いよいよファームウェアをビルドして動作させてみましょう。まずはソースコードのフォルダ(osbook_03/01/bootload)に入って、以下を実行することでソースコードをコンパイルしてファームウェアをビルドします。
% make clean % make % make image
図14は、筆者の環境(FreeBSD)で実行したときの写真です。臨場感を出すために、出力文字だけでなくあえて画面写真を掲載しています。
これでファームウェアとして「kzload」というファイルと、マイコンボードへの転送用のファイル形式に変換した「kzload.mot」というファイルが作成されています(図14)。
次にPCとマイコンボードをシリアルケーブルで接続します(図15)。
マイコンボードのディップスイッチを、左から「ON、ON、OFF、ON」(上、上、下、上)に設定します(図16)。これでマイコンボードがフラッシュROM書き込みモードで起動するようになります。
設定したら、電源アダプターを接続して電源ONします。本マイコンボードには電源スイッチはないため、電源アダプターの着脱で電源をON/OFFします。なお、電源LEDのようなものはないため、電源が入っているかどうかは見た目には分かりませんので注意してください。
電源を入れたらスーパーユーザーになって「make write」を実行することでh8writeが動作し、ファームウェアを転送して内蔵フラッシュROMに書き込みます。
% su # make write
図17は、「make write」を実行したところです。「H8/3069F is」と表示された状態になれば、うまく接続されています。そのまましばらく待つと転送が開始され、図18のように「EEPROM Writing is successed.」と出力されます。
これでマイコンボードのフラッシュROMに、ファームウェアを書き込むことができました。後は電源ONでファームウェアが起動します。
“Hello World!”の出力を確認するには、端末エミュレータ(TeraTermやminicomなど)を利用します。端末エミュレータを起動して、さらにパラメータを表3のように設定します。多くの場合はデフォルトのままでいいようですが、一応確認しておいた方がいいでしょう。
利用するデバイス | 表2のもの |
---|---|
ボーレート | 9600bps |
データ長 | 8ビット |
ストップビット長 | 1ビット |
パリティ | なし |
ハードウェアフロー制御 | なし |
ソフトウェアフロー制御(XON/XOFF) | なし |
表3 シリアル通信のパラメータ |
図19は、筆者が愛用している「cu」というツールで接続したところです。
ディップスイッチの設定を、左から「ON、OFF、ON、OFF」(上、下、上、下)に設定します(図20)。これでマイコンボードがフラッシュROMからブートするようになります。
リセットボタンを押して、起動してみましょう(図21)。リセットボタンはディップスイッチのすぐ右側にあります。
図22は、端末エミュレータの出力です。マイコンボードから“Hello World!”の文字列がシリアル経由で送信され、端末エミュレータ側で出力されています。無事、「HelloWorld!」が動作しています。
うれしくてリセットボタンを何回も押してみました(図23)。その都度リセットがかかり、繰り返し出力されています。
4.次回
今回は開発環境を構築して動作させることにとどまりました。次回は各種ソースコードを説明し、「Hello World!」の出力に必要な作業は何かを詳しく解説します。
筆者紹介:
坂井弘亮(さかいひろあき)
某企業でネットワーク系の開発を行いながら、個人で組み込みOS「KOZOS」の開発や書籍/雑誌記事執筆、各種セミナーでの発表やイベント出展、勉強会の開催など多方面で活動中。IPAセキュリティ&プログラミングキャンプ 2010講師。著書は「12ステップで作る組込みOS自作入門」など多数。
Copyright © ITmedia, Inc. All Rights Reserved.