組み込みシステム開発

組み込みシステム開発とは、今や日本の製造業に欠かせないものであり、組み込みエンジニアにとって会得しておきたい技術。
ここでは、組み込みシステムを作り上げるまでの開発の手順を、入門者にもわかりやすく解説していきます。

組み込みシステム開発

組み込みシステム開発の流れ

組み込みシステム開発の手順について、大まかな流れを説明しておきましょう。まずは、開発しようとする機器に必要な機能の抽出です。これが、いわゆる製品のスペックです。次に、ソフトウェアとハードウェアの洗い出しを伴うシステム設計、ハードウェア設計、ソフトウェア設計、実装、クロスデバッグを経て、最後に環境試験を行う、という工程です。それでは次項より、組み込み開発の流れについて基礎から見ていきましょう。

組み込みの特性を活かしたシステム開発を

開発の手順に入る前に、組み込みというものの特徴と、それが開発の際にどのように影響してくるのか、について触れておきます。
パソコン上で動作する業務ソフトウェアと比較すると、組み込み機器には大きな違いがあります。前者はハードウェアが「汎用的」であるのに対し、後者は「目的に特化」しているという点です。
当然、通常のパソコン上で動作する業務ソフトウェアの開発と、組み込み機器の開発の仕方は異なってきます。組み込み機器の開発者は、組み込みの持つ特徴に合った開発を行います。

パソコン上で動作するソフトウェアの開発の場合、例えばパソコンベースのハードウェアに、POSレジのようなソフトウェアを開発するとします。パソコンのような汎用的なシステムにはPOSレジに特化したハードウェア、例えばバーコードリーダーなどは存在しないため、追加しなければなりません。そこで、製造メーカーが提供する、バーコードリーダーとハードウェアを共に制御するソフトウェア(ドライバ)を利用します。すると、Windows、Linuxなど、パソコンにバーコードリーダーを接続するだけで動くようになります。バーコードリーダーをパソコンと接続し、適したドライバをパソコンに組み込むことで、実際に開発を行うエンジニア(ソフトウエア技術者)の作業がアプリケーション開発のみで済むわけです。
では、組込み開発はどうでしょう。組み込み機器の開発では、ハードとソフトの両方を開発することがほとんどです。というのも組み込みは、機器の用途に特化したハードウェアが既存製品として存在するケースがほとんどないからです。

以降では、主に組み込み開発の流れについて、組み込み開発の入門者にもわかりやすいよう基礎から説明します。

具体的な組み込みシステム開発のステップ

いよいよ、組み込みシステムを開発するための具体的な手順について解説に入ります。

組み込み機器に必要な機能の抽出

白物家電に代表される洗濯機をはじめ、カメラ、PC、携帯、スマートフォン、プリンタ、自動車、カーナビ、その他多くのコンピュータなど、どのような製品開発にも言えることですが、まずは開発する機器の製品スペックを決定します。これが「必要な機能の抽出」です。
例えばDVDレコーダーの機能を考えてみましょう。テレビと接続され、テレビからの信号を受信してハードディスクに保存するのがメインの機能になるでしょう。テレビ映像を保存するときには、ハードディスクの容量を節約するために圧縮する機能、ダブルチャンネル録画の機能も考慮するでしょう。そのほか、動画編集や出力、圧縮された動画を適切に映像化する機能も欲しいところです。また、早送りや巻き戻し、倍速再生、一時停止、レジューム再生といった再生制御も必要かもしれません。最近では、ハードに保存した映像をスマートフォン、タブレット、USBメモリに転送するといった、他のシステムとの連携機能も増えています。

このように、あらかじめ機器に搭載したい機能を挙げていくところから開発はスタートします。そして、これらの機能を実現するために行うのが、次のシステム設計です。

システムの設計

