마이크로컨트롤러(uC)가 어떤 작업을 수행하고 있는 도중에 특수한 이벤트가 발생하면 수행 중인 작업을 중단하고 발생한 이벤트를 처리한 후 이전에 수행하던 작업으로 되돌아가 나머지 작업을 계속 처리하게 된다. 이러한 ‘즉시 처리해야 하는 특수한 이벤트의 발생’을 인터럽트(interrupt)라고 한다. 인터럽트가 발생하면 uC는 그것을 처리하는 작업들이 수록된 함수로 명령 수행 과정을 옮기게 되는데 이 함수를 인터럽트 서비스 루틴 (interrupt service routine, 이하 ISR)이라고 한다

.

 인터럽트는 uC시스템에서 굉장히 중요한 비중을 차지한다. 비유를 들어서 설명하자면 어떤 전화기가 있는데 전화가 걸려왔는데도 벨소리도 안 나고 진동도 안 된다고 가정해보자. 이 전화기로 꼭 받아야만 하는 중요한 전화가 올 예정이라면 그 사람은 다른 일은 못하고 몇 초에 한 번씩 전화가 왔나 안 왔나 들어서 확인해 봐야 할 것이다. 하지만 전화가 걸려왔을 때 벨소리가 나거나 진동하는 전화라면 편하게 다른 일을 하고 있다가 전화가 오면 벨소리를 듣고(인터럽트 요구) 전화를 받아 용무를 처리한 후 하던 일을 계속할 것이다.


 이전 포스트에서 사용된 버튼을 가지고 더 설명하면 ‘버튼이 눌려졌다.’라는 특수한 이벤트를 감지하려면 uC가 main()함수 내에서 항상 주기적으로 이 버튼의 상태를 검사했어야 했다. 하지만 이것을 인터럽트로 처리하면 uC입장에서는 이 버튼의 상태를 항상 검사할 필요가 없이 다른 일을 할 수가 있는 것이다. 다른 작업을 하고 있다가 ‘버튼이 눌려지면’ 그 즉시 인터럽트를 발생하여 하던 일을 멈추고 이를 처리할 ISR을 호출한 뒤 ISR이 끝나면 하던 일을 다시 하면 되는 것이다.


 이와 같이 (외장 혹은 내장) 주변기기와 uC가 통신을 수행하는데 있어서 uC가 주변기기의 상태를 메인루틴에서 상시 검사하지 않고 인터럽트로 처리하면 전체적인 시스템의 운용 효율이 매우 높아지게 된다.


[그림 1] 인터럽트의 개념도


 AVR에서 처리하는 인터럽트는 크게 외부 인터럽트와 내부 인터럽트로 나눌 수 있다. 외부 인터럽트는 용어 그대로 외부에서 발생하는 신호이고 내부 인터럽트는 내장된 주변 장치(타이머/카운터, ADC 등등)에서 발생하는 것이다.



Posted by 살레시오
,