ファームウェア開発ガイド:エンジニアリング、プロセス、およびパートナー

デバイスは数ヶ月間問題なく動作します。その後、数千サイクルに1回、通信ウィンドウを逃し始めます。ログには明白なものは何も表示されません。3つの説明が残ります:スケジューラにおける優先度逆転、紙面上の見た目よりも厳しいタイミング予算、または十分な稼働時間後にのみ現れる遅いメモリリーク。3つのうちどれも確認されておらず、この種の一般的な問題としては普通のことです。長期間稼働する産業用HMIパネルの生産ラインでは、これはよくある障害の形状です。スタックトレースではなくパターンとして現れ、真の原因を見つけるには、まず可能性のあるものを除外する必要があります。

そのような調査は、ファームウェア開発における日常業務です。この分野は、産業用HMIパネル、PLCモジュール、センサーノードなど、ほぼすべての組み込み製品の基盤となります。オペレーティングシステムがないため、通常のアプリケーションコードよりも重要視されます。ファームウェアが間違ったことをすると、ハードウェアはそれに耐えなければなりません。このページでは、その作業のエンジニアリングの側面をカバーします。同様に重要なこととして、反対側の視点、つまりプロセス、用語、およびファームウェア開発会社を選択する前に尋ねる価値のある質問についても説明します。

はじめに

ファームウェア開発とは?

ファームウェアは、シリコンに最も近いソフトウェアレイヤーです。不揮発性メモリに存在し、マイクロコントローラ上で直接実行されます。アプリケーションソフトウェアとは異なり、一般的なオペレーティングシステムの上にはほとんど存在しません。メモリ管理、タイミング処理、および障害からの回復を独自に行います。データシートのすべてのレジスタは、単一のコード行が入力される前に実際に可能なことを決定する制約であり、提案ではありません。

現代組込みシステムにおけるファームウェアの重要な役割

あらゆる組込み製品は、意図と物理現象を橋渡しするためにファームウェアに依存しています。タッチパネルは、信号のデバウンスを正しく行うためにファームウェアを必要とします。モーターコントローラーは、機械設計で既に強制されていると想定されているトルクリミットを強制するためにファームウェアを必要とします。ファームウェアがこれを誤ると、その障害は見た目だけの問題ではありません。それは、フィールドで予期しない動作をするデバイスであり、パターンに気づかれるまで、時には数ヶ月にわたって問題が続くこともあります。

ファームウェア設計を形成する主要なエンジニアリング課題

3つの制約が、ほぼすべてのファームウェアの決定を形成します。それは、限られたリソース、リアルタイムのデッドライン、そして長いサービス寿命です。なぜこの3つが特に重要なのでしょうか?それらは相互に作用するからです。数백キロバイトのメモリしか持たないマイクロコントローラーは、サーバーのような余裕なしに、通信スタック、スケジューラー、そしてアプリケーションロジックを実行する必要があります。デッドラインは交渉の余地がほとんどありません。1つでも遅れれば、それは遅いのではなく、間違っているのです。そして、多くの産業用デバイスは10年以上展開されるため、元の作成者がいなくなってから長い時間が経過しても、コードはその作成者以外の誰にとっても意味のあるものでなければなりません。

エンジニアリング原則

リアルタイム制約と決定論的動作

リアルタイムとは、高速であることを意味するのではありません。それは、予測可能であることを意味します。同じ入力は、最悪の条件下で、同じ時間予算内で同じ応答を生成する必要があります。これは、割り込み優先度を慎重に制御し、割り込みサービスルーチンを短く保つことで達成され、非決定論的な操作はタイミングクリティカルなパスから外されます。明らかな解決策は、すべてをより速く実行することです。それは平均的なケースには役立ちます。しかし、フィールドで最悪のケースのバーストが発生したときに実際に問題となる最悪のケースについては何も語りません。その区別は、組込みファームウェア開発において絶えず現れます。平均ケースの数値は、フィールドで最悪ケースのバーストが発生するまで、すべて順調に見えるからです。

リソース管理:メモリ、電力、および処理予算

