GAIO CLUB

2003年04月02日

組み込み開発にシミュレータは本当に役に立つのか?

GAIO CLUB 特集
GAIO CLUB【2003/4月号】
組み込み開発にシミュレータは本当に役に立つのか?

急成長を遂げる組み込み製品へ立ちこめる暗雲

デジタル家電製品の先駆けとして、確固たる地位を固めたのが言うまでもなく携帯電話です。当然、競争も激しく、短い開発期間で膨大なソフトを実装することに、ソフトウエア技術者は不眠不休の毎日を送られていると思います。

ここに立ちこめた暗雲が、2年程前に勃発した「携帯回収騒ぎ」。ネットワーク接続、JAVAなど新しい機能がソフトウエアによって実装されるようになっており、その複雑さは文字通り未知数となっています。

ソフト開発の現実と検証の不足

携帯電話に限らず、カーナビなど、1つの開発プロジェクトでのプログラマの数が200人を越えるのも当たり前となっています。その中で、「この機能は僕の担当じゃないからね。全然知らないよ。○○さんに聞いてよ。」と言うのを良く耳にします。1つのシステムは細分化されて、分担作業で開発されていることの弊害でしょう。果ては、開発マネージャーに「ここの機能のつながりは?」と聞いたところ、「僕は、構成は決めているけど、そんな細かいところまでは把握できないね。」と言われてしまいます。

自分の担当はよく分かっているが、同じプロジェクトの他の人の分担は全く知らず、マネージャでさえも、全体を通してその製品の動きを把握していない、と言うのが実状です。

動作検証に置いても、自分のパートは十分にデバッグできるが、他のパートとの連携に置いては、自分の責任外となってしまうのでしょうか?結局は、開発段階で十分な検証ができないまま、製品サンプルを作り、できあがったサンプルを人海戦術でバグだしすると言う、効率の悪い方法にならざるを得ません。

バグ出し部隊はバグを発見できるのか

最近、バグを多く抱えたまま出荷に追い込まれる根本的な原因は、開発体制、開発のやり方にあると、多くの方が口にするようになりました。(もっと早くから気付いてはいたのでしょうけれど。)

バグ出し部隊を100人揃えて、製品サンプルを前に、一斉にデバッグスタート!の様な方法で、果たして製品の不具合は発見できるのでしょうか?

ツールベンダーの立場で皆様へのヒアリングから感じることは、ソフトの動作検証が圧倒的に不足していると言うことだと思います。実装した機能に比べて、その検証工程が余りに原始的だと言うことです。ここには、根本的な原因があります。皆様の検証のほとんどは、ターゲットボード上、あるいは実際の製品の試作機の上で行われており、いくら人数をかけてデバッグしても、実際の機械では滅多におこらない現象が市場での不具合となってしまうと言うことです。

ソフトの実装では、正常動作よりも例外処理の実装量の方が多いとも言われています。製品開発の過程に置いて、この例外処理を如何に効率よく精度高く検証するかが、製品への「バグの実装量」を減らすことにつながります。

シミュレータは不具合を故意に起こす道具

PCのハード性能は日に日に上がっており(インテルさんに感謝)、組み込みシステムをシミュレータで動作させることも、現実的になっています。シミュレータは、システムの全てをソフトウエアで置き換えるものですから、実物ではあり得ないデバッグの方法も実現可能です。

