組み込みソフト開発で必ず考えるべき制約事項
(リソース・スピード・リアルタイム性)

組み込みソフトを開発する際には、要求される品質と信頼性を確保するだけでなく、組み込みソフト特有の厳しい制約事項を理解しておく必要があります。

その制約とは「リソース」「スピード」「リアルタイム性」です。

組み込みソフトもパソコンやスマートフォンなどのアプリと同じプログラムとはいえ、開発時に考えておくべき前提条件がまったく異なります。その理由は、厳しい制約事項を踏まえたうえで、確実な動作が求められるからです。

組み込み開発特有のリソース制約(CPU・メモリ・電力)

組み込みソフト開発における「リソース」すなわち資源とは、ソフトウェアが作動するために必要な計算能力、記憶領域、電力などを意味しています。具体的にはCPUの処理能力、RAMやROMなどメモリの容量、データを保存するためのストレージ(外部記憶)、そして消費電力です。いずれもパソコンやスマートフォンなどと、組み込みソフトを使う機器を比べれば、その違いが明らかになります。

そもそも組み込み機器は基本的に、安価に大量生産するのが前提となっているため、可能な限りのコスト低減が求められます。特に家電製品や車載機器などでは小型化が求められ、消費電力もできるだけ抑えなければなりません。まさに1円単位でのコストダウンが競争力を左右しかねないため、過剰なスペックは許されず必要最小限のリソースで動作する設計が求められます。

限られたCPU、メモリ、消費電力に注意

組み込み機器で使われるCPUの動作周波数は、パソコンのそれに比べて低いため、高度で複雑な計算や処理はできません。パソコンが数GHzで動作するのに対して、組み込み機器では数百MHzから数十MHzと、桁違いに小さな演算能力での動作が求められます。

メモリについてもパソコンなら数GBが当然ですが、組み込み機器では数MBから極端な場合、数十KBレベルまで抑えられるケースもあります。さらに使える電力が限られているほか、HDDやSSDのようなデータ記憶装置がなくメモリも大きくないため、動作のログを大量保存できません。

これらの限られたリソースを使い切ってしまうと、パソコンなどでは想定できないトラブルを起こします。たとえばメモリ不足によるスタックオーバーフロー、データの受け皿が小さいためにバッファオーバーフローを起こすケースがあります。CPUの性能が低いため処理に時間がかかると、仕様で要求されている時間制約を守れないケースもあり、これが起きると、機器が仕様通りに動かなくなります。

消費電力をコントロールできないと、想定よりも早く電池が減ってしまうリスクもあります。いずれのトラブルが起きたときも、組み込まれた機器の方に何らかの問題が発生したと捉えられがちですが、実際にはソフトの設計に原因がある場合も多々あります。

厳しいリソース制約

安価なプロセッサと必要最小限のメモリのシステム構成を表すイメージ図

組み込み開発特有のスピード制約(応答速度・処理時間・周期)

組み込みソフトにおける「スピード」の制約とは、性能すなわちCPUの速さを意味するのではなく、「決められた時間内に必ず処理を終える」という締切りの厳守を意味しています。パソコンのソフトウェアでは「速ければ速いほどよい」とされますが、組み込みソフトでは「毎回必ず同じ時間で終了する」正確さが重視されます。

応答速度、処理時間、周期の正確さに注意

スピードを考えるうえで重要なのが次の3点、応答速度、処理時間、周期の正確さです。

応答速度については、スイッチが入った段階でどれだけ迅速に対応できるかが問われます。たとえば自動車のエアバッグのセンサが、衝撃を検知してからバッグを膨らませるまでのスピードは生命に関わります。処理時間では、一定時間内に処理できるデータ量が問われます。周期の正確さについては「0.01秒ごとに必ず処理をおこなう」など一定したスピードが求められます。
たとえばモータを滑らかに回すためには、毎回寸分違わず同じ間隔で命令を送る必要があります。なぜなら仮にわずかでも間隔がずれると、モーターの回転にムラが生じて振動や異音を起こしかねないからです。つまり、周期的に処理をおこなう場合は、その周期の間隔内で処理が完了する処理スピードが求められます。

パソコンのソフトウェアであれば、処理が少々遅れたとしても待てば済むだけの話です。ところが組み込み機器の場合は、処理の遅れは誤動作や機能不全につながります。そのため重要なのは、単純な処理の速さではなく、毎回決められた時間内に必ず処理を完結する正確さです。

