「組み込みソフトウェア」とは何か 〜PC系ソフトウェアとの違い〜

Web業界の方に「組み込み系ソフトウェア」「家電系ソフトウェア」という話しをすると途端に表情に?マークが浮かび、会話がかみ合わなくなることがある。先日id:amachangと飲みながらそんな話しをしていたので、組み込みソフトの世界について、Web業界・PC業界の方にもわかりやすく説明してみたい。折しも就職活動が激化する時期でもあるので、組み込みソフトウェア業界ってものがいったい何を指すのかよくわからん、という学生の諸君の参考にでもなればと思う。

そんなものにもOSが

自宅にあるルーターやDVDレコーダー、テレビ、カーナビ。普段なんの気なしに使っているけど、実は中をあけてみると、WindowsだのLinuxだのといったOSが入っていることがほとんど。でも起動するときにWindowsロゴマークとか出ないのは、単に出ないようにしているだけ。ものすごい極端に言えば、メディアプレイヤーしか使えないように改造したWindowsがあって、起動と同時にメディアプレイヤーが表示されればハードディスクレコーダーっぽい、よね? こんな感じで身の回りのハイテク家電類は片っ端からOSを積んで、「映像を見るアプリケーション」やら「音楽を再生するアプリケーション」が動いている。一言で言えば、こういう「パソコンじゃない機器」向けのソフトウェアを開発するのが「組み込みソフトウェア開発」である。

ここで1つだけ区別しておきたいが、OSを介さないようなSimpleな電気信号制御プログラムも「組み込みソフト」であるが、業界全体としてはそういったソフトウェアは減ってきている。というわけで、今日ここで紹介する話からは除かせていただきたい。あと、OSをわかりやすくするためにWindowsとしたけど、組み込み用途のために極限までカーネル容量を削ったLinuxだったり、itron,μitronだったりする。

iPodみたいなものを作ろう

では、実際にいまから「iPodのような携帯型音楽再生機」を作ると仮定して、組み込みソフトウェア開発の流れを見ていこう。

x86とARM/SH

一般的に目にする普通のパソコンは全て「x86アーキテクチャ」と呼ばれるCPUで動いており、AMDIntel、VIAなど複数の会社のCPUがあるけれど、どれも同じ「x86系でうごくWindows」が起動する。でも、パソコン用のx86系CPUは消費電力が大きい*1。1個あたりのお値段も高い。パソコンみたいに10万円もするものではなくて、1万円だか2万円だかで売るiPodみたいなものに入れなきゃいけないうえに、小さなバッテリーで長時間動かさないといけないからx86だとちょっと難しいわけだ。

そこで出てくるのが、安い値段で省電力なCPU。組み込み用途向けCPUという呼ばれ方をすることも多い。モノとしてはARMとかSHとかいろいろあるけど、ここでは組み込みで代表的なCPUといえばARM系CPU、としよう。じゃぁこのARMとやらでいつものWindowsLinuxを動かせばいいじゃない、というとになるが、ことはそうカンタンにはいかない。

アーキテクチャ」が違うCPUの上では、同じOS(バイナリイメージ)は動かないから、当該CPU用のOSを作るところからはじめないといけない。といってもLinuxとかだとソースコードが公開されているから、OSをゼロから開発することなく(結構手間はかかるけど)ARM用だのSH用だののOSを作ることができる。この作業をOSポーティングという。だいたいの場合、ここまでは既に他の会社がやってくれたものをダウンロードして手にいれたり、購入したりすることができたりする。

問題はここからだ。

ハードウェア的な設計・接続

パソコン用のマザーボードはどこでも売っていて、ぱちり!とCPUを刺せば誰だって動かせる。でもARMを使ってあなたがこれから作ろうとしているiPodのようなデバイスに使える小型のマザーボードなんてどこにも売っていない。

こればっかりは作るしかない。組み込みLinuxとは少々無縁だが、これをがんばって作る....のが家電業界。実際にはソフトウェアではなく「ハード屋さん」と呼ばれる人たちがここで登場する。必要な機能を充足するにはどんな部品が必要で、それらをどうやって小さな嬌態に押し込めるマザーボードにするかを考える人たちだ。そのバックにはマザーボードの試作をする工場があったりする。

