高信頼性の組み込みシステムを開発するには、適切に規制された開発サイクルから厳密な実行およびシステム チェックまで、多くの手法があります。
#システムの安定稼働や異常動作の把握に役立つ、簡単操作で長く使える7つのヒントをご紹介しますソフトウェア開発者は非常に楽観的な傾向があり、自分のコードが長期間忠実に実行されることだけを望んでいます。マイクロコントローラーがアプリケーション空間から飛び出して、意図しないコード空間で実行されることは非常にまれであるようです。ただし、これが発生する可能性は、バッファ オーバーフローや不良ポインタが参照を失うことと同じくらいあります。それは起こります!これが起こった後のシステムの動作は不定です。デフォルトではメモリ空間はすべて 0xFF であるため、またはメモリ領域は通常は書き込まれないため、その値は神のみが知っている可能性があります。 ただし、このようなイベントを特定し、そこからシステムを回復するために使用できる、非常に完全なリンカーまたは IDE テクニックがあります。秘訣は、FILL コマンドを使用して、未使用の ROM を既知のビット パターンで埋めることです。未使用のメモリを埋めるには、さまざまな組み合わせが考えられますが、より信頼性の高いシステムを構築したい場合、最も明白な選択は、これらの場所に ISR フォールト ハンドラーを配置することです。システムに問題が発生し、プロセッサがプログラム空間の外でコードの実行を開始した場合、ISR がトリガーされ、修正措置を決定する前にプロセッサ、レジスタ、およびシステムの状態を保存する機会が提供されます。 # ヒント 2 - アプリケーションの CRC を確認する組み込みエンジニアにとっての大きな利点は、IDE とツール チェーンが、アプリケーションが損なわれていないことを確認するチェックサムに基づいて、アプリケーションまたはメモリ領域のチェックサム (チェックサム) を自動的に生成できることです。興味深いことに、これらのケースの多くでは、チェックサムはプログラム コードをデバイスにロードするときにのみ使用されます。
ただし、CRC またはチェックサムがメモリに残っている場合は、アプリケーションが起動時に (または、長時間実行されるシステムの場合は定期的に) 正常であることを確認することが、A を確実に保証する方法です。予期せぬ事態が起こるのを防ぐ素晴らしい方法です。 プログラムされたアプリケーションが変更される可能性は非常に低いですが、毎年出荷される数十億個のマイクロコントローラーと潜在的に過酷な作業環境を考慮すると、アプリケーションがクラッシュする可能性はゼロではありません。可能性としては、システムの欠陥によりセクタ上でフラッシュ書き込みまたはフラッシュ消去が発生し、アプリケーションの整合性が損なわれる可能性があります。 ヒント 3 – 起動時に RAM チェックを実行する #より信頼性が高く堅牢なシステムを構築するには、システム ハードウェアが適切に動作していることを確認することが非常に重要です。結局のところ、ハードウェアは故障する可能性があります。 (幸いなことに、ソフトウェアは決して失敗することはなく、それが正しいか間違っているかに関係なく、コードの指示どおりに実行するだけです)。ブート時に RAM の内部または外部に問題がないことを確認することは、ハードウェアが期待どおりに機能していることを確認する良い方法です。 RAM チェックを実行するにはさまざまな方法がありますが、一般的な方法は、既知のパターンに書き込み、少し待ってからそれを読み取ることです。結果として、読み取られたものが書き込まれたとおりになるはずです。実際のところ、ほとんどの場合、RAM チェックはパスします。これは私たちが望んでいることです。ただし、チェックに合格しない可能性は非常に低いため、システムがハードウェアの問題にフラグを立てる絶好の機会となります。#多くの組み込み開発者にとって、スタックはかなり不思議な力のように思えます。奇妙なことが起こり始めたとき、エンジニアたちはついに困惑し、スタックで何かが起こっているのではないかと考え始めました。その結果、スタックのサイズや位置などをやみくもに調整することになります。しかし、エラーはスタックに依存しないことがよくありますが、どうすればそう確信できるのでしょうか?結局のところ、ワーストケースのスタック サイズ分析を実際に実行したエンジニアは何人いるでしょうか? スタック サイズはコンパイル時に静的に割り当てられますが、スタックは動的に使用されます。コードが実行されると、変数、戻りアドレス、およびアプリケーションが必要とするその他の情報がスタックに継続的に格納されます。このメカニズムにより、スタックは割り当てられたメモリ内で継続的に増加します。ただし、この増加はコンパイル時に決定された容量制限を超える場合があり、スタックによって隣接するメモリ領域のデータが破損することがあります。 スタックが適切に動作していることを絶対に確認する方法の 1 つは、システムの「健全性」コードの一部としてスタック モニターを実装することです (これを行うエンジニアは何人いますか?)。スタック モニターは、スタックと「他の」メモリ領域の間に、既知のビット パターンで満たされたバッファ領域を作成します。その後、モニターはパターンの変化を継続的に監視します。そのビット パターンが変化した場合、スタックが大きくなりすぎて、システムが暗い地獄に突き落とされようとしていることを意味します。この時点で、モニターはイベントの発生、システムのステータス、その他の有用なデータを記録し、後で問題を診断するときに使用できます。 スタック モニターは、メモリ保護ユニット (MPU) を実装するほとんどのリアルタイム オペレーティング システム (RTOS) またはマイクロコントローラー システムで提供されます。恐ろしいのは、これらの機能がデフォルトでオフになっているか、開発者によって意図的にオフになっていることが多いということです。 Web で簡単に検索すると、多くの人が 56 バイトのフラッシュ領域を節約するために、リアルタイム オペレーティング システムのスタック モニタをオフにすることを推奨していることがわかります。待ってください、これでは利益を得る価値はありません。 かつては、小型で安価なマイクロコントローラーにメモリ保護ユニット (MPU) を搭載するものを見つけるのは困難でしたが、状況は変わり始めています。現在、ハイエンドからローエンドまでのマイクロコントローラーには MPU が搭載されており、これらの MPU は組み込みソフトウェア開発者にファームウェアの堅牢性を大幅に向上させる機会を提供します。 MPU は、処理が分離されるメモリ空間を作成するため、またはタスクが踏みつけられることを恐れることなくコードを実行できるようにするために、オペレーティング システムに結合されることが増えています。何か問題が発生した場合、制御されていない処理はキャンセルされ、その他の保護措置が実施されます。このコンポーネントを備えたマイクロコントローラーに注目してください。そうであれば、この機能を活用してください。 # ヒント 6 - 強力なウォッチドッグ システムを構築する よく見かける最も人気のあるウォッチドッグ実装の 1 つは、ウォッチドッグが有効になっているもの (これは良いスタートです) ですが、ウォッチドッグを次のコマンドでクリアできるものでもあります。定期タイマー。タイマーの有効化は、プログラム内で発生するあらゆる動作から完全に分離されます。
ウォッチドッグを使用する目的は、エラーが発生した場合にウォッチドッグがクリアされないようにすることです。つまり、作業が中断されたときにシステムが強制的に実行されるようにすることです。回復のためのハードウェア リセット (ハードウェア リセット)。システム アクティビティとは独立してタイマーを使用すると、システムに障害が発生した場合でもウォッチドッグをクリアしたままにすることができます。
組み込み開発者は、アプリケーション タスクをウォッチドッグ システムに統合する方法を慎重に検討し、設計する必要があります。たとえば、ある手法を使用すると、一定期間実行される各タスクに、そのタスクが正常に完了したことを示すことができます。このイベントでは、ウォッチドッグはクリアされず、強制的にリセットされます。外部ウォッチドッグ プロセッサを使用するなど、より高度な手法もあります。これを使用して、メイン プロセッサのパフォーマンスを監視したり、その逆を監視したりすることができます。 信頼性の高いシステムのためには、強力なウォッチドッグ システムを確立することが重要です。あまりにも多くのテクノロジーがあるため、この段落ですべてを網羅することは困難ですが、このトピックに関する関連記事を今後公開する予定です。 #リソースが限られた環境での作業に慣れていないエンジニアは、揮発性メモリ割り当てを使用できるプログラミング言語の機能を利用したくなるかもしれません。結局のところ、これは電卓システムでよく使用される手法であり、必要な場合にのみメモリが割り当てられます。たとえば、C で開発する場合、エンジニアはヒープ上のスペースを割り当てるために malloc を使用する傾向があるかもしれません。操作が実行され、完了すると、free を使用して割り当てられたメモリを返し、ヒープを使用できるようになります。 リソースに制約のあるシステムでは、これは大惨事になる可能性があります。揮発性メモリ割り当てを使用する場合の問題の 1 つは、エラーや不適切な手法によりメモリ リークやメモリの断片化が発生する可能性があることです。これらの問題が発生した場合、ほとんどの組み込みシステムにはヒープを監視したり適切に処理したりするためのリソースや知識がありません。その際、アプリケーションがスペースを要求したが、要求されたスペースが利用できない場合はどうなるでしょうか? 揮発性メモリ割り当ての使用によって引き起こされる問題は非常に複雑であり、これらの問題に適切に対処することは悪夢であると言えます。別の方法は、静的な方法でメモリを直接割り当てることです。たとえば、malloc を介してこのサイズのメモリ バッファを要求する代わりに、プログラム内に 256 バイト長のバッファを作成するだけです。この割り当てられたメモリは、ヒープやメモリの断片化の問題を心配することなく、アプリケーションの存続期間中維持されます。 ###########################結論は##################### これらは、開発者がより信頼性の高い組み込みシステムの構築を開始できる方法の一部にすぎません。優れたコーディング標準の利用、ビット反転の検出、配列とポインターの境界チェックの実行、アサーションの使用など、他にも多くのテクニックがあります。これらのテクニックはすべて、設計者がより信頼性の高い組み込みシステムを開発できる秘訣です
以上がいくつかの実用的な組み込み開発ルーチンとテクニックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。