質問

マイクロチップICD3デバイス上で私のプログラムを実行中に、例外処理は奇妙に見えます。例外が発生している間プログラムが応答を停止します。コードを確認しながら、私はデフォルト-一般例外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ハンドラが発生した予期しない割り込みの種類スタックと、レコードを開くことができます。私は自分の手で発生する割り込みベクタテーブルの外に、しかし、このようなパターンを見ていませんでした。

他のヒント

ヘッドアップ、さらにPIC32例外については、(あなたの_excep_code変数にあなたがしている読書前の値と-INGの離れた他のすべてのビット)を登録し、「原因」の例外コードとすべてのビットをデバッグするように、

だけですで定義されます:

のrel="nofollow">、セクション2.12.9原因登録 http://ww1.microchip.com/downloads/en/DeviceDoc/61113C.pdf

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top