その1つがデータの入出力にあります。例えばTCP/IPのプロトコルスタックをソフトで実装して、その動作を検証する場合、実際のボードでは、LANコネクタからNIC(ネットワークインタフェースコントローラ)を通じて、マイコンへデータが入ります。プロトコルスタックを検証するためには、NICのドライバを実装してこの石を動かさなければなりません。また、LANを流れるパケットは、専用のパケットジェネレータを別途用意して、ここからテストデータを入れてやる必要があります。これでは、開発システムが大がかりなばかりか、NICドライバのバグとの切り分けも必要になりますし、テストデータの作成も面倒です。
  • Windows上で動作するシミュレータを使った検証とは、実際のターゲットの代わりに、それと同じに振る舞うWindowsアプリを作って、その動きを検証すると言うことです。Windowsのアプリケーションですから、プロトコルスタックを検証したければ、PCのファイルに溜めたテストデータを直接プロトコルスタックに入れてやる細工だけで、データの入力が完了します。

    このように、周辺ハードの代わりを必要に応じてWindowsのソフトウエアにして、ちょっとした細工を加えるだけで、実機では滅多に起こらない事象を、システムに起こすことも容易に行えるのです。
  • シミュレータを使った検証とは

シミュレータの精度とスピード

シミュレータには「速度」と「精度」の要素があり、この2つはトレードオフの関係です。マイコンのシミュレーションにおいて、パイプライン処理、キャッシュ動作、マスタークロックへの同期動作など、実際のハードウエアに忠実にシミュレーションを行えば、その反面シミュレーションの速度は遅くなり、実際のハードの動きを簡略化してシミュレーションするほど、その速度は速くなります。

シミュレータを動かすPCの演算性能は有限ですから、精度も高いがスピードも速いと言った万能のシミュレータは、現時点では存在しません。

機能アプリの開発に向くネイティブ系シミュレータ

動作速度を優先して、組み込みシステム全体を対象にするシミュレータが、「ネイティブ系」と言われるものです。 これは、 C/C++でコーディングされた組み込みソフトをWindowsのコンパイラ(Microsoft .NETなど)を使ってコンパイルし、Pentiumで実行されるWindowsアプリケーションにして、そのソフトウエアの機能ロジックを動かすと言うものです。

これは、シミュレータが動作するPCにネイティブなコードで動作しますから、原理的に最も高速にシステムを動作させることができます。組み込みシステムの全体をPC上で丸ごと動かしてしまうことも可能です。ただし、実行されるコードはPentiumコードであり、実際の組み込みMPUとは異なりますから、MPUのアーキテクチャに依存している部分の検証は出来ません。

しかし、最近の組み込み機器は、ハードウエアに依存しないGUI部分や、ソフトウエアによる機能実装が多いため、「ネイティブ系」シミュレータを、組み込みアプリケーションのコーディングに使用することができます。携帯電話、カーナビ、デジタルカメラなどのアプリ開発に、適用される例が多くなっています。

ハードがらみの検証に向くISS系

「ISS系のシミュレータ」とは、ISS(インストラクションセットシミュレータ)をベースにした検証システムのことです。これは、ターゲットへの実装に使うのと同じクロスコンパイラを使用してC/C++、アセンブラのソースコードをコンパイルし、そのオブジェクトコードを解釈しながら実行するシミュレータです。

組み込みCPUが持つ独特のアーキテクチャ、レジスタ、メモリなど、実際のターゲットを想定してシミュレーションするため、精度の高い動作検証が行えます。

反面、前述のネイティブ系に比べて実行速度が遅く、システム全体を快適にデバッグする様な目的には適しません。デバイスドライバなど、ハードウエアの振る舞いやタイミングなどに焦点を当てた動作検証に使用されています。

目的に応じて使い分ければ役に立つツールとなる

組み込み開発へシミュレータを適用するには、得たい効果、目的を明確に設定し、それに合ったシミュレータを選択することがポイントです。

ICEと評価ボードを使わず、「アプリケーション」の開発に役立てたいと言うことなら「ネイティブ系」のシミュレータが適しますし、ハードでは再現困難な動作タイミングなど、ミクロな部分での検証精度を上げたいと言うことなら、ISS系のシミュレータを採用すべきでしょう。

シミュレータは、実機を作らない検証方法ですから、開発システムにかかるコストの削減にもつながります。 使い方を間違わなければ、皆様の開発に役立つツールとなります。
シミュレータ導入の目的

人気のコラム

最新のコラム