3

マイクロチップ ICD3 デバイスでプログラムを実行しているときに、例外処理が奇妙に見えます。例外が発生している間、プログラムは応答を停止します。コードを確認しているときに、default-general-exception-handler.c が無限ループを作成することに気付きました。どこでエラーが発生し、何が原因なのか分からず、本当に困っています。Microchip 社は例外処理をサポートしていないということですか? または、エラーメッセージを読む方法はありますか?

無限ループ:

---  \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
    }
}
4

2 に答える 2

3

ほとんどのマイクロコントローラーには、そこに置く以外のコードはありません。ほとんどの場合、例外が発生し、そのハンドラーを定義していない場合、プロセッサは「システム エラーが発生しました」というダイアログ ボックスを表示する方法を認識できません。「branch-to-self」命令に 2 バイトを使用するだけで、例外に対する予測可能な応答を得ることができます。より良い行動方針について特に知識がなくても、branch-to-self または強制リセットは、おそらく何よりも優れた応答です。

PS--さまざまなプラットフォームの一部のコンパイラは、未使用の割り込みまたは例外のベクトルを省略します。このような例外が予期せず発生すると、奇妙で​​奇妙なことが発生する可能性があります。一部のコンパイラは、即時リセットを強制するコードを生成します (ウォッチドッグ タイマーが有効になっている場合、自己ジャンプは最終的にリセットを引き起こすことに注意してください)。一部のコンパイラは、割り込みからの即時復帰を生成します (一部の CPU では役に立たない場合があり、他の CPU では悪い動作を引き起こす可能性があります)。私のお気に入りのパターンは、すべての未使用の割り込みが (分岐ではなく) UnexpectedInterrupt ラベルを呼び出すようにすることです。これは、明示的な定義がない場合、branch-to-self 命令を指します。その場合、UnexpectedInterrupt ハンドラーはスタックをポップし、発生した予期しない割り込みの種類を記録できます。見たことないパターンですが、

于 2011-10-20T04:21:12.017 に答える
2

PIC32 の例外をさらにデバッグするための注意事項として、例外コードと「CAUSE」レジスタのすべてのビット (他のすべてのビットを削除する前に _excep_code 変数に読み込む値) は、次のように定義されています。

PIC32 ファミリ リファレンス マニュアル、セクション 2.12.9 原因 登録 http://ww1.microchip.com/downloads/en/DeviceDoc/61113C.pdf

于 2012-01-03T21:50:26.850 に答える