システムは正確にどのように機能していますか? 私は常にソフトウェアとハードウェアのウォッチドッグを組み合わせて使用しています。説明させてください...
私の例では、プリエンプティブなリアルタイム カーネルを使用していて、CPU/マイクロコントローラーでウォッチドッグがサポートされていることを前提としています。このウォッチドッグは、一定時間キックされなかった場合、リセットを実行します。次の 2 つのことを確認します。
1) 定期的なシステム タイマー (「RTOS クロック」) が実行されている (そうでない場合、「スリープ」などの機能が機能しなくなり、システムが使用できなくなります)。
2) すべてのスレッドは妥当な時間内に実行できます。
私の RTOS (www.lieron.be/micror2k) は、RTOS クロック割り込みハンドラでコードを実行する可能性を提供します。これは、ハードウェア ウォッチドッグを更新する唯一の場所であるため、クロックが常に動作していることを確認できます (そうでない場合、ウォッチドッグはシステムをリセットします)。
アイドル スレッド (常に最低の優先度で実行) では、「ソフトウェア ウォッチドッグ」が更新されます。これは、変数を特定の値 (たとえば 1000) に設定するだけです。RTOS クロック割り込み (ハードウェア ウォッチドッグをキックする場所) で、この値をデクリメントしてチェックします。0 に達した場合は、アイドル スレッドが 1000 クロック ティックの間実行されていないことを意味し、システムを再起動します (ハードウェア ウォッチドッグを再起動させるために、割り込みハンドラ内で無期限にループすることで実行できます)。
元の質問に進みます。システム クロックは動作し続けると想定しているため、システムをリセットするのはソフトウェア ウォッチドッグです。RTOS クロック割り込みハンドラでは、ソフトウェア ウォッチドッグの状況が発生した場合に備えて、いくつかの「統計収集」を行うことができます。システムをリセットする代わりに、(問題が発生した後) 各クロック ティックでどのスレッドが実行されているかを確認し、何が起こっているかを調べることができます。理想的ではありませんが、役に立ちます。
もう 1 つのオプションは、異なる優先順位で複数のソフトウェア ウォッチドッグを追加することです。アイドル スレッドで VariableA を 1000 に設定し、(専用の) 中優先度スレッドで Variable B を設定します。RTOS クロック割り込みハンドラで、両方の変数をチェックします。この情報により、ループ スレッドの優先度が「中」より高いか、「中」より低いかがわかります。必要に応じて、3 つ目または 4 つ目、または好きな数のソフトウェア ウォッチドッグを追加できます。最悪の場合、使用される優先度ごとにソフトウェア ウォッチドッグを追加します (ただし、余分なスレッドが必要になります)。