[AVR] 인터럽트

2013. 12. 3. 09:16 from MCU/AVR

 ATmega128로 다양한 종류의 인터럽트를 써보진 않았지만 그래도 익숙해질 정도는 했다가 생각한다. 이제 인터럽트에 대해 좀더 깊게 공부해보자




인터럽트 메커니즘


(출처 : http://cafe.naver.com/openrt)

 인터럽트는 어떻게 실행 되는것일까. 위 그림은 인터럽트 처리 과정을 보여준다. 인터럽트가 발생하면 미리 지정된 위치(인터럽트 벡터)로 점프하여 점프한 곳에 있는 코드(인터럽트 서비스루틴)을 처리한다.


 위 그림처럼 인터럽트가 발생하면 미리 지정된 위치로 분기[각주:1]하여 인터럽트를 처리한다. 그런데 이것은 함수가 분기하는 것과 거의 일치한다. 함수 또한 작업 도중에 함수를 호출하게 되면 다른곳으로 분기한다. 이와 같이 프로그램 실행 중 분기하여 다른 명령을 수행하는 것은 함수와 같으나 함수는 사용자가 직접 분기할 지점을 지정해 주므로 언제 분기하는지 정확히 알고 있다. 그러나 인터럽트가 발생할 사건은 언제 발생할지 모르는 불확정적인 것이다. 이것을 컴퓨터에서 비동기적(Asynchronous)라고 한다.




인터럽트 처리 과정과 인터럽트 플래그(Flag)


 ATmega128에는 35개의 인터럽트가 있다. 이 인터럽트들이 무작위로 실행되는 것이 아닌 우선 순위가 존재한다. 두개의 인터럽트가 동시에 발생하면 우선순위가 높은것이 먼저 실행되는 것. 그렇다면 만약에 한개의 인터럽트 수행 도중에 다른 인터럽트가 발생하면 어떻게 될까? 실제로 이런 상황은 사람이 직접 만들지 않으면 발생하지 않는다.


  1. 인터럽트 과정을 차례대로 알아보자. 먼저 인터럽트가 발생하면 인터럽트에 해당하는 플래그 비트가 set 된다. 이 플래그 비트는 프로그램에서 강제로 clear 할 수도 있지만 해당 이터럽트 서비스루틴이 시작되면 자동으로 clear 된다.
  2. 인터럽트 서비스루틴을 수행할 때 CPU 는 자동적으로 SREG.1 를 clear 하여 모든 인터럽트를 금지하고 서비스루틴의 종료와 함께 인터럽트를 허용한다. 따라서 인터럽트 수행 중 우선순위가 더 높은 인터럽트가 발생하더라도 이 처리는 이미 수행하고 있는 서비스루틴의 종료까지 연기된다. 그렇다면 이때 발생하면 인터럽트는 무시되는 것인가? 아니다.
  3. 인터럽트 서비스루틴 수행 중에 발생하는 인터럽트는 당장 처리되지는 않지만 플래그 비트를 set 한다. CPU 는 현재 수행 중인 인터럽트 서비스루틴을 종료한 후 모든 플래그 비트를 조사하여 플래그가 set 된 인터럽트 중 가장 우선순위가 높은 인터럽트를 처리하게 된다.


결과적으로 인터럽트 서비스루틴의 시작과 동시에 CPU 가 인터러트를 금지시키므로 한번 시작된 인터럽트 서비스루틴은 다른 인터럽트에게 선점 (Preempt) 되지 않는다. 경우에 따라서는 다른 인터럽트의 선점을 허용해야 하는데 이때는 인터럽트 서비스루틴 내에서 모든 인터럽트를 허용하는 어셈블리 명령 sei 를 수행하면 된다. 그전에 해당 인터럽트 마스크 비트가 set 된 인터럽트만 허용된다.


(출처 : AVR ATmega128 마이크로 컨트롤러 활용. 이인석 저)

  1. 분기의 사전적 의미 <컴퓨터> 프로그램의 실행 순서를 변경하여 다른 명령어를 실행할 수 있게 하는 일 [본문으로]

'MCU > AVR' 카테고리의 다른 글

[AVR] 카운트 계산법. TCNTn  (0) 2013.12.12
Datasheet 레지스터 보는 방법  (0) 2013.12.03
[AVR] 시작하기 전에 알아야 할 것들  (0) 2013.12.02
ATmega128 과 블루투스 연결하기  (4) 2013.10.23
[AVR] EEPROM 이란  (0) 2013.10.23
Posted by 나무길 :