連載
» 2011年03月31日 11時30分 UPDATE

H8マイコンボードで動作する組み込みOSを自作してみよう!(1):フルスクラッチの“Hello World”を動かしてみよう (1/3)

学習用、ホビー用の組み込みOSとして「KOZOS」があります。本連載では「KOZOS」を使ってH8/3069Fマイコンボード上でいろいろと実験をしつつ、フルスクラッチで組み込みOSを自作していく過程を体験してみます。最終的にはソフトウェア完全自作のWebサーバを動かします。

[坂井弘亮,@IT MONOist]

1.はじめに:組み込みOSと汎用OS

 近年の組み込みシステムは、大規模化・複雑化が進んでいます。また、それと同時に、コスト削減のため、従来複数のマイコンで制御していた周辺デバイスを単一CPUで処理させようとする動きもあります。

 こうした要件を満たすために利用されるのが「組み込みOS」です。組み込みシステムにもOSを搭載することで、資源(システムリソース)をうまく分配して有効活用し、複数のタスクを調停させて動作させることができます。

 これに対して、PCなどに搭載されるOSは「汎用OS」と呼ばれます。汎用OSと組み込みOSの間には、大きな思想の違いがあります。

 汎用OSの役割は、ユーザーの作業環境として、複数のアプリケーションを協調動作させるベース環境を提供することです。このため、ユーザーがアプリケーションを自由にインストールして利用することが前提になります。

 しかし、ユーザーがインストールするアプリケーションは動作や品質が保証された商用のソフトウェアだけとは限りません。場合によっては自作のアプリケーションであったり、よく分からないフリーソフトウェアであったりするかもしれません。従って、バグのあるアプリケーションが動作しても他に悪影響を与えず、アプリケーション間で保護されるような仕組みが必須になります。

 つまり、アプリケーションは基本として悪であるという“性悪説”の下、管理されることになります。また、アプリケーションは全て平等であり、さらに、さまざまなアプリケーションを動作させる可能性があるため、CPU能力もメモリ総量も大きければ大きいほどいいという“大は小を兼ねる”の考え方になります。

 一方、組み込みOSの役割は、上記の通り、複数の機器の制御をコスト削減のために単一のCPUで行うことです。よって、制御の内容には多くの場合、明確な優先順位が存在します。

 また、ユーザーが任意にアプリケーションをインストールして利用するようなことはなく(注1)、開発サイドで十分に評価された特定のアプリケーションだけが動作することになります。アプリケーションにバグがあったときには、そのアプリケーションを直すことになるため、バグがあることが検知できればいいだけで、稼働を続ける必要性は低かったりもします。つまり、バグがある場合、システム全体がダウンしてしまっても構わないことも多く、むしろダウンすることで再起動し、クリーンな状態でサービスを再開した方がよい場合もあります(注2)。

※注1:ここでの「アプリケーション」は、CPUがネイティブに実行するアプリケーションプログラムのことであり、JavaVM上で動作する携帯電話アプリケーションのようなものを含むかどうかは考え方によります。


※注2:もちろん、バグがあった場合にも可能な限り稼働を続けることが求められるシステムもあります。


 また、動作するアプリケーションは限定的であるため、システムスペックも必要最低限で構いません。むしろ小規模な組み込みシステムに高速なCPUや巨大なメモリを搭載しても、コストばかり高くなり宝の持ち腐れになってしまいます。このため、組み込みシステムは「適材適所」であるといえます。

 以上の内容を基に、汎用システムと組み込みシステムの特徴をまとめてみますと表1のようになります。こうして比べてみると、その特徴/思想の違いがはっきりすると思います。

汎用システム 組み込みシステム
性悪説 性善説
アプリケーションは平等 アプリケーションには優先順位がある
大は小を兼ねる 適材適所
収束方向に向かう(隣の人と同じものを使った方が都合がいい) 発散方向に向かう(隣の人と同じものを使う必要はない)
表1 汎用システムと組み込みシステムの特徴

2.組み込みOS「KOZOS」って何?

 本連載では、学習用/ホビー用の組み込みOS「KOZOS」を使用して、H8/3069Fマイコンボード上でいろいろと実験をしつつ、フルスクラッチで組み込みOSを自作していく過程を紹介していきます。

 このKOZOSですが、実は筆者が作成しているフルスクラッチ・オープンソースの組み込みOSです。以下のWebサイトで公開しています。

