2011-10-19 3 views
3

마이크로 칩 ICD3 장치에서 프로그램을 실행하는 동안 예외 처리가 이상하게 보입니다. 예외가 발생하는 동안 프로그램이 응답을 중지합니다. 코드를 확인하면서 default-general-exception-handler.c가 무한 루프를 생성한다는 것을 알았습니다. 오류가 발생한 위치와 원인을 알 수 없기 때문에 실제로 혼란 스럽습니다. 이는 마이크로 칩이 예외 처리를 지원하지 않는다는 것을 의미합니까? 아니면 오류 메시지를 읽을 수있는 방법이 있습니까?마이크로 칩 예외 처리

무한 루프하십시오 _general_exception_handler를 정의함으로써

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

, 그것은 작동한다!

// 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

대부분의 마이크로 컨트롤러에는 입력 한 코드 외에 다른 코드가 없습니다. 대부분의 경우 예외가 발생하고 처리기를 정의하지 않은 경우 프로세서는 "죄송합니다. 시스템 오류가 발생했습니다"대화 상자를 표시하는 방법을 모릅니다. "브랜치 - 투 - 자기"명령어에 2 바이트를 사용하면 예외에 대한 예측 가능한 응답을 얻을 수 있습니다. 더 나은 행동 방침에 대한 특별한 지식이없는 한, 지점 대 자기 또는 강제 재설정은 아마 무엇보다도 좋은 반응 일 것입니다.

PS - 다양한 플랫폼 용 컴파일러 중 일부는 사용되지 않는 인터럽트 또는 예외에 대한 벡터를 생략합니다. 그러한 예외가 예기치 않게 발생하면 이상하고 기괴한 일이 발생할 수 있습니다. 일부 컴파일러는 즉각적인 리셋을 강요하는 코드를 생성합니다 (워치 독 타이머가 활성화 된 경우 자체 점프는 결국 재설정을 유발합니다). 일부 컴파일러는 즉각적인 return-from-interrupt를 생성합니다 (일부 CPU에서는 쓸모 없거나 다른 컴파일러에서는 잘못된 동작이 발생할 수 있음). 필자가 가장 좋아하는 패턴은 사용되지 않은 모든 인터럽트가 UnexpectedInterrupt 레이블을 호출 (브랜치가 아닌)하는 것입니다. 명시 적 정의가없는 경우 브랜치 - 자체 명령을 가리 킵니다. 그렇게하면 UnexpectedInterrupt 핸들러가 스택을 팝하고 어떤 유형의 예상치 못한 인터럽트가 발생했는지 기록 할 수 있습니다. 하지만 필자는 수동으로 생성 된 인터럽트 벡터 테이블 외부에서 그러한 패턴을 보지 못했습니다.