외부인터럽트

외부 인터럽트란, 마이크로 프로세서와 독립되어 있는 외부 장치에 의하여 발생되는 순수한 의미에서의 인터럽트이다. 일반적으로 그냥 인터럽트! 하면 대부분은 이것을 뜻하는 거라고 봐도 된다.

위 내용은 그저 사전적인 내용일 뿐이고 대부분의 경우에서 외부 인터럽트는 마이크로 프로세서 외부의 특정 상태(입력 펄스의 상승/하강 에지 or 레벨 입력)등을 소스로 하여 동작되는 구조이다.


Atmega128에서의 외부 인터럽트

Atmega128은 총 8개의 외부 인터럽트를 가지고 있다.

INT0~INT7로 표기하며, 각각의 인터럽트에 대응되는 핀은 다음과 같다.

INT0 PD0
INT1 PD1
INT2 PD2
INT3 PD3
INT4 PE4
INT5 PE5
INT6 PE6
INT7 PE7

해당 인터럽트의 설정값을 변경하여 원하는 타이밍과 방식으로 인터럽트 발생 시점을 제어할 수 있다.

제어를 위해 설정이 필요한 레지스터들은 다음과 같다.

외부 인터럽트 레지스터 레지스터 설명
EICRA 외부 인터럽트 제어 레지스터 A
EICRB 외부 인터럽트 제어 레지스터 B
EIMSK 외부 인터럽트 마스크 레지스터
EIFR 외부 인터럽트 플래그 레지스터

각 레지스터는 특수한 기능 설정의 역할을 담당하고 있다.


EICRA, EICRB

EICRA와 EICRB 레지스터를 사용하여 인터럽트의 트리거(인터럽트가 발생되는 타이밍이라고 생각하면 편함)를 설정한다.

EICRA는 INT0~INT3까지의 인터럽트에 대한 설정을, EICRB는 INT4~INT7까지의 인터럽트에 대한 설정을 진행하며,

각각의 비트는 다음과 같다.

그림2. INT0~INT3 EICRA 레지스터 비트

 

그림3. INT4~INT7 EICRB 레지스터 비트

 

ISCn0과 ISCn1의 비트를 설정하여 인터럽트 발생 타이밍을 제어할 수 있다.(인터럽트 발생 이벤트에 대한 설정)

그림 4. EICRA의 ISCn0,1 비트 설명

예) INT0을 사용한다 가정하였을 때

EICRA = 0b00000000; // LOW상태일 때 인터럽트 발생

EICRA = 0b00000001; // NONE

EICRA = 0b00000010; // 하강에지에서 인터럽트 발생

EICRA = 0b00000011; // 상승에지에서 인터럽트 발생

그림 5. EICRB의 ISCn0,1 비트 설명

예) INT4를 사용한다 가정하였을 때

EICRB = 0b00000000; // LOW상태일 때 인터럽트 발생

EICRB = 0b00000001; // 하강에지와 상승에지에서 인터럽트 발생

EICRB = 0b00000010; // 하강에지에서 인터럽트 발생

EICRB = 0b00000011; // 상승에지에서 인터럽트 발생


상승에지와 하강에지란?

상승에지란, 상태값이 0에서 1로 변화되는 순간을 말한다.

하강에지란, 상태값이 1에서 0으로 변화되는 순간을 말한다.

(상태값 0 = LOW , 1 = HIGH )

이것을 그림으로 표현하면 다음과 같다.

그림 6. 상승, 하강 에지 설명 그림


EIMSK

EIMSK 레지스터는 외부 인터럽트를 Enable / Disable의 설정을 위한 레지스터이다.

그림 7. EIMSK 레지스터 비트

해당 레지스터의 값을 설정하여 원하는 외부 인터럽트를 활성화시킬 수 있다.

EIMSK 레지스터에서 설정 + SREG 레지스터의 I비트가 설정되어 있어야 제대로 활성화가 이루어진다.

EICRA or EICRB 레지스터의 설정에 따라 인터럽트가 활성화됨

 

예) INT3, INT5를 활성화한다.

EIMSK = 0b0010100; //INT5, INT3 활성화


EIFR

EIFR 레지스터는 위에서 설명한 레지스터 (EIMSK, EICRA, EICRB)의 설정값에 따라 외부 인터럽트가 활성화되고 외부 인터럽트가 발생하였을 때 해당 번호에 따른 비트가 SET 된다.

그림 8. EIFR 레지스터 비트

해당 레지스터와 EIMSK의 설정값이 동일(EIFR = 0x01, EIMSK = 0x01 / 즉 활성화시킨 외부인터럽트에 인터럽트가 발생되면)하면 MCU의 인터럽트 벡터로 점프한다. 이후 해당 벡터에서 벗어나면 EIFR 플래그가 지워진다.


주의.

