連載
» 2007年04月26日 00時00分 公開

組み込みギョーカイの常識・非常識(9):組み込みソフトに要求されるものとは

MPUやメモリの性能、動作時間、コストなどで条件が制限される中、要求される性能を実現するのが組み込みのプロだ

[中根 隆康 フリー・アーキテクト/(株)ネクスト・ディメンション,@IT MONOist]

 今回は前回からの続きで、組み込みソフトウェアに要求されるものについて書いてみたいと思います。

 一般にソフトウェアの開発に求められるものは、生産性、信頼性、可用性、再利用性、拡張性、移植性、保守性だといわれます。組み込みソフトウェアでも同じですが特に信頼性、保守性は非常に重要な項目です。さらに組み込みソフトウェアで「安全性」という項目が最近特に重要視されるようになってきています。

 あるところで、「エンタープライズソフトは、サービス・運用を考えて『何を作るか?』に時間をかけていて、組み込みソフトは製品の一部なので『どう作るか?』に時間をかけている」というのを聞いたことがあります。

 確かに、小さな組み込みシステムのソフトウェアでは、そのようなこともあるとは思いますが、すべての組み込みシステムがそうではありません。工場やプラントの制御を行うシステムでは「どう作るか?」ではなく運用方法が重要になり、「何を作るか?」の方に時間をかけています。ほかのシステム(ほかの制御装置)と連携して動作するわけですから、システム全体の運用に耐えられるハードウェア、ソフトウェアが要求されることになります。

 ここで最も重要視されるのが安全性だといわれていますが、これまではこの安全性をどう確保するかの基準が明確になっていなかったようです。

 最近になって「機能安全:Function Safety」という言葉がよく聞かれるようになりました。特に自動車業界では、この機能安全を確保するために、MISRA-SA(The Motor Industry Software Reliability Association Safety Analysis:安全性解析)を適用する方向で進んでいます。

 MISRA-SAとは、システム全体の基本設計時点から、システムや環境をモデル化して、潜んでいるリスクをすべて抽出、分類します。そのリスクに対して、安全機能とは何かを決めます。その安全機能を満足するための要求を基に保守計画や安全妥当性確認計画と並行して実装(システム設計、コンポーネント設計、モジュール設計も含む)を開始します。「安全をメインに考えてソフトウェア開発のプロセスを踏んでいきなさい」ということですね。

組み込みソフトウェアの特徴

 少々話が大きくなってしまいましたので、組み込みソフトウェアに要求される仕様について、もう少し細かい話をしましょう。

 組み込みソフトウェアの特徴を考えてみると、以下のようなものが挙げられます。

  1. 限られたメモリ容量、メモリ性能で動作しなければならない
  2. 限られたMPU性能で動作しなければならない
  3. 決められた時間内で動作しなければならない
  4. 決められた時間に動作しなければならない
  5. リアルタイムで動作しなければならない
  6. ハードウェアに依存する部分が多い
  7. OSレスのものもある
  8. スタートアッププログラムが必要(PCのBIOS(Basic Inpu/Output System)に相当するもの)
  9. 過酷な環境で動作するものもある
  10. 自己診断機能(Diagnosis、Diagnostic)を持つ
  11. あり得ないエラーでもエラー処理を行う(想定外を想定する)
  12. 除算(割り算)を使わない(割り算は時間がかかって使えない)
  13. 汎用ライブラリを極力使わない(ライブラリがないこともある)
  14. 終わらないプログラム
  15. mainのないプログラムもある
  16. volatile宣言を多用する
  17. ポインタ変数を多用する

 ほかにもいろいろ考えられますが、制限された環境の中でコンパクトに作られ、正確に動作して頑丈であることが要求されるといえます。

 パソコン系のプログラマの人たちにはピンと来ない項目が多いと思いますので、限られたMPU(CPU)性能、限られたメモリ性能で決められた時間内、時間に動作するとはどういうことかを見てみましょう。ここでいうMPU性能はMPUの動作スピードで、メモリ性能はメモリのアクセススピードとします。

 例えば次のようなMPU、フラッシュメモリで動作する組み込みシステムがあったとします。

MPUとフラッシュメモリで動作する組み込みシステム図 図1 MPUとフラッシュメモリで動作する組み込みシステム図

 プログラムはフラッシュメモリに入っていて、MPUが順次読み出して実行するものとします。

 MPUの動作スピードが480MIPS(Million Instruction Per Second)ですので1秒間に480×100万=4億8000万回の命令が実行できるはずですが、実際は動作周波数が200MHzです。1回の動作周波数(クロック)で命令を読んでくることができたとしても1秒間に200×100万=2億個の命令しか実行できないことになります。

 どうして480MIPSの性能が出せるのかといいますと、スーパースカラ(Superscalar:同時命令実行)やパイプライン処理を使っているために、見た目の性能がこのような値になるわけです。スーパースカラやパイプライン処理の詳しい説明はここではしませんので、興味があったら調べてみてください。

 少々、本筋から脱線してしまいましたので話を戻しましょう。

 さて、1秒間に2億個の命令を持ってきて動作するのですが、果たしてそれは可能でしょうか。

 フラッシュメモリの読み出しスピードは70ns(ナノ秒)となっていますので、1クロックで1命令を読んでくることができるとして、1命令を読み出してくるのに70÷1000÷1000÷1000で0.00000007秒かかることになります。

 MPU側が200MHzで動作するということは、1クロックが1÷200÷1000÷1000で0.000000005秒(5ns)なので、70÷5で14です。なんとMPU側は14クロック待っていないと命令が入ってこないということになってしまいます。1秒間に2億個の命令を実行するなど、とうていできそうもない計算になってしまいますね(実際にはMPUの外部バスにメモリを接続した場合、さらに数クロック待たなくてはならないのが普通ですので、さらに遅くなります)。

