만져보는 임베디드 시스템/아두이노 소프트웨어

아두이노 소프트웨어-xv. 함수 - 인터럽트 개념

hanjinee 2021. 1. 5. 13:18

안녕하십니까 제타지니입니다. 오늘은 인터럽트의 개념에 대해서 설명하겠습니다.

인터럽트라는 놈이 있습니다.

이놈은 너무나도 악독해서, 프로세서가 어떤 명령을 수행중인 중간에 끼어들죠.

사실 악독한 놈이라기 보단, 하드웨어와 소프트웨에서 상당히 중요한 분이시며, 많이 사용되어지는 기법 중의 하나입니다.

자 한번 알아보시죠

인터럽트, Interrupt

방해하다. 중단시키다. 라는 뜻을 가진 영어입니다.

뜻 그대로 현재 수행중인 프로그램을 중단시키는 놈이지요.

그림으로 조금 더 쉽게 알아보자면, 그림으로 나타내야죠.

그러니까 이대로 설명을 드리자면, 프로그램이 실행되는 도중에, 인터럽트가 발생하면 실행중인 프로그램을 잠시 멈추고 인터럽트 서비스 루틴, 즉 인터럽트가 걸렸을 시에 동작되는 프로그램을 실행시키고, 완료가 되면 다시 중단 되었던 메인 프로그램으로 돌아가 작업을 수행하는 것이지요.

그러니까 쉽게 나타내서 내일 시험이 있어서 공부하고 있는데, 갑자기 배가 살살 아프더라 말이죠? 하.. 그래서 배가 아프면 화장실을 갔다와서 다시 공부해야 겠죠? 즉, 여기서 주 프로그램인 '공부'가 잠시 멈춰지고 인터럽트인 '화장실을 가서 용변을 보고 온다' 라는 개념이 적용되고, 다시 주 프로그램으로 복귀해서 '공부'하는 것으로 이해하시면 될겁니다.

 

간략하게 순서는 이렇게 됩니다.

1. 프로그램 실행 중 인터럽트가 걸림

2. 인터럽트 서비스 루틴 처리

3. 다시 원래의 프로그램으로 돌아와 실행.

 

이런 식인데, 한번 자세히 알아보겠습니다.

*인터럽트란?

프로그램이 실행 중에 예기치 않은 상황이 발생할 경우 실행 중인 프로그램을 중지 시키고, 발생된 상황을 처리하고 다시 중단된 주 프로그램으로 복귀하여 실행하는 것을 이야기 합니다.

인터럽트 발생 순서는 다음과 같지요.

*인터럽트의 구성 요소

-발생원(source) : 인터럽트를 요청한 누군가에 대해 말합니다.

-우선순위(priority) : 인터럽트가 여러개 발생 하였을 때, 우선순위를 따져 인터럽트를 처리합니다.

-인터럽트 벡터(interrupt vector) : 인터럽트가 발생하였을 때 그 인터럽트를 처리할 수 있는 서비스 루틴들의 주소를 가지고 있는 공간입니다.

 

 

*인터럽트 종류

-하드웨어 인터럽트

1) 하드웨어의 고장, 정전, 기계 이상으로 인한 인터럽트를 실행

2) 외부 인터럽트 : Timer나 조작원(Controller)에 의한 인터럽트 실행

3) 입출력(I/O) 인터럽트: 입출력 작업의 종류 및 입출력 상의 오류로 인한 인터럽트

-소프트웨어 인터럽트

1) 프로그램 인터럽트

>프로그램 실행 중 오류나 예외 발생으로 인한 인터럽트 발생

2) SVC(Supervisor Call: 감시프로그램 호출) 인터럽트

>프로그램 내에서 특별한 서비스를 요구하는 경우 발생

>운영체제 감시 프로그램이 의도적으로 발생시키는 인터럽트

 

하지만, 아두이노는 기기에 의해서 인터럽트가 발생하지요? 아두이노에서의 인터럽트라고 한다면, 위의 종류에서 [하드웨어 인터럽트]라고 하면 되겠습니다.

 

 

자 그럼, 아두이노에서는 인터럽트를 어떻게 처리할까요?

가장 대표적인 보드 우노 보드를 보지요.

우측 하단에 보시면!!!

보이십니까 INT0, INT1 ????

우노와 비슷하게, 대부분의 아두이노 보드는 핀 2번과 3번을 통해 인터럽트 0과 인터럽트 1의 두 개 외부 인터럽트를 사용할 수 있습니다.

(물론 보드 종류에 따라 다르지요.)

또한 아두이노 [두에, DUE] 보드는 모든 핀에서 인터럽트를 사용할 수 있는 강력한 인터럽트 기능을 가지고 있음과 동시에, 인터럽트 번호가 아닌 핀 번호로 직접 사용할 수 있다는 장점을 지니고 있지요.

 

출처 : https://www.arduino.cc/en/Reference/AttachInterrupt

 

attachInterrupt() - Arduino Reference

Example Code const byte ledPin = 13; const byte interruptPin = 2; volatile byte state = LOW; void setup() { pinMode(ledPin, OUTPUT); pinMode(interruptPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE); } void loop() { d

www.arduino.cc

위에 나온 설명은 각 아두이노 보드가 몇 번 핀에 인터럽트를 가지고 있는 지를 설명합니다.

 

다음 포스트에서는 아두이노에서 쓰이는 인터럽트 함수를 한번 보지요.

728x90