2011-10-19 77 views
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 
    } 
} 
+0

http://www.microchip.com/forums/m455278.aspx它看起來像我需要我自己來定義異常處理功能。 – lucemia

回答

3

在大多數微控制器上,除了你放在那裏的東西外沒有任何代碼。在大多數情況下,如果發生異常並且您沒有爲其定義處理程序,處理器將不知道如何設置「對不起,發生系統錯誤」對話框。對於「分支到自我」指令使用兩個字節足以產生對異常的可預測響應;如果沒有任何更好的行動方案的專門知識,分支對自己或強制重置可能與任何事情一樣好。

PS - 針對各種平臺的一些編譯器將忽略未使用中斷或異常的向量;如果這樣的例外意外發生,奇怪和奇怪的事情會發生。有些編譯器會產生強制立即復位的代碼(注意,如果啓用了看門狗定時器,跳至自身最終會導致復位)。一些編譯器會立即產生中斷返回(在某些CPU上可能無用,而其他CPU可能會導致不良行爲)。我最喜歡的模式是讓所有未使用的中斷對UnexpectedInterrupt標籤進行調用(不是分支),如果沒有任何明確的定義,它將指向分支到自指令。如果有人這樣做,一個UnexpectedInterrupt處理程序可以彈出堆棧並記錄發生了什麼類型的意外中斷。儘管如此,我還沒有看到這種模式,除了我自己手動生成的中斷向量表之外。