フラッシュメモリからMPUに転送 図2 フラッシュメモリからMPUに転送/フラッシュメモリは1命令を70nsで読み出し、MPUは5nsで動作する。よって、MPUで1命令処理するのに14クロック待つことになる

 これが、「限られたメモリ性能で動作しなければならない」という意味です。

 実際はこのくらいの性能を持っているMPUはキャッシュメモリ(cache memory)を持っていて、そこに命令やデータをためてから動くようになっていますので、毎回14クロックも待つことはありません。しかしキャッシュメモリの中に必要な命令がなくなった場合(キャッシュミスヒットといいます)は相当の時間、待たされることになります。キャッシュミスヒットは予測するのが難しいため、それが起きた場合に処理が止まっては困るようなシステムではMPUがキャッシュメモリを持っていても、あえて、キャッシュメモリを使わないことも結構あります。

 このケースでは、フラッシュメモリの性能がMPUの性能に追い付いていないので、こうなりましたが、この逆のケースもあり、メモリの性能が高いのにMPUがそのメモリを効率よく使えないということもあります。メモリの性能とMPUとのバランスを考えたハードウェアを設計しないといけないということですね。

時間で制御する

 次に、「決められた時間内、時間に限られたMPU性能で動作する」ですが、例題では「50Hzの交流電圧を測定する」としています。かなりいいかげんな仕様ですね。50Hzの交流では1秒間に50回振動しますから、0.02秒(20ms)に1回波が来ることになります。

 この1回の波(20ms間)で何点測定するかで、「決められた時間」が決まってきます。これが決まると、おのずと「決められた時間内」も決まってきます。

 仮に100点測定するとしたら、20ms÷100で0.2ms(200マイクロ秒(μs))に1回測定することになります。200μsに1回というのが「決められた時間」、200μs(最大)というのが「決められた時間内」になりますね。

 メモリ性能は考えないものとしてMPUが200MHzで動きますから、200μsの間には200μs÷5nsで40000命令動かすことができることになりますので相当な処理が可能でしょう。

50Hzの波形のピッチ 図3 50Hzの波形のピッチ

コストを抑える

 では、値段が高く性能の高いMPUではなく、値段が安く性能が低いMPUにしなければならなくなった場合はどうでしょう。

 MPUが16MHzでしか動作しないとしたら、1命令が62.5nsかかります。なので、200μs÷62.5nsで3200命令となってしまいます。機械語で3200命令ですから、コンパイラの性能にもよりますが、C言語にしたら400ステップから500ステップくらいでしょうか。

 200μsをすべて使うわけにもいきませんから当然余裕を持たせて100μsで1回の測定を終わらせるとなると、半分の200ステップから250ステップの処理しか入れられないということになります。

 こうなってくると100点ではなく半分の50点測定にすることも考えなければならなくなりますが、それで性能が満足するかどうかの見極めも必要となります。これが「限られたMPU性能で動作しなければならない」ということですね。

 「だったらケチらずに高い性能のMPUを使えばいいじゃないか」とおっしゃる方もいるかと思います。

 例えば16MHzのMPUが300円で買えるが、200MHzの方は2000円もするとしたらどうでしょう。そうすると、製品の出荷台数が1万台予想されたら(2000−300)×10000=1700万円も違ってくるのです。

 生産コストを抑えるために、組み込みシステムのエンジニアはできるだけスピードの遅いMPUや小さなメモリ、遅いメモリを駆使して、何とか要求される性能を出そうと苦労しているのです。


 今回は少々長くなりましたが、組み込みソフトウェアはいろいろな制約のうえで動いていることを少しは理解していただけたでしょうか。

 なお、今回処理のスピードを求めるのに使った計算方法は、分かりやすくするために単純化してありますので、これがすべての場合で正しいとはいえません。MPUやメモリのデータシートをよく読んで理解したうえで計算してくださいね。

 ネタは尽きないのですが、次回はまとめをして、この連載もそろそろ終わりにしたいと思います。

 ご意見、ご要望などがありましたらできる限り取り込んでいきたいと思いますので、下記までメールをお送りください。(次回に続く)


Copyright © ITmedia, Inc. All Rights Reserved.