システム設計のフェーズでは、まず必要となるソフトウェア、ハードウェアの洗い出しを行います。 では、DVDレコーダーに必要なハードウェアにはどのようなものがあるでしょう。外部とのインタフェースとしては、テレビ、ハードディスク、スマートフォン、タブレット、USBメモリーと接続することになります。テレビと接続する端子は、今の主流であるHDMI端子での接続とします。ハードディスクとの接続には、SATA端子を利用するのが一般的でしょう。スマートフォン、タブレットとの接続には無線LANが考えられます。
次に、組込みソフトウェアが動作するために重要となる組込みOS、組み込みOSが動作するために重要となるCPUを決定します(組込OSに関しては、組込OSのコラムで説明します)。DVDレコーダーには、再生の制御や保存している映像の制御を行うために、ユーザーインタフェースとしてメニュー画面が必要になります。メニュー画面を作りやすいOSとしては、Linux、Android、Windows(Windows Embedded CE、Windows Embedded Compact7)が挙げられますが、今回は組み込み機器への利用例が多く、ライセンス費が比較的安く済むLinuxを使うこととしましょう。
Linuxを使う場合には、CPUは500MHz程度の性能があれば問題ありません。ただしDVDレコーダーでは、Linux以上に処理能力を要する動画圧縮、動画伸張の処理が必要です。そのため、動画圧縮伸張機能が搭載されたCPU、「Linuxカーネル」を動かせる512MbyteのRAMを搭載しましょう。

このように、ハードウェアの構成、ソフトウェアの構成がある程度決まると、それぞれの設計、実装に入っていきます。

ハードウェア設計

ここからは、ハードウェアの設計になります。システム設計の段階で基本設計は決定していますから、次はUSBホスト、HDMI(デジタル映像・音声入出力インターフェース規格)、SATA(シリアルATA)を利用するためにどのような構成がいいか、という観点でハードウェアを選定しましょう。 昔のCPUは、単なる演算・計算をするだけのものでしたが、最近のCPUは演算装置以外に、よく使われる機能(USBなど)をCPUの内部に搭載しているものも数多くあります。 これを利用することで、部品数が最小限に抑えられます。ハードウェアを選定するにあたり、部品数を少なくすることは非常に大きなメリットがあります。基板の面積も小さくなり、接続する数も減ります。そして何より、消費電力が減る場合が多いのです。組み込み業界でも例に漏れず、2つ買うより1つにまとまったものを買うほうが価格が低いということです。
というわけで、今回は複数の機能を搭載したCPUを利用しましょう。CPUといえば、多くのシェアを誇るIntel(インテル)社、AMD(エーエムディー)社などが思い浮かびますが、組み込み機器向けのメーカーは多種多様です。ハードウェア技術者は各社を比較し、相談しながら決める場合が多いかと思います。SATA、HDMIといった、CPUメーカーに利用実績のあるものを聞くケースもありますし、部品メーカーに詳細を確認して決定したりします。
このようにして選定が終わると、部品同士を接続するための電子回路図の作成、基板へのレイアウトなどを行っていきます。

ソフトウェア設計

次のプロセスは、ソフトウエア設計です。これまでの工程でハードウェア構成、基本OSにLinuxを使用、というところまで決定しているので、まずソフトウェア技術者が行うのは、同じLinuxでも、ベンダーが提供するメーカーサポートのあるLinuxを採用するか、kernel.orgにあるLinuxを採用するかの選択です。多くの場合、メーカーサポートを重視し、ベンダーが提供するLinuxを採用します。
Linuxが決まれば、次はHDMIやSATAなどのハードウェアを管理制御する、ソフトウェアの最下層で動作するドライバーの開発です。パソコン上のシステム構築やソフトウエア開発では、ドライバは提供されるものであり開発対象にはなりません。しかし、組み込みシステム(エンベデッドシステム)の場合、ハードウェアが独自の構成となっていることが多いため、ドライバも自分たちのハードウェアに合った形で開発する必要があるのです。その際、HDMI、SATAなどのチップメーカーから提供されたドライバを自分たちの環境に合わせてフィッティングすることもあれば、チップの仕様が記載された資料(データシート)に則って新規にドライバを開発することもあります。ともあれ、多くの場合にはドライバの開発が必要です。組み込みソフトウェアのエンジニアは、ハードウェアの知識や理解がなければソフトウェアを組むことができません。