考えるべき前提条件は、どんな処理をおこなうにしても必ず時間がかかること、どんな処理においても必ず締切りが存在することです。このようなスピード制約を軽視すると「たまに動作がカクつく」「条件が重なると誤動作する」「長時間動かすと問題が出る」などの不具合が起こりやすくなります。しかもこれらの不具合は常に発生するわけではなく、処理が間に合わなかったときだけ現れるため、原因の特定が難しい厄介な問題となります。

組み込み開発特有のリアルタイム性(ハード/ソフト)

スピードの制約とは関係がありながらも、基本的な考え方の異なるのがリアルタイム性です。リアルタイム性で問われるのは単なる処理の正確さや速さではなく、処理結果が「必ず正しいタイミングで出てくる」締切り厳守の体制です。

リアルタイム性が求められる理由は、基本的に、現実世界の他の機器や装置と直接つながっていることが多いためです。パソコンやスマートフォンのソフトウェアは主に人間が操作するインターフェースとして機能し、多少の遅延は許容されます。しかし組み込み機器は物理的なセンサーやアクチュエータと連動しており、物理法則に従って動く現実世界に対して、正確なタイミングで応答しなければなりません。したがってモータ制御やブレーキ制御、医療機器などでは、求められるタイミングでの出力が遅れた瞬間に故障を起こしたり事故につながったりします。いくら正しい処理が行われたとしても、それが求められるタイミングより遅れてしまっては意味がなくなってしまいます。

ハードリアルタイムとソフトリアルタイム、2種類のリアルタイム性

リアルタイム性は、その厳密さにより「ハードリアルタイム」と「ソフトリアルタイム」の2種類に分けられます。ハードリアルタイムとは、決められた応答時間に必ず間に合う、つまり応答時間に対して1ミリ秒の遅れも許されない世界であり、たとえば自動車のブレーキ制御や産業用ロボットの停止処理などがあります。いずれも遅れはただちに重大な事故につながります。一方のソフトリアルタイムは、たまに遅れたとしても致命的ではない品質低下で収まる世界であり、たとえば家電製品の液晶表示がカクつく程度で済まされます。とはいえ、製品の品質や使用感に悪影響を与えるため、遅延は可能な限り抑える必要があります。

リアルタイム性を確保するために考えるべきは、平均処理時間ではなく最悪の場合でも間に合うかどうかです。通常なら1ミリ秒で終わる処理だとしても、データが多い場合に10ミリ秒かかるとすれば、10ミリ秒を前提としてシステムを考える必要があります。また処理時間のバラツキを可能な限り小さく抑えて、同じ入力に対しては毎回同じタイミングで応答できる予測可能性が重要となります。

その際に「CPUを速くすれば問題解決する」あるいは「RTOS(リアルタイムOS)を使えばリアルタイム性が保証される」などと安易に考えるべきではありません。リアルタイム性はそれらのツールによって確保されるものではなく、タスクの分割や優先度の設定、処理時間の見積りなどの設計によって決まるものです。

リアルタイム性

非リアルタイムシステムとリアルタイムシステムの違いを表すイメージ図

組み込みソフトウェア開発に求められるのは制約と向き合う姿勢

組み込みソフトの開発では、リソース、スピード、リアルタイム性の3つの制約と常に向き合わなければなりません。限られたメモリ、CPU性能、電力の中で、常に決められた時間内で確実に処理を終え、毎回同じタイミングでの正確な動作が求められます。これらはパソコンやスマートフォンのソフトウェア開発の際の要求事項との大きな違いです。

パソコンやスマートフォンの開発では、「メモリが足りなければ増やせばいい」「処理が遅ければCPUを速くすればいい」という発想が通用します。しかし組み込み開発では、そうした選択肢はほとんどありません。与えられた制約の中で最大限の性能を引き出す、いわば「制約をデザインの一部として受け入れる」姿勢が求められます。

これらの制約を厳守するからこそ、安全で信頼性の高い機器を提供できるのです。自動車のブレーキが確実に作動し、医療機器が精緻に動作し、ほかにも生活を支える無数の電子機器が期待通りに動くのは、制約を理解したうえで緻密な設計と、その正しい動作を確認するテストが行われているからです。

そのためには最悪のケースを想定し、時間のコストを意識し、仕様通りに問題なく動かす意識が求められます。組み込み開発とは、制約との戦いではなく、制約を理解し、制約の中で仕様を満たすものを作る、とても創造的な営みです。

組み込みソフトの世界 トップへ戻る