組み込みシステムを開発する際に従うべき「ワースト プラクティス」は何だと思いますか?
してはいけないことについての私の考えのいくつかは次のとおりです。
何をしてはいけないかについては、たくさんの良いアイデアがあると思います。それらを聞いてみましょう!
組み込みシステムを開発する際に従うべき「ワースト プラクティス」は何だと思いますか?
してはいけないことについての私の考えのいくつかは次のとおりです。
何をしてはいけないかについては、たくさんの良いアイデアがあると思います。それらを聞いてみましょう!
他にもたくさんありますが、それで始めましょう....
私が自分を傷つける前に、誰か私を止めてください。
ところで、これらのすべてが組み込み開発に厳密に固有のものであるとは限りませんが、組み込みの世界では少なくとも現実の世界と同じくらい重要であると私は信じています。
スケジュールを立てるときは、まずすべてがうまくいくと想定してください。
オシロスコープやロジック アナライザーを使用せずに、ボードの立ち上げに取り組みます。特に。スコープ、それは決して役に立ちません。
設計時に電源を考慮しないでください。熱、効率、ADC の読み取り値とシステム動作に対するリップルの影響、EMF 放射、起動時間などの問題は重要ではありません。
何をするにしても、リセット コントローラー (5 セントの IC タイプ) を使用しないでください。RC 回路を使用してください (できれば、多くの高周波 AC ノイズが結合された回路を使用してください)。
ビッグバンを受け入れる!!! 小さな部分を段階的に開発して頻繁に統合しないでください、愚かな愚か者!!! 同僚と一緒に何ヶ月もコードを書いて、大規模なトレードショーのデモの前夜にすべてをまとめてください!
デバッグ / トレース ステートメントを使用してコードをインストルメント化しないでください。視認性が悪い。
ISR で多くのことを行います。バブル ソート、データベース クエリなど...ねえ、誰もあなたの邪魔をしない可能性があります。
設計でボード レイアウトを無視します。これらの整合インピーダンス トレースと高電流、高周波数電源でオートルーターを街に出しましょう。ねえ、パートナー、心配するもっと重要なことがある!!!
真新しい、ベータ版、未リリース、アーリー アダプター シリコンを使用してください。特に、安全性が重要 (航空、医療) または大量生産 (100 万ユニットを思い出すのは楽しい) の場合は注意が必要です。4 コア、300 MHz、7 ステージのパイプライン チップで新しいシリコン サンプリングがあるのに、なぜベガスに行くのでしょうか?
OKラウンド2....あと少し:
ウォッチドッグ タイマーを使用しないでください (特に組み込みのタイマー!)。
スケーリングされた整数演算で十分な場合は、浮動小数点型とルーチンを使用します
保証されていない場合は RTOS を使用する
本当に理にかなっている場合は RTOS を使用しないでください
内部で何が起こっているのかを理解するために、生成されたアセンブリ コードを見ないでください。
フィールドで更新できないようにファームウェアを書き込む
あなたが行っている仮定を文書化しないでください
テスト/デバッグ中に何かおかしなことが発生した場合は、それが再び発生するまで無視してください。おそらく、電圧低下、割り込みの失敗、スタック破損の兆候、またはその他の一時的かつ断続的な問題のような重要なものではありませんでした
スタックのサイズを決めるときの最善の哲学は、「小さく始めて、プログラムがクラッシュしなくなるまで増やし続ければ、おそらく大丈夫だろう」ということです。
Micrium の uC/Probe のようなランタイム プロファイリング ツールを利用しないでください (他にもあるはずです)。
メイン アプリを実行する前に、ハードウェアのパワーオン セルフ テストを含めないでください。ブート コードが実行されています。何が機能していない可能性がありますか?
実装しない RAM テストを POST (上記) に含めないでください。
ターゲット プロセッサに MMU が搭載されている場合は、念のため、その恐ろしい MMU を使用しないでください!!! 特に、コード空間への書き込み、データ空間からの実行などから保護させないでください....
テスト、デバッグ、および特定のコンパイラ オプション セットとの統合 (最適化なし/低最適化など) を行っている場合は、最終リリース ビルドの前に完全な最適化を有効にしてください!!! ただし、テストしない場合にのみ最適化をオンにしてください。つまり、あなたはすでに何ヶ月もテストを行ってきました - 何がうまくいかないのでしょうか?!??!
初期化後の動的メモリ割り当て。システムが稼働した後も、メモリプールは静的なままである必要があります。
開発している実際のハードウェアにアクセスせずに開発しようとしています。
ソリューションで複数のプロセッサを使用し、エンディアンが反対であることを確認してください。次に、それらの間のインターフェイスが、他のメモリに直接アクセスできるいずれかであることを確認します。
はい、以前にそのアーキテクチャをプログラムしたことがあります。
エンディアンは永遠に同じであると仮定します。
(レジスターのサイズやハードウェア仕様に関するものに拡張してください)
(コメントのケース説明)。
ここにいくつかあります:
開発者、マネージャー、および顧客の両方が理解できる、簡単に説明できるアーキテクチャを設計しないでください。
組み込みシステムは、ほとんどの場合、コストに敏感なプラットフォームです。ハードウェアが遅くなる (安くなる) ことを計画したり、重要なデータ パスに新しい機能を追加したりすることを計画しないでください。
ほとんどの組み込みシステムは「ヘッドレス」です (キーボードやマウス、その他の HID はありません)。デバッグ ツールを作成するスケジュールを立てないでください。また、それらを維持するために少なくとも 1 人の開発者にリソースを提供しないでください。
プロンプトが表示されるまでにかかる時間を過小評価してください。これは、コア CPU がユーザーと通信できるようになるまでにかかる時間です。
ハードウェア サブシステムは、メモリ、クロック、電源など、すぐに使用できると常に想定してください。
「組み込みプログラミング」をもう少し定義しないと、何が良い習慣か悪い習慣かを言うことは不可能です。
たとえば、「C」の危険な非標準方言で 8 ビット マイクロをプログラムするために使用する可能性のある手法の多くは、CE や XPe プラットフォームでは完全に不適切です。
多くの場合、抽象化は (過度に) 高価なぜいたく品です。
これはおそらくハードウェアの答えですが、新しいプロジェクトを最初から開始する場合、リソース要件を過小評価することは大きな問題です。特に、コード/ストレージサイズを簡単に拡張する方法がない小型の自己完結型マイクロコントローラーで作業する場合はそうです。
これは組み込みシステムだけでなく、コードレビューなどのクールなものでバグを回避するのではなく、バグの発見(デバッグ)にすべての時間を費やすことは、間違いなく一般的に適用される最悪のプラクティスの1つです。
もう1つは、問題を小さな問題に分割するのではなく、1つの巨大なプロセッサにすべての作業を任せることです。COCOMOを覚えていますか?
組み込みシステムで重要なことは、アプリケーションとは別に、ソフトウェア(コンパイラ、ライブラリ、OS)とハードウェア(チップセット)の両方のテクノロジを評価することです。これらにテストベッドを使用しないことは危険です。評価キットを購入するか、独自のテストベッドを構築する必要があります。
FWモジュールを完全に汎用的に記述して、すべての可能なパラメーターを変数として受け入れます。ただし、上のレイヤーは常に同じパラメーターで呼び出します。
システムにDMAエンジンがある場合でも、コードのどこでもmemcpyを使用します(なぜHWを気にするのか)。
複雑な階層化されたFWアーキテクチャを設計し、モジュールが上位レベルのモジュールが所有するグローバル変数に直接アクセスできるようにします。
RTOSを選択しますが、実際のパフォーマンスをわざわざテストしないでください(ベンダーから提供された数値を信頼できませんか?)
ソフトウェアの観点から言えば、ハードウェアの学習に時間をかけません。
プログラミングするコントローラのタイプに大きく依存します。時にはコストが最も重要なことであり、できるだけ少ないコストでやり遂げようとします。それが私が通常乗っている船です。私が使用したいくつかの最悪の慣行は次のとおりです。
Printf.
トレース機能でコンテキストの切り替えや割り込みが必要な場合、漠然とタイミングに関連するものであっても、デバッグすることはできません。
メモリ バッファに書き込み (s(n)printf の代わりに memcpy'ing 列挙型のボーナス ポイント)、別のときにそれを読み取ります。
いくつかの追加の禁止事項:
組み込みシステムで 8 年以上働き、組み込みシステムを教えてきた私の経験からのワースト プラクティスのいくつか:
間違ったデータ型も悲惨な結果になる可能性があります。
ISR で多くの作業を行う- ISR はできるだけ短くする必要があります。ISR にロジック全体を実装している人を見たことがありますが、これは非常に悪いことです。それは犯罪としてリストされるべきであるほど悪い。代わりにフラグを使用する
整数をフラグとして使用する- これはポイント 1 の拡張です。必要なのは 1 ビットだけです。そのために16ビットまたは32ビットを使用しないでください。
しかし、私が見た中で最悪なのは、最適で最も完璧なアプローチを得るためにアルゴリズムを何度も検討することです。止まる!!ベスト プラクティスを念頭に置いて、システムを最初に機能させてください。
もっとたくさんあります。ここでそれらのいくつかを読むことができます