RAMの各バイトは、デフォルトではなく、決定事項です。ファームウェアでは、動的メモリ割り当てよりも静的メモリ割り当てが一般的に好まれます。なぜなら、断片化したヒープは予測不能に失敗し、多くの場合、それを引き起こしたコードが疑わしくなくなった後でさえ、問題が発生するからです。長寿命の産業用設計では、最初の見積もりよりも明らかに多くのフラッシュメモリを予算計上することが一般的であり、多くの場合、20〜30%のヘッドルームが確保されます。プロジェクトの途中でメモリが不足する事態は、 upfrontでわずかに大きな部品のコストを支払うよりもはるかに高価になります。電源予算も同様の論理に従います。イベント間に積極的にスリープする設計は、スリープせずに常時稼働する設計のエネルギー消費量のわずかな割合で済むことができます。ただし、これはウェイクアップパス自体が規律正しく管理されている場合に限ります。重要ではないと思われたウェイクアップルーチンが、節約された電力を静かに漏らしてしまう一般的な場所となります。

信頼性、耐障害性、およびフェールセーフ設計

ファームウェアは、フィールドでは必ず問題が発生するため、問題が発生することを想定する必要があります。ウォッチドッグタイマーは、防御の全体ではなく、最後の防衛線です。メインループが停止した場合にのみリセットされるシステムは、まだ動作しているもののスタックしたタスクを見逃す可能性があり、無駄にCPUを消費し続けます。レイヤード保護は、1つのメカニズムに依存するよりも効果的です。通信タイムアウトのローカルリカバリ、破損した設定のセーフデフォルト、およびリセット後の既知の良好な状態への復帰パスを文書化することは、原因にかかわらず、ほとんどの障害パスをカバーします。

システムアーキテクチャ

ファームウェアアーキテクチャパターン:ベアメタル、RTOS、およびLinuxベースのアプローチ

アーキテクチャの選択は、通常、製品が同時に管理する必要のある独立したタイミングドメインの数によって決まります。ベアメタルのスーパーループはシンプルでスケジューリングオーバーヘッドがないため、1つのジョブを実行するデバイスには適しています。RTOSは、製品が表示、通信スタック、およびどちらかを待つことができない制御ループなど、複数のタスクを同時に処理する必要がある場合に、そのオーバーヘッドに見合う価値があります。Linuxベースのアプローチは、決定論と引き換えに柔軟性をトレードオフしますが、そのトレードオフは、製品がハードリアルタイム保証よりもリッチなインターフェイスまたはネットワークスタックを必要とする場合に意味があります。

アプローチ最適な適合主なトレードオフ
ベアメタル単機能、コスト重視のデバイス機能追加による拡張の余地がほとんどない
RTOS複数の同時実行タイミングドメインフラッシュ/RAMフットプリントの増加、優先度管理のオーバーヘッド
LinuxベースリッチUI、ネットワーキング、リアルタイム性の要求が低いタイミング保証が弱く、リソースフットプリントが大きい

ハードウェア抽象化レイヤーとペリフェラルインターフェイス設計

ハードウェア抽象化レイヤーは、アプリケーションロジックが何をすべきかと、特定のチップがそれをどのように行うかを分離します。この分離は、サプライヤーが製造途中で部品を廃止した場合に、その恩恵を受けることができます。抽象化レイヤーだけを変更すればよく、その上に構築されたロジックを変更する必要はありません。コストは、関数呼び出しの多重化によるわずかなオーバーヘッドであり、呼び出しごとに数CPUサイクルの増加程度です。これは、すべてのサイクルがすでにジョブを持っている数少ないパスを除いて、どこでも受け入れる価値があります。

テスト性、保守性、スケーラビリティのためのモジュラーアーキテクチャ

ハードウェアアクセス、コアロジック、アプリケーションの動作を別個のレイヤーに分離したファームウェアコードベースは、全体としてだけでなく、個別にテストできます。なぜその分離が実際にはそれほど重要なのでしょうか?実際のハードウェアでファームウェアをエンドツーエンドでテストするのは時間がかかり、物理的なアクセスが必要になることがよくあります。クリーンな分離により、コアロジックは、シリコンに触れるずっと前に開発者のラップトップ上で実行、失敗、修正することができます。このような分離を早期にスキップすることは、急速に進化するプロジェクトでよく行われるショートカットであり、ハードウェアの改訂によって交換ではなく書き直しを余儀なくされた場合に、通常最初に再検討されることになります。

一般的なファームウェア開発スタック

ほとんどの組み込み製品は、単一目的のベアメタル設計を超えると、かなり認識しやすいレイヤードスタックに落ち着きます。アプリケーションロジックは最上位にあります。その下には、UIツールキット、ファイルシステム、プロトコルスタックなどの処理を行うミドルウェアレイヤーがあります。製品がRTOSを使用している場合、その下でRTOSがスケジューリングを提供します。RTOSの下にはハードウェア抽象化レイヤーがあり、その下にはベンダー提供のペリフェラLDライバーがあり、最下部にはマイクロコントローラー自体があります。各レイヤーは、おそらく変更される可能性のある詳細(今日はチップ、明日はRTOS、来年はUIフレームワーク)から、その上のレイヤーを分離するために存在します。