まぁハードの話しは今回の本題ではないので、ここでは取り急ぎアリモノを使うことにしよう。世の中には便利なものがいっぱいある。下記にあるBeagle Boardなんてのはその典型だ。携帯電話用最新鋭組み込みCPU(ARM系)であるOMAP3530を搭載した超小型マザーボードだ。もとがケータイ用ってことで携帯電話サイズのバッテリーでも数時間動かしたりすることができる。回路図から何から全てオープンソースになっているので、習得には最適だろう。何といっても価格が激安。こういう開発キットは業務用のものが多くて10万円とか平気でするんだけれども、Beagle Boardはとにかくやすい。

http://search.digikey.com/scripts/DkSearch/dksus.dll?pname?site=jp;lang=ja;name=296-23428-ND

あとはその組み込み機器に何を接続したいか、だ。パソコンだったら液晶ディスプレイ、マウス、キーボード、音源、LAN、無線LANぐらいだろうが、iPodみたいな機器に必要なものは?

音源と、ボタンと、タッチディスプレイ? 無線LANも欲しい? 家電の開発では、これらの機器をどうつなぐかをハード屋さんが考えて回路をつくり、マザーボードに接続端子を組み込む。Beagle BoardではUSBとSDぐらいしかクチがないので、USBを分岐しまくってがんばってつなごう。USB接続型無線LAN、USB接続型音源、USB接続型液晶 etc 世の中にゃ便利なものがいっぱいある。

※普通USBに液晶はつながないが、一応あるにはある
 

ドライバーってダウンロードすればいいものじゃないの?

物理接続までだけなら誰でもできる。OSから何かデバイスをコントロールしようと思うと、ドライバーがいる。そう、周辺機器を買ってきたらCDを入れてインストールする、あれだ。仮にバッキャローというメーカーが作ったUSB音源があるとする。これをあなたのパソコン(OS)が知っているはずもない。だからその音源をあなたのWindowsから使えるようにするために「ドライバー」を入れて「こうやって電気信号を送ればこの音源は"ド"の音を出してくれますよ」という情報をOSに伝えるわけだ*2

バッキャロー社はx86環境で動くWindowsLinux用にドライバーを作って配布している。だからあなたはバッキャロー社のサイトやCDROMからドライバーをコピーすればカンタンに使える。でも、ARM-CPUで作る組み込み機器は? ARM−CPU用にコンパイルされたLinuxの上ではどうなる? 残念ながらそのままで使えることは稀。

じゃどーするかというと、そのバッキャロー社が使っている音源部品のメーカーから「どういう電気信号を送ればどういう動作をしてくれるのか」という仕様書を取り寄せ、ARM用Linuxに向けたサウンドカード・ドライバーを自分で書くしかない。


結構、だいぶ、相当、大変。

でもこれができれば、神にもなった気分になれる。電気的な仕様さえわかれば世の中にあるどんなものだってあなたが作る機器で動かすことができるからだ(ちょっと言いすぎw)。感圧センサー? 傾斜センサー? 液晶ディスプレイ? マウス? ゲームパッド? タッチディスプレイ? モーター? ヒーター?

組み込みソフトウェア

そして最後に、これら全てを制御するソフトを書く。感圧センサー上をなぞるように指が右回転すれば、画面を下にスクロールするGUIプログラム。音楽の再生を行うプログラム。音楽の再生が開始されると同時に、10個あるLEDが音量と比例して点灯する、イコライザープログラム。再生と同時に無線LANでどこかのサーバに視聴履歴を送付するプログラムなどなど。

最後に組み込むソフトウェアの開発と、その前のドライバー開発、最初のOSポーティング作業などをひっくるめて「組み込みソフトウェア開発」と呼ぶ。

x86系CPUの上で動いているOSの上で開発する一般的なPCプログラミングとの違いは多々あるけれど、全体を通して一人でやればかなり低いレイヤー(ハードウェアの電気電子的な要素)から自分のプログラムの制御下に置くことができるため、制約事項が少ないというのが大きな違いである。

これまで企業内の機密だったノウハウなどが多く、まだまだドキュメント類が少ないという特徴もある。逆に今いろいろと情報を出せる人は、注目される....かもしれない。

というわけで、株式会社Cerevoにて組み込みに限らずですが組み込み系の話題も多くなると思われる、「Cerevo tech blog」なる技術情報発信Blogを立ち上げました。私ではなく、Cerevoの技術陣があれやこれやの組み込み系・Web系技術情報を発信していくBlogとなる予定ですので、よろしければRSSリーダー登録などをお願いいたします。

http://tech.cerevo.com/blog/

*1:組み込み用x86もあるけどまぁここでは話しをややこしくするので省略

*2:PCM音源時代にドレミファもないもんだがwww