組込みの壁
これまで2回にわたって二上先生、香山先生からマジカルスプーンの概要とその教育的意義について紹介をいただきました。本稿では、実際にマジカルスプーンのシステムを題材に、組込み(=マイコンで制御している)のプログラム作成にチャレンジしてみましょう。
組込みソフトを学ぼうとするひとの前には、大きく2つの壁が立ちふさがります。まずひとつめが「C言語」です。書店には多くのC言語の解説書が並んでいますが、そのほとんどは
main()
{
printf( "Hello World" );
}
で始まります。
パソコンであれば、これをコンパイルして実行すると画面に文字が現れます。しかし、組込みシステムでは、そもそも画面がないものがほとんどです。ここでまず出鼻をくじかれてしまいます。それでも頑張って読み進めると、不思議な演算子やら、C言語究極の壁と呼ばれるポインタ、そして最初は何に使うのかさっぱりわからない構造体など、次々と謎が初心者を襲います。
またパソコンでは、コンパイルする環境と作ったプログラムを動作させる環境は同じです。しかし組込みでは、コンパイルするのはパソコンで、それを実際に動作させるのはマイコンの乗ったボード(回路基板)です。このようにプログラムを作るマシンと動作させるマシンが異なる開発環境を、「クロス開発環境」といいます。これも、慣れていないと勝手がわからず道に迷ってしまう要因となります。これら以外にも、パソコンのソフトウェアではまったく気にする必要のなかったことに気を配る必要もあります。たとえば、「main
関数は誰が呼んでくれるのか」という問題です。
このmain
関数を呼び出す部分を、「スタートアップルーチン」といいます。いろいろなハードウェアの設定をして、main
関数を呼び出します。ハードウェアの設定をするからには、ハードウェアごと(CPUごと)に固有のプログラムが必要です。したがって、組込みソフトウェアでは、そこもプログラム設計者が意識する必要があるのです。
もうひとつの大きな壁が「ハードウェア制御」です。パソコンなどではOSというソフトウェアがハードウェアにうまく覆いをかけて、なおかつ便利なサービスを提供してくれています。たとえば、さきほどのprintf
も、「カーソル位置に1文字出力する」というサービスを利用することで、出力先がノートの液晶だろうと外部モニタだろうと気にせず動作させることができているわけです。組込みシステムではどうでしょうか。図1は組込みシステムでのソフトウェアの一般的な構造を簡単に示したものです。
一番上のアプリケーションという部分が、そのシステムで実際にやりたい仕事のプログラムです。二番目のミドルウェアというのは、アプリケーションを実現するために必要な処理ライブラリのようなものです。たとえば、画像や音声の圧縮伸長などの処理はここにあたります。その下にOSとデバイスドライバがあります。組込みシステムでも、このようにOSが搭載されていることは珍しくはありません。しかし用意されているサービスは、ほとんどの場合、タスク(ソフトウェアにおける仕事の単位)や記憶領域、時間などの管理が主です。特定のハードウェアに固有の、たとえば「5番目のランプを灯す」といった機能は、標準的に用意されることはありません。たとえOSに便利なサービスが用意されていたとしても、それが特定のハードウェアできちんと動作するようにするには、そのハードウェアに合ったデバイスドライバと呼ばれるハードウェアの制御プログラムを用意する必要があります。パソコンでも新しいハードウェアにはハードウェアベンダからデバイスドライバが供給されて、ユーザはそれをOSに組み込みますね。つまり「誰か」が、ハードウェアを制御するプログラムを作ってくれているわけです。組込みソフトウェアに挑戦しようとすると、「誰か」ではなく「自分が」自分の目的と使用するハードウェアにマッチしたデバイスドライバプログラムを作らなければならなくなります。
ソフトウェアに限らず、技術物は、実際に動作させてみて、トライ&エラーを繰り返して学ぶのが近道です。組込みソフトの場合、ちょっと動作させてみるにも、マイコンボードから専用の開発ツールまで揃えて環境を整備する必要があります。このアプローチは、入門者にとっておっくうになってしまいがちです。さらには学ぶ必要のあることがソフトウェアにとどまらずハードウェアにまで及んでしまうため、手強く感じてしまいます。