実装ガイド

ファームウェア開発ライフサイクル:要件定義からリリースまで

ファームウェアは、要件定義、ハードウェアの起動、アーキテクチャ設計、実装、検証を経て進みます。純粋なソフトウェアとは異なり、ハードウェアの可用性がペースを決定します。初期の作業は、最終的な量産ハードウェアと完全に一致しない評価ボード上で行われることがよくあります。ロジックには十分ですが、電力動作や信号インテグリティには十分ではありません。この2つの間のギャップに、最終段階での予期せぬ問題が発生しがちです。

ブートローダー設計、セキュアアップデート、およびフィールドでの再プログラム可能性

ブートローダーは、最初から正しくなければなりません。アップデートが失敗した場合に、他のすべてを回復するコードです。新しいイメージがアクティブになる前に検証されるデュアルバンクレイアウトにより、デバイスはブリック(文鎮化)する代わりに自動的にフォールバックできます。署名検証により、リスクのもう半分が閉じられます。これがないと、アップデートチャネルはメンテナンスツールではなく、攻撃対象領域になってしまいます。フィールドにおけるブートローダーの問題の多くは、検証ロジック自体に起因するのではなく、パーティションサイズが変更された後に静かに現実と合わなくなったフラッシュレイアウトの仮定に起因しています。

テスト戦略:単体テスト、統合テスト、HIL、および生産検証

単体テストは、ハードウェアが登場する前に、ホストマシン上でロジックエラーを迅速かつ安価に検出します。統合テストは、モジュールが正しく連携することを確認します。ハードウェア・イン・ザ・ループ(HIL)テストは、ファームウェアが現実(実際のタイミング、実際の電気的ノイズ、実際のセンサー動作)に近いものに適合する場所です。このテストは通常、最初の2つのレイヤーでは構造的に検出できないバグのカテゴリを検出します。なぜなら、そのバグは実際のタイミングと実際のノイズが存在する場合にのみ発生するからです。バッテリー駆動のセンサーノードや産業用HMI製品と同様に、HILは通常、設計の実際の最悪ケースの動作が初めて発見される場所です。

リソース制約のある環境でのデバッグとオブザーバビリティ

フィールドでのファームウェアデバッグは、デスクトップ開発者が当然のように利用できるツールなしで作業することを意味します。ディスク上にコアダンプはありません。クラッシュログ用の予約済みフラッシュ領域と、軽量トレーシング用のデバッグUARTが基本的な機能を提供します。JTAGまたはSWD接続は、ベンチでのステップスルーデバッグを処理し、ロジックアナライザまたはオシロスコープは、タイミングに関連するあらゆるものをカバーします。利用可能な観測手段が、適切なタイミングでトグルされ、スコープで読み取られる単一のGPIOピンしかない場合もあります。どれも洗練されているわけではありません。他に何も利用できない場合に、すべてが機能します。

ベストプラクティス

コーディング標準、コードレビュー、および静的解析

MISRA Cのようなコーディング標準は、それ自体がエンジニアを遅くするためではなく、間違いのカテゴリ全体を未然に防ぐために存在します。静的解析ツールは、これらの多くを自動的に検出します。しかし、レビューは依然として重要です。人間が読むことによって、コンパイルがクリーンであるだけでなく、割り込みハンドラが実際に想定されるほど短いかどうかを尋ねることができます。

本番稼働準備:故障モード解析、リカバリ、および堅牢化

設計が出荷される前に、この変数が破損した場合、またはこのセンサーが通常の範囲外の値​​を返した場合、何が起こるかを意図的に尋ねる価値があります。そのような故障モード解析は、地味な作業です。誰もテストを想定していなかった方法で製品が失敗するのを防ぐのは、まさにそのような作業です。温度、振動、電気的ノイズに対する堅牢化は同じ論理に従います。実験室よりも環境がデバイスに対して厳しくなると想定してください。

CI/CD、自動テストパイプライン、およびファームウェアの回帰防止

