多くの組み込みアプリケーションでは、コードを非常に効率的にするか、特定のシステム構成からコードを分離して要件の変化の影響を受けないようにするかのトレードオフがあります。
両方の長所 (効率を損なうことなく柔軟性と再構成可能性) を実現するために、通常どのような種類の C コンストラクトを採用していますか?
時間があれば、私が話していることを正確に理解するために読んでください。
私がエアバッグ コントローラー用の組み込み SW を開発していたとき、特定の要件に関して顧客が気が変わるたびに、コードの一部を変更しなければならないという問題がありました。たとえば、エアバッグの展開をトリガーする条件とイベントの組み合わせは、開発中に数週間ごとに変更されました。そのコードを頻繁に変更するのは嫌でした。
当時、私は組み込みシステム カンファレンスに出席し、Stephen Mellor 氏による「変化する要件への対応」という素晴らしいプレゼンテーションを聞きました。ここで論文を読むことができます(サインアップする必要がありますが、無料です)。
これの主なアイデアは、コアの動作をコードに実装し、特定の詳細をデータの形式で構成することでした。データは簡単に変更できるものであり、EEPROM またはフラッシュの別のセクションでプログラムすることもできます。
このアイデアは、私たちの問題を解決するのに最適です。私はこれを同僚と共有し、すぐに SW モジュールの一部を作り直しました。
このアイデアをコーディングで使用しようとすると、実際の実装でいくつかの問題が発生しました。私たちのコード構成は、制約のある組み込みシステムにとって非常に重く複雑になりました。
これを説明するために、前述の例について詳しく説明します。入力の組み合わせがエアバッグの展開を必要とする状態にあるかどうかを判断するための多数の if ステートメントを使用する代わりに、テーブルの大きなテーブルに変更しました。いくつかの条件は自明ではなかったため、多くの関数ポインタを使用して、いくつかの条件を何らかの方法で解決する多くの小さなヘルパー関数を呼び出せるようにしました。いくつかのレベルの間接化があり、すべてが理解しにくくなりました。簡単に言うと、大量のメモリ、ランタイム、コードの複雑さを使用することになりました。物事のデバッグも簡単ではありませんでした。モジュールが重くなりすぎたので、上司は私たちにいくつかの変更を加えました (そして彼はおそらく正しかったでしょう!)。
PS: SO にも同様の質問がありますが、焦点が異なるようです。変化するビジネス要件を満たすために適応していますか?