3

때때로 예기치 않은 인터럽트가 발생하며 내 코드가 Atmel Studio Framework (ASF)의 exceptions.cDummy_Handler() 안에 있습니다. 나는 Arduino Due의 ATSAM3X8E 마이크로 컨트롤러를 사용하고있다.Atmel Studio Dummy_Handler

void Dummy_Handler(void) 
{ 
    while(1) { 
    } 
} 

모든 아이디어를 어떻게했다 방해 을 결정하는 방법?

물론이 단일 핸들러를 각 예외에 대해 고유 한 더미 핸들러로 바꿀 수 있습니다. (약 오십 그들을 수 있습니다.) 예를 들어 같은 exceptions.c 파일의 각 줄 변경 :

void HardFault_Handler (void) __attribute__ ((weak, alias("Dummy_Handler"))); 

void HardFault_Handler (void) __attribute__ ((weak, alias("Dummy_HardFault_Handler"))); 

에 기타를 ... 또는 어떻게 내 코드가 할 수 추론하기 위하여 시도 어느 인터럽트를 발생 시켰습니다. 그러나 누가 그런 시간을 보내고 있습니까?

답변

7

이 MCU에는 소스에 대한 단서를 제공하는 인터럽트 프로그램 상태 레지스터가 있습니다. ASF는 core_cmFunc.h의 기능 __get_IPSR()에 싸서 :

uint32_t phantomISR = 9999; 

void Dummy_Handler(void) 
{ 
    while(1) { 
     phantomISR = __get_IPSR(); 
    } 
} 

다음이 전역 변수는 런타임시에 모니터링 할 수 있습니다. (. 내 경우에는 내가이 루프의 죽음에 대한 어셈블리 코드를 일시 정지하고, R3 레지스터의 값 3을 보았다) Atmel의 MCU의 문서는 그 값을 설명 :이 나에게 무슨 일이 있었

 
ISR_NUMBER 
This is the number of the current exception: 
0 = Thread mode 
1 = Reserved 
2 = NMI 
3 = Hard fault 
4 = Memory management fault 
5 = Bus fault 
6 = Usage fault 
7-10 = Reserved 
11 = SVCall 
12 = Reserved for Debug 
13 = Reserved 
14 = PendSV 
15 = SysTick 
16 = IRQ0 
45 = IRQ29 

두 번이었다 Hard Fault, Ardunio Due의 죽음의 블루 스크린. 그래서 하드 결함 핸들러을 설치했습니다.

ISR(HardFault_Handler) 
{ 
    while (1) { 
    } 
} 

또한 일시 정지하여 디버그 모드에서 감지 할 수 있습니다. 물론 속편은 what causes a Hard Fault입니까? 기억 지우기 또는 무한 재귀를 추측합니다.