2012-12-28 6 views
0

3 인터럽트 사용, 1 UART에서 IRQ (직렬 포트), Timer1에서 IRQ (깜박임 LED 제어) 및 Timer0 ~ FIQ (출력 스테핑 신호 생성).FIQ 및 IRQ 혼합 사용으로 인해 커널이 멈추는 이유는 무엇입니까?

첫 FIQ 핸들러는 비어 :

void FIQ_HANDLER(void) __fiq 
{ 
    if(FIQSTA & TIMER0) 
    { 
     T0CLR = 0; 
     break; 
    } 
} 

IRQ 핸들러 :

void IRQ_HANDLER(void) __irq 
{ 
    if(IRQSTA & TIMER1) 
    { 
     T1CLR = 0; 
     MAKE_LED_FLASH(); 
     break; 
    } 
    if(IRQSTA & UART) 
    { 
     BLAH_BLAH_BLAH(); 
     break; 
    } 
} 

위의 코드는, UART 응답, 및 기타 기능을 잘 깜박이는 LED, 잘 작동합니다. (~ 2 초)

void FIQ_HANDLER(void) __fiq 
    { 
     if(FIQSTA & TIMER0) 
     { 
      if(cts>0) 
      { 
       IO_BLAH_BLAH_BLAH(); 
       cts--; 
      } 
      T0CLR = 0; 
      break; 
     } 
    } 

CPU가 시작 후 몇 초 자체를 잠급니다 : 나는 FIQ 핸들러에 몇 가지 코드를 추가 한 후하지만, 주로 카운터 (UINT16)을 설정하고 IO 낮은/hign 가자 그러면 LED가 깜박임을 멈추고 UART가 응답하지 않습니다. 변수 cts조차도 처음에는 0으로 설정됩니다 (따라서()를 입력 할 수없는 경우).

저는 타이머 0이 너무 빠르기 때문에 (처음에는 더 많은 FIQ가 스태킹되고 삭제되지 않으므로) 생각했습니다. 그래서 타이머 0을 자주 설정하지 않았습니다. 그리고 .. 좋아, 시동시 OK, LED가 계속 깜박이다 ...하지만 직렬 포트 (UART)를 통해 문자를 보내면 시스템이 즉시 다시 잠긴다. -_-! 뭐가 문제 야?

여기에 작성해야 할 중요한 정보가 빠진 경우 알려주십시오.

+1

얼마나 자주 FIQ가 작동합니까? 단순히 모든 프로세서 시간을 소모하는 것처럼 들릴 수 있습니다. – PeterJ

+1

흠 .. 'IO_BLAH_BLAH_BLAH()'함수는 R0-R7을 사용합니까? '__fiq'attrib 신호가 컴파일러에 R8-R14 만 사용하기 때문에 실제 FIQ 처리기 자체가 실행되지 않는다고 추측하고 있지만 핸들러가 다른 것을 호출하면 R0-R7이 손상 될 수 있습니까? –

답변

1

아마도 한 스택이 넘쳐 흐르고 다른 스택을 손상시킬 수 있습니다. FIQ, IRQ 및 기타 스택을 올바르게 초기화했으며 스택마다 충분한 메모리를 예약했는지 확인하십시오.

+1

+1 - 예, 좋은 가능성이 있습니다. 지금까지 필자는 모든 스택을 사용하지 않는 모든 어셈블러 FIQ 핸들러를 없애 버렸습니다. 스왑 레지스터 만 가능하지만 항상 가능하지는 않습니다. –

+0

감사합니다. 어셈블러 (IDE에서)를 확인하고 IRQ 메모리 및 코드 최적화 관련 구성을 찾았습니다. 모든 메모리 및 코드 최적화 기능을 해제했습니다. 더 이상 그 핸들러에 100 % 의존 할 수 없습니다 .... –