2009-03-19 12 views
9

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

これをデバッグする方法は何ですか?

編集: 結論: 私のバグを見つけたのはウォッチドッグブレッドクラムです。

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

ブレッドクラムは、私の検索をLEDマトリックスを処理し、特にLEDマトリックス割り込みを無効にした機能に限定しました。二回

答えて

9

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

メインの先頭にブレークポイントを設定します。

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

+0

ここに来る人を追加するだけです: "初期化されていないグローバル変数"は、Cコンパイラでいくつかの特別なセマンティクスが必要です。標準によれば、値が割り当てられていないグローバル変数でさえ、ゼロに初期化されなければならないということです。だから、典型的には、例えばこれらの変数の属性が必要である。 avr-gccの ".noinit" – FourtyTwo

0

質問あなたが作るすべての仮定を、:

  • 確認ウォッチドッグくださいは(私はプロセッサのロギング機能を知らない)蹴られます。
  • ウォッチドッグがキックされても、プロセッサをリセットしないように注意してください。

「ステップスルー」と単独での実行の違いは何ですか?タイミングの制約が重要になります。

3

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

は、いくつかの基本です:

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

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

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

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

+1

+1特に第1段落。 –

+0

あなた次第! :)新しいエミュレーションボードがデバッグのために到着するたびに、まずWDユニットが切断されていることを確認してください! –

2

私は状態ベースのプログラミングを使用しています。私はいつも使いたいと思っていたトリックは、現在の状態に対して1つの出力ポートをバイナリで予約することでした。その後、ロジックアナライザを接続し、状態の変化のタイミングを確認します。ロバートが言ったことをして、グローバル変数を作成し、キーポイントで値を変更することができます。 - ポートの値を現在の状態に即時に設定する関数(changeState(nextState);)を使用することが好ましいあなたが犬をキックする機能を入力した後、その機能を離れる前に元の状態に戻すことができます。どの機能から蹴られていないかを確認してから、その機能に取り組むことができます。

幸運にも、タイミング問題のように聞こえ、解決するのは難しいです。

1

通常、ウォッチドッグタスク/スレッドは低い優先順位で実行されます。したがって、ウォッチドッグが蹴られていない場合、これは、プロセッサが何か他のことをしているために忙しいからです。

プロセッサがリセットされる直前にタスク/スレッドごとに実行コンテキスト(ローカルスタック、スケジューリング状態など)をダンプすることは本当に便利です。少しの運と仕事で、ウォッチドッグタスクがタイマーを蹴るのを妨げているものを特定することができます。

1

余分な出力ピンを使用して、コード内の適切なポイントを低く設定して、私が探している範囲を制限します。それから私はデジタルスコープまたはロジックアナライザでそれをトレースします。これは、別のポスターで紹介されているブレッドクラムの方法と同じですが、リセットパルスとの時間相関をはるかに上げることができます。

0

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

関連する問題