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)를 통해 문자를 보내면 시스템이 즉시 다시 잠긴다. -_-! 뭐가 문제 야?
여기에 작성해야 할 중요한 정보가 빠진 경우 알려주십시오.
얼마나 자주 FIQ가 작동합니까? 단순히 모든 프로세서 시간을 소모하는 것처럼 들릴 수 있습니다. – PeterJ
흠 .. 'IO_BLAH_BLAH_BLAH()'함수는 R0-R7을 사용합니까? '__fiq'attrib 신호가 컴파일러에 R8-R14 만 사용하기 때문에 실제 FIQ 처리기 자체가 실행되지 않는다고 추측하고 있지만 핸들러가 다른 것을 호출하면 R0-R7이 손상 될 수 있습니까? –