関連リンク:
独自OSを作ってみよう!

 オープンソースの組み込みOSは各種ありますが、KOZOSには特徴的な部分があります。それは「個人利用」ということを意識して開発されているということです。

2.1.KOZOSの特徴

 多くの組み込みOSは、実用向けとして開発されています。このため個人レベルでの学習ということを考えたときに、そのまま利用するのは難しい部分があると筆者は考えます。

 KOZOSは、ホビーユースや個人での学習向けを意識して開発を進めています。このため、他の実用向けOSには見られない特色があります。主なものを以下に示します。

>>安価なボード上で動作する
 動作するターゲットボードは、おなじみの秋月電子通商H8/3069Fマイコンボード」(図1)です。

本連載で利用するH8/3069Fマイコンボード 図1 本連載で利用するH8/3069Fマイコンボード。大きさは手のひら程度だ

 正式な商品名は「H8/3069Fネット対応マイコンLANボード(完成品)」ですが、本連載では「H8/3069Fマイコンボード」もしくは単に「マイコンボード(ボード)」と呼ぶことにします。

 このボードは3750円(税込)と非常に安価で、個人でも入手しやすい価格です。電源アダプターやシリアルケーブルなどを一通りそろえたとしても、5000円程度で済みます。個人レベルで「マイコンボードで勉強してみよう」「遊んでみよう」と思ったときに、一番のハードルになるのはマイコンボードの価格だと思います。組み込み向けのマイコンボードは各種ありますが、個人でも購入可能な価格帯のものはなかなかありません。筆者としては、中学生や高校生でもおこづかいで買えるような価格のボードを使うことが、学習向けOSとしての絶対必須条件と考えています。

 また、秋月電子通商の店舗や通販などでも購入可能なため入手性もよく、全ての部品をはんだ付け済みの完成品の状態で販売しており、誰でも買ってきてすぐに動かすことができます。

 「安価」で、かつ手のひらに乗るほど「小さい」ということは、それだけでその機器の可能性を広げるものです。図1をもう一度ご覧ください。このような小さなボード上で完全自作のWebサーバが動作したとしたら、とても面白いことだと思いませんか?

>>少ないソースコード量
 個人での学習ということを考えたとき、OSのソースコード量がネックになることは多いと思います。教えてくれる人がいない状況では、個人で読み切れる量には限界があるからです。本当に読まなければならない箇所は一部分であったりもするのですが、初心者ではそれがどこなのかを判断することがまずできません。

 今回紹介するKOZOSの場合、ソースコード量はせいぜい数千行です。これは「ブートローダー」や「OSカーネル」「TCP/IPスタック」「Webサーバ」などのアプリケーションも含んだ全ての量です。これならば初心者でも十分に読み切ることが可能です。

 一般的に、1人の人間が一度に把握し切れるソースコード量は、大体1万行程度といわれています。このことを考えると、学習向けOSの条件としては、全てのソースコードが1万行以内に納まっていることが必須といえます。

>>特定の環境に縛られない
 開発環境は、組み込み開発ではおなじみの「binutils + gcc」のいわゆるGNUツール群です。gccは数多くのCPUに対応している、事実上の世界標準のコンパイラだと思います。

 特定のCPU専用のコンパイラなどを使ってしまうと、他のCPUを扱う場合に、全く別の開発環境の使い方を一から覚えなければなりません。しかし、GNUツール群ならば、将来的に他のCPUなどで開発を行う際にも戸惑わずに済むでしょう。つまり、つぶしの利く学習がでるというわけです。

>>日本語の資料が充実
 H8/3069Fマイコンボードで使用されているCPUは、ルネサス エレクトロニクスの「H8」というシリーズです(図2)。

マイコンボードの心臓部「H8/3069F」 図2 マイコンボードの心臓部「H8/3069F」

 CPUについて知りたいときに、まずハードルになるのは日本語のドキュメントの少なさです。ホビープログラミングということを考えたときに、英語のドキュメントしか資料がないということがハードルになってしまうのは非常にもったいないことです。これが仕事ならば「英語だろうが何だろうが、仕事なんだから読まなければ!」となるのですが、ホビー用途や個人での学習では、なかなかそうはいかないものです。やりたいことは英語の勉強ではなく、“OSいじり”だからです。また、初めて扱うCPUで、さらにドキュメントも英語というのでは、初学者には荷が重過ぎます。

 H8は国産CPUであり、日本語の資料が充実しています。マニュアルは日本語ですし、書店に行けば書籍もたくさんあります。これは初学者には非常にうれしいことです。

