11

マイクロコントローラにウォッチドッグがあり、キックされていない場合はプロセッサをリセットします。私のアプリケーションはしばらくの間正常に動作しますが、ウォッチドッグがキックされなかったため、最終的にリセットされます。プログラムをステップ実行すると、正常に動作します。

これをデバッグするにはどのような方法がありますか?

編集: 結論: バグを見つけた方法は、ウォッチドッグのパンくずリストでした。

高低の ISR ベクトルを持つ PIC を使用しています。High ベクトルは LED マトリックスを処理し、Low ベクトルはタイマー ティックを処理することになっていました。しかし、両方の ISR ハンドラーを高いベクトルに配置しました。そのため、LED マトリックス ISR を無効にし、タイマー ティック ISR にサービスが必要な場合、プロセッサはタイマー ティックを処理するために低い ISR でスタックしますが、タイマー ティック ハンドラーはそこにありませんでした。

ブレッドクラムは、私の検索を led マトリックスを処理し、具体的には LED マトリックス割り込みを無効にする関数に限定しました。

4

8 に答える 8

10

コード全体で異なる値に設定されている初期化されていないグローバル変数を追加します。具体的には、主要な関数呼び出しの前後に設定してください。

main の先頭にブレークポイントを置きます。

プロセッサがリセットされると、グローバル変数は最後に設定された値のままになります。これらの「パンくず」を追加し続けて、問題の機能に絞り込みます。

于 2009-03-19T11:46:42.807 に答える
4

デバッガーをアタッチすると、多くのソフトウェア ウォッチドッグが自動的に無効になります (デバッガーがアプリケーションを停止している間にデバッガーが再起動しないようにするため)。

とはいえ、ここにいくつかの基本があります。

これはマルチスレッド アプリケーションですか? RT スケジューラーを使用していますか? もしそうなら、あなたのウォッチドッグタスクは枯渇していますか?

ウォッチドッグ タスクが何にもスタックしないようにしてください (保留中のセマフォ、メッセージ待ちなど)。関数が予期しない方法でブロックされることがあります。たとえば、現在取り組んでいる Linux プラットフォームでは、printf を簡単にブロックできます。

シングル スレッドの場合は、プロファイラーがタイミングの問題を特定するのに役立つ場合があります。

これが新しいシステムである場合は、ウォッチドッグが正しく機能することを確認してください。WD にヒットしてから無限ループでスリープする単純なコードをテストします。

于 2009-03-19T11:50:16.230 に答える
2

追加の出力ピンを使用し、コード内の適切なポイントでハイに設定してからローに設定し、探している場所の範囲を制限します。次に、デジタルスコープまたはロジックアナライザーでトレースします。これは、別のポスターで言及されているブレッドクラムの方法と同等ですが、リセットパルスとの時間相関がはるかに良くなります。

于 2009-03-23T01:17:17.600 に答える
2

私は状態ベースのプログラミングを使用しており、常に採用したいと思っていたトリックは、バイナリで現在の状態用に 1 つの出力ポートを予約することでした。次に、ロジック アナライザーを接続して、状態変化のタイミングを確認します。ここで同様のことを行うことができます: Robert が言ったことを実行し、グローバル変数を作成し、重要なポイントでその値を変更します。犬を蹴る機能に入ったときに状態を変更し、機能を終了する前に元の状態に戻します。キックされない関数を確認できるはずであり、それらに取り組むことができます。

うまくいけば、タイミングの問題のように聞こえますが、解決するのは難しいです。

于 2009-03-19T13:22:41.797 に答える
2

通常、ウォッチドッグ タスク/スレッドは低い優先度で実行されます。したがって、ウォッチドッグがキックされていない場合、これはプロセッサが何か別のことをしているためにビジーであるはずです。おそらく、すべきでないことです。

プロセッサがリセットされる直前に、各タスク/スレッドの実行コンテキスト (ローカル スタック、スケジューリング状態など) をダンプすると非常に便利です。運が良ければ、ウォッチドッグ タスクがタイマーを開始するのを妨げている原因を突き止めることができます。

于 2009-03-19T13:40:14.717 に答える
1

コードに while ループを挿入し、while ループ内で LED を切り替えることができます。これは、ボードがリセットされているかどうかを確認する効果的な方法です。

于 2016-09-06T12:35:29.530 に答える
0

あなたが作るすべての仮定に2回質問してください:

  • ウォッチドッグが起動されていることを確認してください(プロセッサのロギング機能はわかりません)。
  • ウォッチドッグがキックされたときにプロセッサをリセットしないことを確認してください。

そして、「通り抜ける」ことと一人で走ることの間にはどんな違いがあるのだろうか。タイミングの制約は確かに重要です。

于 2009-03-19T11:41:16.033 に答える
0

strace実行中のプロセスに(option ) をアタッチ-pし、開いたファイル記述子への書き込みがいつ停止するかを監視できます/dev/watchdogstraceオプションを使用して出力をフィルタリングできます-e。詳しくはマニュアルページをご覧ください。

于 2021-04-13T13:14:16.000 に答える