すべてのトラップを常に定義する必要がありますか?


18

dsPIC 30F4013で、未定義のトラップが原因でコントローラーがリセットされた2つのケースを見てきました。そもそもなぜこれらのtrapが発生したのかは謎のままですが、それは私の直接の質問ではありません。トラップが決して発生しない場合でも、すべてのトラップを常に定義することは良いプログラミング手法だと考え始めているので、ランダムリセットの代わりに少なくとも明確なエラーメッセージが表示されます。これは私が知らない標準的な慣習ですか?このプラクティスに不利な点はありますか?


4
あなたの質問に対する答えではありませんが、私は少し前にdsPICおよびPIC24システムでこの種の症状に苦しみました。私の場合、トラップは16ビット値へのポインタを逆参照しているコードのビットに起因し、これらのポインタ自体は奇数の(偶数ではない)値を持ちました。 16ビット値が奇数または偶数の境界で始まるかどうかを知る方法。XC16コンパイラは、ここでのハードウェアのハングアップからあなたを保護しません。最終的に、2つの8ビットポインター逆参照を強制するこれらの関数のラッパーマクロを作成しました。
ブランス

回答:


13

私の非公式のルールは:

  1. 割り込みが有効になっている場合、それを処理するコードが必要です。
  2. 割り込みのコードを作成しない場合は、無効にします。
  3. 無効にできない場合は、コードを記述してください。

ただし、そのルールがなくても、データシートは明示的にあなたの質問に答えます。

ユーザーがトラップエラー状態のイベントで修正アクションを実行するつもりがない場合、これらのベクトルには、RESET命令を単に含むデフォルトハンドラのアドレスをロードする必要があります。一方、無効なアドレスを含むベクターの1つが呼び出されると、アドレスエラートラップが生成されます。

ソース、セクション8.3、最初のメモ)

トラップをマスクできない場合、それらを処理する必要があります。特定の方法でトラップに対処したくない場合、適切な方法はRESET命令を実行することです。


うん。すべてのトラップのターゲットを持つ標準モジュールがあります。
オリンラスロップ

16

はい、それは良いアイデアです-唯一の欠点はコードサイズが少し余分であり、トラップの処理方法を決定する必要があります(シリアルポートでメッセージを送信しますか?「FAILED」ライトをオンにしますか? )


4
通常、プロセッサは無限のNOP / GOTOループで実行されます。そうすれば、スタックがトラップから破損することはなく、デバッグ時にスタックを解き、何が起こったのかを知ることができます。トラップを頻繁に取得することはありませんが、80%の確率で奇数アドレストラップが発生します。これは、通常、ガベージがポインタとしてロードされたためです。スタックポインターが破損して、奇数のアドレストラップが生成されることがあります。スタックが存在しないため、デバッグが困難です。幸いなことに、それは非常にまれです。
オリンラスロップ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.