>>完全フルスクラッチ!
 ブートローダー、カーネル、各種デバイスドライバ、ライブラリ類、TCP/IPスタック、Webサーバなど、全てのソフトウェア部品を自作しています。このため全てのソフトウェア動作の学習が可能です。ブートローダーも自作しているため、電源ONした直後の最初の動作から学習できます。

 OSの勉強をしてまず思うのは「最初に動作する1行はどこか?」です。そして、その1行の場所が分かったとき、次に「この1行目が呼ばれているのはどこか?」という疑問がわき、ブートローダーについて興味を抱きます。KOZOSでは、これらのスタートアップの最初から学習できます。

>>勉強会などの開催
 学習用OSというならば、ただOSがあって終わりというだけでなく、学習するための環境作りも重要です。この一貫として、ユーザー会や勉強会が存在しています。

KOZOSのユーザー会や関連する勉強会について

  • KOZOSに関する質問や紹介、広報などのためのGoogleグループ「KOZOS友の会
  • 組み込み系のセミナー型の勉強会「組込みこぞう勉強会
  • 読者が一堂に会して黙々と作業を進めるという実習系の勉強会「12ステップ組込みOS自作本もくもく会
  • IT初心者向けの基礎技術の勉強会「IT初心者勉強会



 なお、KOZOSは現在、主にH8/3069Fマイコンボード上で動作しますが、SH2やPowerPCなどでの動作実績もあります。中にはARMで動作させている人もいます。今後も筆者の余力のある限り、さまざまなプラットフォームに対応していく予定です。

2.2.H8/3069Fマイコンボード

 図3は、マイコンボードの(シリアル端子の方向を上としたときの)右側面です。ここには電源端子があります。電源アダプターは別売りなので、別途用意する必要があります。

マイコンボードの右側面 図3 マイコンボードの右側面

 図4は、マイコンボードの左側面です。LANの端子があります。本マイコンボードはイーサネットコントローラーとして「RTL8019」を搭載しており、LANに接続することができます。

マイコンボードの左側面 図4 マイコンボードの左側面

 図5は、マイコンボードの上側面です。ここにはシリアル接続用の端子があります。マイコンボードはPCとシリアルケーブルで接続し、シリアル経由で操作することになります。展示会などでよくVGA端子と間違えられることがあるのですが、ディスプレー端子ではなくシリアル端子です。

マイコンボードの上側面 図5 マイコンボードの上側面

 見て分かる通り、インタフェースはLANとシリアルの2種類しかありません。もっともGPIOのピンが引き出されているため拡張することは可能ですが、本連載でははんだ付けなどは行わず、マイコンボードをそのまま利用することにします。

2.3.開発のイメージ

 図6は、シリアルケーブルを用いてマイコンボードをPCに接続したところです。このようにマイコンボードはPCと接続して、ソフトウェアの開発を行うことになります。

組み込み開発のイメージ 図6 組み込み開発のイメージ

 開発のスタイルはいわゆる「クロス開発」です。マイコンボード上で動作するソフトウェアのコンパイルは、PC上で行います。PC上でコンパイルし作成したモジュールをマイコンボードに転送し、実行させます。このような開発スタイルが、クロス開発です。組み込みソフトウェアの開発では、クロス開発が一般的なスタイルになります。PCにはマイコンボード用の実行コードを生成するためのコンパイラが必要になります。このコンパイラのことを「クロスコンパイラ」と呼びます。クロスコンパイラには上記のgccを利用します。

 開発を行うPCを「ホスト」、マイコンボードを「ターゲット」と呼びます。なお「ホスト ≠ ターゲット」となる開発スタイルがクロス開発ですが、PC上で動作するアプリケーション開発のように「ホスト=ターゲット」となる開発は「セルフ開発」と呼ばれます。また、マイコンボード上で動作するソフトウェアモジュールのことを一般的に「ファームウェア」と呼びます。

 具体的な開発の流れは、以下のようになります。

  1. ホスト上でクロスコンパイラを動作させ、ソースコードをコンパイルする(クロスコンパイル)。クロスコンパイルにより、ファームウェアが作成される
  2. ファームウェアをターゲットであるマイコンボードに転送し、マイコンボード上のフラッシュROMに書き込む
  3. マイコンボードの電源ONでファームウェアが起動し、プログラムの実行がスタートする

       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.