すべてのコミットで静的解析と単体テストを実行するファームウェアビルドパイプラインは、まだ修正が容易なうちに回帰を検出します。バージョン管理の規律は、パイプライン自体と同じくらい重要です。明確なブランチモデル、特定のハードウェアリビジョンにリンクされたタグ付きリリース、およびロックされたツールチェーンバージョンにより、数か月後に、実際にフィールドにあるソースから出荷された正確なバイナリを再現することが可能になります。その規律なしでは、本番環境のデバイスからのバグレポートは、どのビルドが実行されているかを特定するためだけの小さな調査になる可能性があります。

本番グレードのファームウェア展開のためのセキュリティ強化

セキュリティは、リリース直前に追加されるレイヤーではなく、最初からアーキテクチャに組み込まれる必要があります。セキュアブート、暗号化された通信、最小限の攻撃対象領域はすべて、処理時間、電力、複雑さにおいて何らかのコストを伴います。まさにそのために、スケジュール圧力の下でセキュリティが後回しにされがちです。そうあるべきではありません。脆弱なアップデートメカニズムを備えた接続デバイスは、もはやメンテナンスのリスクではありません。それはシリアル番号付きの負債です。

通信プロトコルとデバッグツール

ファームウェアは外部世界から独立して機能することはめったにありません。プロトコルの選択は、その周りのアーキテクチャの驚くべき部分を形作ります。UARTは、単純なポイントツーポイントリンクと起動デバッグのデフォルトとして依然として使用されています。CANとRS-485は、複数のノードがバスを共有し、電気的ノイズが日常茶飯事である産業および自動車環境で支配的です。イーサネットとUSBは、決定論的なタイミングよりも高帯域幅またはプラグアンドプレイ接続性が重要な場合に登場します。間違ったものを選択しても、プロトタイプが壊れることはめったにありません。バスが、当初のベンチテストが生成したものよりも多くのトラフィックでロードされた後に現れます。

ツール側では、JTAGとSWDは、起動中のブレークポイントとレジスタ検査に必要な低レベルアクセスを提供します。ロジックアナライザは、CANフレームが期待どおりに到着しているかどうかなど、プロトコルレベルのタイミングの問題でその価値を発揮します。オシロスコープは、電圧グリッチ、クロックジッター、理論上はクリーンに見えても実際のボード上ではノイズが多い信号など、電気的な問題に対するより良いツールです。

ファームウェア開発プロセス:期待されること

要件から展開までのステージ

ファームウェアプロジェクトは通常、要件と実現可能性、ハードウェア起動、アーキテクチャとインターフェース設計、実装、リリース前の検証の5つの可視ステージを経て進行します。通常のソフトウェアプロジェクトとの違いは、2番目のステージです。レジスタマップとタイミングの動作はそれまで完全にはわかっていないため、ファームウェアは、ハードウェアが何らかの形で、たとえラフな評価ボードであっても存在しない限り、実際には開始できません。ハードウェアが利用可能になる前にファームウェアアーキテクチャを最終決定しようとするプロジェクトは、実際のボードが到着するとそのアーキテクチャを改訂する傾向があります。

タイムラインとリスク要因

ファームウェアのタイムラインに最も影響を与えるのは、ファームウェア作業開始時のハードウェアの安定性と、ハードウェア・イン・ザ・ループ(HIL)テストの開始時期です。ハードウェアとファームウェアを密接に連携させながら並行開発することで、ほとんどの予期せぬ問題は、まだ修正コストが低い早い段階で表面化します。このパターンは産業オートメーションプロジェクトでは十分に一般的であるため、経験豊富なチームは意図的にレビューチェックポイントを設けています。一方、ハードウェアとファームウェアを別々に開発すると、予期せぬ問題はリリース日に近い検証段階で表面化し、修正にかかるスケジュール時間が長くなりがちです。

ファームウェアと組み込みソフトウェア開発

両用語は重複が多く、しばしば互換的に使用され、日常会話では通常問題ありません。技術的には、ファームウェアとは、オペレーティングシステムなしで、ハードウェアに最も近い場所で実行される低レベルコードを指します。組み込みソフトウェアはより広範なカテゴリであり、ファームウェアを含みますが、組み込みLinuxシステム、ミドルウェア層、またはRTOS上で動作するUIフレームワークで実行されるアプリケーションレベルのコードもカバーします。

側面ファームウェア組み込みソフトウェア(広範)
代表的なレイヤーシリコンに最も近く、レジスタレベルアプリケーションとUIレイヤーを含むことができる
OS依存性多くの場合なし、または軽量RTOSLinuxまたはフルOSで実行されることが多い
更新頻度まれ、変更リスクが高い従来のソフトウェアのように更新可能

