マイクロチップの例外処理
-
27-10-2019 - |
質問
、例外処理は奇妙に見えます。例外が発生している間プログラムが応答を停止します。コードを確認しながら、私はデフォルト-一般例外handler.cは無限ループを作成することに気づきました。エラーが発生した理由は何です私が知ることができないので、それは本当に混乱しています。平均マイクロチップがサポート例外処理をしないということでしょうか?またはエラーメッセージを読むための方法はありますか?
無限ループます:
--- \home\c11067\work\C32\builds\pic32-microchip-release-1.12-20101221-rc2-20101221\pic32-libs\libc\stubs\default-general-exception-handler.c
9D00DD28 1000FFFF beq zero,zero,0x9d00dd28
9D00DD2C 00000000 nop
_general_exception_handlerを定義することにより、それが動作!
// declared static in case exception condition would prevent
// auto variable being created
static enum {
EXCEP_IRQ = 0, // interrupt
EXCEP_AdEL = 4, // address error exception (load or ifetch)
EXCEP_AdES, // address error exception (store)
EXCEP_IBE, // bus error (ifetch)
EXCEP_DBE, // bus error (load/store)
EXCEP_Sys, // syscall
EXCEP_Bp, // breakpoint
EXCEP_RI, // reserved instruction
EXCEP_CpU, // coprocessor unusable
EXCEP_Overflow, // arithmetic overflow
EXCEP_Trap, // trap (possible divide by zero)
EXCEP_IS1 = 16, // implementation specfic 1
EXCEP_CEU, // CorExtend Unuseable
EXCEP_C2E // coprocessor 2
} _excep_code;
static unsigned int _epc_code;
static unsigned int _excep_addr;
// this function overrides the normal _weak_ generic handler
void _general_exception_handler(void)
{
asm volatile("mfc0 %0,$13" : "=r" (_excep_code));
asm volatile("mfc0 %0,$14" : "=r" (_excep_addr));
_excep_code = (_excep_code & 0x0000007C) >> 2;
while (1) {
// Examine _excep_code to identify the type of exception
// Examine _excep_addr to find the address that caused the exception
}
}
解決
は、ほとんどのマイクロコントローラでは、あなたがそこに置くもの以外の任意のコードはありません。例外が発生すると、あなたはそれのためのハンドラを定義していない場合はほとんどの場合、プロセッサは、ダイアログボックスを「申し訳ありませんが、システムエラーが発生しました」我慢するか見当がつかないでしょう。 「ブランチ・ツー・セルフ」命令のために2つのバイトを使用すると、例外に予測可能な応答をもたらすのに十分です。より良いもちろん、アクションのいずれかの特定の知識なしに、ブランチに自己または強制リセット良いとおそらく何として応答である。
PS - 様々なプラットフォームのためのいくつかのコンパイラは、未使用の割り込みまたは例外のためのベクトルを省略します。そのような例外が突然発生した場合、奇妙な、奇妙なことが起こることができます。いくつかのコンパイラは、即時リセット(ウォッチドッグタイマが有効になっている場合は、ジャンプツー自己結局、リセットを引き起こすことに注意してください)を強制するコードを生成します。いくつかのコンパイラは、即時からの復帰割り込み発生(一部のCPUの上で無効になる可能性があり、かつ他人に悪い行動を引き起こす可能性があります)。私のお気に入りのパターンは、すべての未使用の割り込みが任意の明示的な定義が存在しない場合にブランチ・ツー・自己の命令を指すようになりますUnexpectedInterruptラベルの呼び出し(ない枝)を作る持っているだろう。 1はそれを実行した場合、UnexpectedInterruptハンドラが発生した予期しない割り込みの種類スタックと、レコードを開くことができます。私は自分の手で発生する割り込みベクタテーブルの外に、しかし、このようなパターンを見ていませんでした。
他のヒント
だけですで定義されます:
のrel="nofollow">、セクション2.12.9原因登録 http://ww1.microchip.com/downloads/en/DeviceDoc/61113C.pdf の