열심히 삽질하였다….
그리고, 하다하다 안되서 Linker listing 을 확인해 보니 Timer Interrupt 코드가 링크되지 않는 문제를 발견하였다.
문제의 발단 :
정말 아무생각 없이…. 정말 평소에는 나만의 명명규칙으로 이름을 잘 짓다가 정말 아무생각 없이 인터럽트 함수를 ‘TIMER0’, ‘TIMER1’ 이라고 지었다. (요즘 내가 정신이 탈출한 상태다.)
#pragma vector=timer0
__interrupt void TIMER0(void)
{
… 블라블라 …
}#pragma vector=timer1
__interrupt void TIMER1(void)
{
… 블라블라 …
}
평소같았으면 내가 고정으로 사용하는 “Timer_InterruptN” 이라는 명명을 하였을 텐데, 정말 아무생각 없었다.
그 결과 :
Global Interrupt 만 Enable 하면 시스템이 얼어버린다.
당연히 얼 수 밖에 없는게, 인터럽트가 발생해서 호출은 해야 겠는데 그 호출을 받을 함수가 링킹되지 않아버리니 중간에 떠버린 상태인 것이다.
Aㅏ………………. 경고조차 없는 멋지고 깔쌈한 내 프로그램이 돌지 않는다니….
해결 방법 :
함수 이름을 바꾸었다. 그리고 빌드…, 그리고 Linker listing 을 확인해보니
생겼다!!!!!
아마도 IAR MCS-51 에서 TIMER0, TIMER1 과 같은 이름은 사용할 수 없는 것으로 보인다. (하지만 IAR 메뉴얼에는 관련 내용을 찾을 수 없다.)
교훈 :
분명 문제가 없는데 변수의 값이나 함수 호출에 문제가 발생한다.
Linker listing 생성을 활성화 하고 확인하도록 하자!