実際には、プロジェクトのスコープを決定する際に、この区別が最も重要になります。ファームウェア開発会社が「ファームウェア」作業の見積もりを行う場合、UIとネットワーキングレイヤーを含むのか、それともそれらの下にある低レベルの制御コードのみを含むのかを明確にする必要があります。

言語、ツール、マイクロコントローラープラットフォームの選択

プログラミング言語:C、C++、およびRustの位置づけ

Cは、予測可能なメモリモデルと、ほぼすべてのマイクロコントローラーベンダーにわたる成熟したツールチェーンにより、ファームウェアエンジニアリングのデフォルトであり続けています。C++は、制御をほとんど失うことなく、クラスやテンプレートなどの便利な抽象化を追加し、その制約されたサブセットは本番ファームウェアで一般的です。Rustは、メモリ安全性保証の点で勢いを増しています。ただし、ツールチェーンとベンダーサポートは、人気のあるチップファミリのサブセット以外ではまだ一貫性がなく、これが産業用ファームウェアでの採用が即時ではなく段階的に進んでいる主な理由です。

ツールチェーンと開発環境

ツールチェーンの選択は、コンパイラだけにとどまりません。デバッガー、フラッシュツール、ベンダーのハードウェア抽象化ライブラリがどれだけうまく維持されているかが含まれます。GCCのようなオープンツールチェーン上に構築されたベンダー固有のIDEは一般的です。これらは、日常のコーディングよりも、静的解析やCIとの連携の度合いにおいて重要です。その連携こそが、数年ではなく数年で、コードベースが管理可能であり続ける要因となります。

マイクロコントローラープラットフォームの選択

チップの選択は、利用可能な最高のクロック速度ではなく、リソースヘッドルームを製品の実際のタイミングドメインに合わせることになります。フラッシュとRAMに十分な余裕のある部品は、単価が少し高くなりますが、プロジェクトの途中で容量不足になるというはるかに高価な問題を回避できます。ベンダーからの長期的な入手可能性は、特にサービス寿命が数年ではなく数ヶ月で測定される製品サイクルを持つ産業用製品にとって、生の仕様と同じくらい重要です。

コアスペックと同等に、周辺機能の適合性も吟味する必要があります。UART や ADC チャンネルを削減してコストを節約した部品は、設計が固まった後に、結局それらのチャンネルが必要になった場合に、面倒な回避策を強いられる可能性があります。チップファミリーを取り巻くエコシステム(リファレンスデザイン、コミュニティサポート、積極的にメンテナンスされている抽象化ライブラリなど)は、わずかに高速なコアクロックよりも、開発時間を短縮することが多いです。

ファームウェア開発が使用される分野

制約は変化しますが、分野を問わず、その規律は似ています。産業用 HMI パネルや PLC モジュールは、工場での長寿命と電気的ノイズへの耐性が必要です。医療機器は、通常の信頼性要求に加えて、厳格な検証とトレーサビリティ要件を追加します。エネルギーシステムや EV 充電機器は、リアルタイム制御と安全評価されたフォールトハンドリングを組み合わせています。コンシューマーおよび産業用 IoT デバイスは、多くが長期間バッテリーまたはエネルギーハーベスティングで動作するため、電力予算を最も重視します。ロボット工学およびモーション制御システムは、スペクトルのリアルタイム端に最も近く、デッドラインの遅延はソフトウェアの問題だけでなく、機械的なイベントとなります。

ファームウェア開発パートナーの選び方

評価基準

コードが書かれる前に、信頼できるパートナーとリスクのあるパートナーを分けるのに役立つ質問がいくつかあります。チームには、要件とテストに関する文書化されたプロセスがありますか、それとも、あるエンジニアの頭の中にある非公式な習慣に依存していますか?プロジェクトの途中でハードウェアの改訂が発生した場合、どのように対応するか説明できますか?早い段階で実際のハードウェアでテストしますか、それともハードウェア・イン・ザ・ループ・テストを終盤に追加するものとして扱いますか?他の質問よりも多くのことを明らかにする質問が 1 つあります。それは、見込みのあるパートナーに、最近のスケジュール遅延にどのように対処し、その後何を変更したかを尋ねることです。実際の納品経験を持つチームは、それに直接答えます。経験の少ないチームは、話をそらす傾向があります。

  • 文書化された開発プロセス(単なる非公式なエンジニアリング習慣ではない)
  • 早期かつ継続的なハードウェア・イン・ザ・ループ・テスト(終盤に延期するテストではない)
  • プロジェクト途中の要件やハードウェア変更に対応するための明確な計画
  • 最近のスケジュール遅延について、その結果何が変わったかを議論する意思
  • 対象業界の関連コンプライアンスおよび安全プラクティスに関する知識