ここまでに、ドライバの構成、API(アプリケーションプログラミングインタフェース)といったものが決定しているので、次はこれらを用いたアプリケーション、ミドルウェアの開発です。
組み込み開発におけるミドルウェア開発、アプリケーションソフト開発は、基本的にはWindowsでWindowsAPIを利用しながらの開発と似ています。WindowsAPIの代わりに自分たちで設計したドライバ、今回はLinuxなので、Linuxシステムコールを利用しながらプログラムを開発します。
このプログラムを開発する際に、一点注意があります。基本、一般的に利用されるパソコンはプログラムが動くためのメモリー領域を豊富に持っていますが、組み込み機器の場合には必要最低限のメモリーしか搭載していないため、プログラムを組む際にはメモリーを節約しながらプログラムしていく必要があります。メモリーの容量を気にしながら、用途を明確にして計画的に使っていく必要があるわけです。

さあ、ソフトウェア設計、ハードウェア設計まで完了しました。次は、設計した通りに実装を進めていきます。

実装

組み込み開発のハードウェア設計では、回路図をベースに基板の製作、部品の実装を行います。一方、ソフトウェア設計ではプログラムの関数の実装を進めていきます。実装が完了すると、部品が搭載された基板が完成します。この時点で適切な接続がなされているかの確認を行い、基板に電源を入れることになります。
ただ、ソフトウェアの方は基板、CPUが存在しない中でのプログラミングですから、この段階では実際にプログラムを動かす事ができません。プログラムを動かすためにハードウェアを模したスタブを準備して開発する場合もあれば、利用している統合開発環境にシミュレータモード(基板なしでもハードウェアをシミュレーションしてくれるモード)を使ったり、自分たちが開発する基板に似た基板を活用したりします。ソフトウェア技術者たちは、基板が出来上がるまでになるべく多くのプログラムの動作が確認できるように、様々に工夫した形で作業を行っているのです。

クロスデバッグ

いよいよ本番の基板に本物のソフトウェアを組み込んで評価を行うこととなります。プログラムはWindowsパソコンで作っていますが、プログラムを動かすのは今回開発した基板の上になりますので、ソフトウェアを基板に流し込んで実行します。パソコンからプログラムを基板に流し込み、流し込んだプログラムのデバッグを行うのにICE(マイコン基板を開発する際に使うデバッガ)、J-TAGを利用します。すると、ワイヤレスで基板上に搭載されたCPUを制御し、組み込んだプログラムを1行ずつ実行できるようになります。実行した結果をパソコン上に表示する事でデバッグを行います。この段階で基板上に搭載されたメモリーやHDMIやSATAなどのチップが正しく接続されているかのアクセス確認を行います。

こういった、クロス環境によるデバッグは組込みシステム開発ならではのものです。Windows上でのソフトウェア開発、業務システム設計とは違い、変数の値が参照できなかったり、ハードウェアの動作タイミングの影響を受けたりと、バグ発見作業が大変難しいのですが、それが逆に組込開発の醍醐味でもあり、技術者の組み込み機器開発への挑戦意欲を奮い立たせてくれるのです。
クロスデバッグが完了すると、Windows上でのソフトウェア開発と同様にリリースモードでソフトウェアをコンパイルし、基板上のプログラム領域に焼きこんで動作させることになります。Windows上のソフトウェア開発でもそうですが、この段階になるとデバッグができなくなるので、エラーが発生した場合などにログを保存するような仕組みを使うなどします。

環境試験

最後に、製品としての品質を確認するために環境試験を実施します。単純な比較はできませんが、組み込み機器はその特性上、ノイズ、温度などの環境が良くない場所に設置されがちです。製造現場など工場の中に設置される機械、車のエンジンユニットに設置する機械などを思い浮かべてみてください。そのような環境の中でも正常に動作する必要があるため、環境試験は組み込み機器を開発する上でも重要な評価項目であり、プロジェクトの鍵を握っているといえるでしょう。

製造業に必要不可欠な組み込みシステム開発

組み込み機器がどのように作られているか、順を追って解説してきましたが、これでようやく組み込み機器製品が世の中(市場)に出回ることになります。組み込み開発は、自動車専用に開発された車載ソフトなど、組み込み機器の用途が特化しているだけになかなか目につきにくかったり、動きが地味なものだったりと、ITシステム系のアプリケーションやゲームコンテンツ開発などと比較すると地味に見えるかもしれません。ですが、今までも、そしてこれからも、日本の製造業を支える縁の下の力持ちとして組み込み機器の開発は欠かせないものといえるのです。