해당 인터럽트 벡터에 딜레이 or 반복문을 통한 무한루프가 존재할 시 다른 인터럽트가 발생해도 해당 벡터로 넘어가지 못하며, main 루프 또한 돌아오지 못하는 현상이 발생하므로, 인터럽트 루틴 내부에서는 딜레이함수와 반복문 사용을 자제하는 것이 좋다.

추천하는 방식으로는 인터럽트 루틴내부에서는 특정 플래그만 set 하고, 해당 플래그에 대한 처리는 main에서 하는 것이 좋다.

int int0_flag = 0;

ISR(INT0_vect){ //INT0 인터럽트 벡터
	int0_flag =1; // 인터럽트 발생시 플래그 set
}

main(){
	while(1){
    	if(int0_flag == 1){ // main에서 인터럽트 발생시 set되는 플래그를 가지고 처리
        	LED ON //해당되는 동작
            int0_flag = 0; // 플래그 off
        }
    }
}

모든 상황에서 위 방식이 좋다!라고 단정 지을 수는 없다.

하지만 인터럽트 자체가 main루프를 수행하는 도중에 끼어들기 때문에 정밀처리나 실시간 처리과정에서는 꽤나 타격이 있는 경우가 많았다. 물론 매우 우선도가 높은 기능에 대한 인터럽트가 발생한다면(긴급정지 or 종료) 인터럽트 루틴 내에서 처리하는 게 맞지만 가급적이면 지양하는 편이다.

추가적으로 개인적인 경험으로 외부 인터럽트 설정과 관련되어 얘기하자면, 인터럽트 인에이블과 SREG설정은 인터럽트 설정이 완료된 다음에 진행하는 것이 좋다.

예를 들어

sei(); //SREG 설정
EIMSK = 0b00010001;
EICRA = 0b00000011; //EICRA 설정 INT0 하강에지
EICRB = 0b00000010; //EICRB 설정 INT4 상승에지

위와 같이 코드를 작성할 경우 정말 운이 안 좋으면 EIMSK = 0b00010001; 코드가 진행되고 인터럽트가 발생될 수 있다.

이유로는 SREG와 EIMSK가 설정되어 인터럽트가 enable 된 후 EICRA와 EICRB를 설정하기 전까진 디폴트 값으로 설정이 되어있는 상태이기에 개발자가 원하던 상황이 아닌 상황에서도 인터럽트가 발생할 수 있다.

따라서 enable은 인터럽트 설정이 완료된 후 진행하는 것이 바람직하다.

EICRA = 0b00000011; //EICRA 설정 INT0 하강에지
EICRB = 0b00000010; //EICRB 설정 INT4 상승에지
EIMSK = 0b00010001;

sei(); //SREG 설정

 

 

웹 서버 ( 을 )

-  인터넷 어딘가에 설치되어있음

웹 클라이언트 ( 갑 )

- 자신의 집 컴퓨터에 설치되어 있는 인터넷 브라우저

클라이언트(요청) -> 공유기 -> 서버(응답) 

ex) 웹 브라우저에서 웹 서버에 접속 시도를 할 경우 클라이언트에서 웹 서버로 사이트정보를 요청, 웹 서버는 클라이언트에게 요청한 정보에 해당되는 정보를 보내준다. ( 홈페이지 화면 등 )

집에서 웹서버를 구축시 단점

  • 항상 켜져 있어야하는 웹 서버구조상 전기세가 많이 발생할 가능성이 있음
  • 가정용 인터넷의 경우 간혹 네트워크 오류가 발생하여 웹서버가 종료될 가능성이 있음
  • 유동IP로 인하여 웹 서버의 IP주소가 변경될 가능성이 있다. ( 가장 큼, DDNS로 해결은 가능 )

공유기는 하나의 회선(KT,SKT 등등)으로 여러 네트워크 장치가 네트워크에 접속하기 위한 역활을 한다.

공유기에 연결된 웹 서버는 사설 Ip이므로 외부의 웹 클라이언트는 직접 웹서버 ip로 접속 할 수 없다.

이러한 문제를 해결하기 위해 '포트포워딩' 기술을 사용해야한다.

포트 포워딩

ex ) 웹 서버의 ip : 192.168.0.1 / 공유기의 ip 123.123.123.123 

웹 클라이언트가 웹 서버로 접속할 시 공유기의 ip ( 123.123.123.123)의 특정한 포트에 접속 요청을 보낸다. 

ex ) 웹 클라이언트 (접속 요청)-> 123.123.123.123:80 ( 123.123.123.123 ip주소의 80번 포트 )

공유기에서는 80번쨰 포트로 요청된 정보를 해당되는 기기의 ip의 특정한 포트로 보내준다

ex ) 123.123.123.123:80 (공유기) - > 웹 서버의 사설 ip의 80번 포트 ( 192.168.0.1:80 )

웹 서버에서는 요청한 정보에 해당되는 정보를 웹 클라이언트에 다시 보낸다.

 

 


+ Recent posts