経験豊富なチームと働く上での期待事項

構造化されたプロセスは、話される内容よりも、その過程で生み出されるものに現れます。トレーサブルな要件、特定のビルドに結び付けられたテスト記録、そしてリリース前に後付けするのではなく最初から設計されたブートローダーとアップデート戦略が、それの目に見える兆候です。そのような規律は、主に予期せぬ事態を吸収するにはまだ安価な早い段階に移動させることによって、配信リスクを軽減します。検証やフィールドに残すのではなく。STONE HMIは、オートメーションプロジェクト全体に構造化されたファームウェア開発プロセスを適用します。ファームウェア開発サービスを評価する購入者にとって、そのようなプロセスの整合性は、通常、個々のエンジニアのトラックレコードよりも成果の予測因子となります。

よくある質問

ファームウェア開発には通常どのくらいの時間がかかりますか?

ハードウェアの安定性によって大きく異なります。明確に定義された単一目的のデバイスが既知のハードウェア上で稼働する場合、数か月で完了する可能性があります。複数の通信プロトコル、カスタムUI、および並行して最終決定中のハードウェアを備えた製品は、主に各ハードウェア変更に伴うレビューおよび再検証サイクルのために、かなりの時間がかかります。

RTOSは必要ですか、それともベアメタルで十分ですか?

デバイスが、いくつかの単純なバックグラウンドタスクで1つのタイミングクリティカルなジョブを管理する場合、ベアメタルの方が通常はシンプルで保守コストも低くなります。複数の独立したタイミングドメインが同じプロセッサを競合するようになると、RTOSはその競合を場当たり的ではなく管理可能にすることで、そのオーバーヘッドに見合う価値を発揮します。

ファームウェアプロジェクトにおける最大の危険は何ですか?

立ち上げ時ではなく、検証時にタイミングまたはリソースの問題を発見することです。ほとんどすべての深刻なスケジュール遅延は、評価ボードでは機能したが、量産ハードウェアでは静かに機能しなくなったという仮定に起因します。

デバイス出荷後にファームウェアを更新できますか?

通常は可能です。そのため設計されたブートローダーを介して更新できますが、その更新の安全性は、特に署名検証とフォールバック動作に関する初期の決定に完全に依存します。セキュアな更新を設計せずに shipping したデバイスに後付けすることは可能ですが、最初から設計するよりもはるかに制約が大きくなります。

ファームウェアプロジェクトのコストを増減させる要因は何ですか?

タイミングおよび通信プロトコルの複雑さは、生のコード量よりも重要です。1つの制御ループと単純なディスプレイを持つデバイスは、複数のプロトコル、リッチなUI、および厳格な安全要件を同時に処理するデバイスよりも開発コストがはるかに低くなります。もう1つの主要なコストドライバーは、ハードウェアの問題がどれだけ遅れて検出されるかということです。立ち上げ時に見つかった問題は安価ですが、フィールド検証時に見つかった同じ問題はそうではありません。

エンジニアにとって、ファームウェア設計の真価が問われるのは、予期せぬ状況、つまりパケット破損、書き込み中の電源断、センサーからの異常値などが発生したときです。プロジェクトマネージャーにとっては、その計算は見た目よりも単純です。リリース前のレビューや検証に費やされなかった時間は消えません。それらは後工程に移動し、工程が進むごとにコストが増大していきます。

だからこそ、このページの冒頭のようなシナリオは、単一の劇的な原因にたどり着くことは稀なのです。実際には、スケジューラの問題やタイミング予算は、通常、存在する場合、早期のテストで表面化するため、最初に除外される傾向があります。排除を生き残ったものは、しばしば「遅い漏洩」です。つまり、数ヶ月の正常な動作の陰に隠れるほど忍耐強い障害モードです。産業用HMIの展開では、このような漏洩は通常、数週間の連続稼働で表面化し、ほとんどのベンチテストの期間をはるかに超えています。ファームウェアは、故障するまで誰も目にしない製品の一部です。最初から正しく構築し、長期間無人の稼働を想定して検証することが、依然としてより安価な選択肢なのです。