인터럽트 중첩의 위험성

2019. 5. 10. 18:14임베디드/ATmega128

1. 재귀호출은 익숙하지 않다면 메모리 오류 혹은 디버깅을 하기 어려운 구조다. ISR에서 또 다른 ISR을 호출한다면 더군다나 작은 메모리의 스택 영역은 넘칠 위험이 있다

 

2. 8비트 마이크로컨트롤러인 ATmega128은 일반적인 int 데이터인 16비트 데이터를 처리할 땐 최소 2클럭이 필요하다. 즉 상위, 하위바이트 2번을 처리해야 한다. 하지만 상위 바이트를 처리하고 나서 다른 ISR에 호출되고, 호출된 ISR에서도 똑같은 value를 처리한다면 다시 복귀된 ISR에서는 다른 value 값으로 변경되는 의도치않은 상황이 나올 수 있다.

 

ATmega128은 이를 위해 중첩 인터럽트를 사전에 차단하고 있다. ISR을 실행하기 이전에 전역 인터럽트 활성비트(SREG 레지스터의 I비트)를 자동으로 클리어하여 인터럽트 발생을 금지하고, ISR에서 반환하기 이전에 전역 인터럽트 활성 비트를 자동으로 세트하여 다시 인터럽트 발생을 허용한다. 인터럽트 도중 또 다른 인터럽트가 발생하면 스택에 저장해야 할 데이터가 증가하게 되고, 메모리 크기가 작은 MCU는 곧 스택이 넘치는 상황을 맞이하게 된다.