どのようにデバッグ、ウォッチドッグタイムアウト
質問
いウォッチドッグママイクロコントローラがない場合は蹴られ、リセットのプロセッサー私の用途に走る微らずリセットでのウォッチドッグな蹴.また、プログラムです。
この方法でデバッグす。
編集:結論:方かったバグ、ウォッチドッグパンくず.
を使用している日替高低ISRベクトルとなっています。の高いベクターにも対応LEDマトリクスのベクターのマティック.私の両ISRハンドラのベクトルとなっています。この障害は、LEDマトリクスISR、タイマティックISRに必要なサービスは、プロセッサうにこだわったの低ISRのタイマティックが、マティックハンドラにいなかった。
のパンくずに限っての機能を取り扱ledマトリクスおよび具体的には無効にして、LEDマトリクス.
解決
コード全体で異なる値に設定されて初期化されていないグローバル変数を追加します。具体的には、主要な関数呼び出しの前と後にそれを設定します。
メインの先頭にブレークポイントを置きます。
プロセッサがリセットされた場合、グローバル変数はまだそれに設定された最後の値を持つことになります。問題の機能に絞り込むためにこれらの「パン粉」を追加してください。
他のヒント
あなたは(デバッガが停止したアプリケーションを持っていながら、再起動するのを防ぐため)。デバッガをアタッチするとき、多くのソフトウェアウォッチドッグが自動的に無効になります。
ここでは、言ったことは、いくつかの基本があります:
これは、マルチスレッド・アプリケーションですか?あなたはRTスケジューラを使用していますか?もしそうなら、あなたのウォッチドッグタスクが不足している?
あなたのウォッチドッグタスクが(など、メッセージを待って、セマフォの保留)何に貼付することができないことを確認してください。時には、関数は、あなたが期待していない可能性がある方法でブロックすることができます。例えば、私はprintfのは非常に簡単にブロックするために取得することができ、私は今働いているLinuxプラットフォームを持っています。
それはシングルスレッドだ場合は、、プロファイラを使用すると、タイミングの問題の特定に役立つことがあります。
この新しいシステムの場合は、、ウォッチドッグが正しく動作することを確認してください。ただWDにヒットして、無限ループに眠る簡単なコードをテストします。
私は、状態ベースのプログラミングを使用して、私はいつも採用たいと思っていたトリックはバイナリで、現在の状態のための1つの出力ポートを予約しました。そして、ロジック・アナライザをフックアップし、状態変化のタイミングを参照してください。あなたがここに似た何かができる:ロバートが言ったことを実行し、グローバル変数を作成し、キーポイントでその値を変更する - 好ましくは、直ちに現在の状態にポートの値を設定する関数で(すなわちchangeState(nextStateを);)を変更あなたは犬を蹴る関数を入力するときに機能を離れる前の状態は、その後、以前の状態に戻ってそれを変更します。あなたはそれがキッカーされないと、あなたはそれらの上で動作することができます機能何から見ることができる必要があります。
幸運は、それはタイミングの問題のように聞こえるし、それらが解決するのは難しいです。
通常のウォッチドッグタスク/スレッドが低い優先度で実行されます。ウォッチドッグが蹴ら取得されていない場合、プロセッサは他の何かをやってビジー状態であるため、だから、これはあるべき - 。おそらくそれはやってはならない何かを
ちょうど、プロセッサのリセットの前に、各タスク/スレッドの実行コンテキスト(ローカル・スタック、スケジューリング状態など)をダンプするために本当に有用であろう。運や仕事のビットを使用すると、タイマーを蹴りからのウォッチドッグタスクを妨げているかを決定することができるでしょう。
私は私が探している場所の範囲を限定するために、コード内の適切なポイントで、高、低設定、余分な出力ピンを、使用したいです。それから私は、デジタルスコープまたはロジックアナライザ上で、それをトレースしたいです。これは、別のポスターが言及したパン粉方法と同じですが、あなたはより良いリセットパルスまでの時間相関させることができます。
あなたは、あなたのコード内でwhileループを挿入し、whileループ内部のLEDを切り替えることができます。これは、ボードがリセットされるかどうかを確認するための効果的な方法です。
問題毎に提き回:
- のウォッチドッグ は 蹴るないわからない、ロギング設備のプロセッサー)
- のウォッチドッグ、蹴られていて、リセットのプロセッサー
思うに違いがある"ステッピングを通じて"や走行のみとなり、タイミング制約を確実にします。