외부인터럽트

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

위 내용은 그저 사전적인 내용일 뿐이고 대부분의 경우에서 외부 인터럽트는 마이크로 프로세서 외부의 특정 상태(입력 펄스의 상승/하강 에지 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 )

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

 

 


브로드 캐스팅 방법을 이용하여 ADC값을 데이터로 전송한다.

이때 버튼 1번을 누르면 Sleep모드로 전환되고 버튼 2번을 누르면 Wake 모드로 전환된다.




버튼 1을 누르면 빨간색 LED가 켜지고 초록색 LED가 꺼진다.

버튼 2을 누르면 빨간색 LED가 꺼지고 초록색 LED가 켜진다.


가변저항의 저항값을 변경시면 AD변환을 통해 나온 결과값을 시리얼창에 출력하는 프로그램

버튼을 누르면 게임이 시작되며 같은 문자를 2개 클릭하면 사라집니다.
모든 문자를 삭제하면 클리어!





1. 객체지향의 다섯 개의 개념

 

객체란 객체지향 프로그램을 작성하는데 사용되는 것들이다.

객체지향은 어떠한 목적을 이루기 위해 협업하도록 구성 되어지는 객체들의 집합이다.

객체지향은 아래와 같이 5가지의 기반 개념으로 나눌 수 있다.

 

1) Objects //객체

2) Classes //클래스

3) Encapsulation //캡술화

4) Inheritance //상속

5) Polymorphism //다형성

 

//2345번은 아래의 과제에 있으니 생략

객체에 대해서 더 자세하게 설명하자면

모든 객체는

-데이터를 가지고 있다.

데이터는 각 객체들의 상태를 기술하는 정보를 가지고 있다.

 

-행위의 집합을 알고 있다.

행위란 객체가 메시지를 받았을 때 어떠한 작동을 해야하는지 알고있는 것입니다.

 

-개체를 구분하는 아이덴티티를 가지고 있다.

하나의 객체를 다른 객체와 구분하는 것을 가능하게 합니다.

 

간단하게 이렇게 설명할수 있습니다.

 

2.패키지 클래스 인스턴스

 

패키지 패키지란 비슷한 클래스들을 묶어놓은 집합체이다.

 

package Java;

public class Daeduck{}

 

또는

package Java;

public class Soft_ware{}

 

이러한 형식으로 선언된 클래스들을 사용하기 위해서는

import Java.Daeduck;

으로 다른 클래스에서 import할 수 있습니다.

 

또는 다음과 같이 *기호로도 이용 할 수 있습니다.

import Java.*

 

*을 사용하면 Java패키지내의 모든 클래스를 import합니다.

 

클래스 클래스는 객체 생성의 Blueprint입니다. (Blueprint란 아키텍쳐 또는 공학 설계를 문서화한 기술 도면을 인화하거나 복사한 도면이라고 정의합니다.)

또는 데이터와 함수의 집합이다.

클래스는 객체가 소유하게 될 속성(attributes)과 행위(behaviors)를 정의합니다.

 

변수 -> 배열 -> 구조체 -> 클래스

클래스를 이용해 다량의 데이터를 보다 쉽게 다룰 수 있습니다.

 

새로운 클래스를 생성하는 일은 두분으로 나뉜다.

 

1. 객체의 상태를 저장하는데 사용될 속성을 정의 합니다.

 

2. 객체가 이해할 수 있는 메세지와 메세지에 응답하는 과정을 정의 합니다. 각각의 메세지에 대해 메소드(method)라고 불리우는 프로시저를 만들고, 이것을 구현합니다.

 

인스턴스 - 인스턴스란 클래스의 정의를 통해 만들어진 객체를 의미하는 것이다.

class Test {

Person p1; // Person 타입의 객체

p1 = Person(); // 인스턴스

}

 

/*

클래스 : 설계도

인스턴스 : 제품

/

!!!클래스를 인스턴스화 할 때는 변수에 담아야 한다는 것과 이 때 사용하는 변수의 데이터 타입은 그 클래스가 된다는 점이다.!!!

 

 

 

 

 

 

3 상속

 

동물과 개의 상속관계로 나타 내보았다.

 

Animal.java

public class Animal {

String name;

 

public void setName(String name) {

this.name = name;

}

}

 

Dog.java

public class Dog extends Animal {

 

}

이렇게 선언하게 된다면 Dog클래스는 Animal 클래스를 상속했다고 말할 수 있다.

Dog클래스에는 name이라는 변수와 setName이라는 메소드를 선언하지 않았지만 Animal클래스를 상속했기에 선언이 되어있지 않아도 사용이 가능하다.

 

상속의 특징을 정리하자면

1. 하위 클래스는 상위 클래스에 있는 모든 public으로 지정한 인스턴스 변수와 메소트를 상속합니다. 하지만 private로 지정한 인스턴스변수와 메소드는 상속하지 않습니다.

 

2. 다중상속이 불가능하다

2개이상의 클래스를 한번에 상속할 수 없습니다.

 

3. 동일한 이름의 변수가 부모클래스와 자식클래스 두 개다 존재한다면 부모클래스의 변수는 가려집니다.

즉 부모클래스의 변수<자식클래스의 변수 (자식클래스의 변수가 더 우선입니다.)

 

4. 부모의 생성자는 상속되지 않습니다.

 

4.캡슐화

 

캡슐화란 객체지향의 가장 기본이 되는 원칙이다.

 

캡슐화란 자세한 내부구현을 외부에 드러내지 않고 숨기는 것이라고 할 수 있다.

 

 

캡슐화를 하게 되면 내부에 데이터를 어떻게 저장하는 지, 그 데이터를 어떻게 처리하는 지, 또는 특정 기능을 어떻게 제공하는 지에 대한 내용은 드러내지 않는다.

객체가 어떤 기능을 제공하는지만 공유 할 수 있다.

예를 들면 계산기에서 어떤 타입의 변수를 사용하는지 어떻게 구현했는다의 정보는 외부로 들어내지 않고

곱하기, 나누기, 더하기, 빼기 등의 기능만 제공하는 것이다.

캡슐화를 하게 되면 기능을 변경해야 하는 상황이 발생할 경우 특정 클래스로만 변화가 수렴되는 특징을 갖게 된다.

 

캡슐화방법

//일반적인 변수선언방법

int x;

int y;

//캡슐화시킨 변수선언

private int x;

private int y;

 

5. 메시지의 개념을 이해하고 예를 들어 구체적으로 설명하시오.

메시지 정의 : 객체에 일을 시키는 행위. 각각의 객체는 모두 메시지를 통해

다른 객체와 통신, 상호작용을 한다. parameter의 형태로 전달이 된다.

 

ex)

Sum.plus(10);

 

Sum : 메시지를 받는 객체.

plus : 메시지의 이름

10 : 매개변수

 

6. 추상화의 개념

 

추상화의 정의 : 프로그래밍 입장에서의 추상화는 데이터들의 공통적인 특징을 뽑아내는 것이다. 꼭 객체지향 언어만이 아니라 절차지향 언어에도 존재하는데, c언어에서의 구조체가 바로 그것이다. c언어에서의 구조체라면, java언어 등 객체지향 언어에서는 class를 정의 하는 것이 추상화라고 할 수 있겟다.

 

추상 클래스 : 완성되지 못한 class를 말한다. 추상 클래스 자체는 class로써의 역할으르 못하지만, 조상 class로써의 중요한 의미를 갖는다.

 

선언법 :

abstract class NAME {

...

}

 

추상 메서드 : method는 선언부, 구현부로 나뉘는데 선언부만 작성해 놓은 method를 말한다.

 

선언법 :

abstract RETURNTYPE NAME ();

 

여기서, abstract를 굳이 사용하는 이유는, 자손 class에서 추상method를 반드시 구현하도록 하기 위해서이다. 만약, 추상 method를 정의되어있지 않다면, 상속을 받는 자손 class는 추상 method가 아닌 모두 다 구현된 method로 판단하고 오버라이딩을 통해 자신에 맞춰서 구현하지 않을 수 있기 때문이다.

 

ex)

요즘 학생들이 즐겨하는 게임에 나오는 챔피언들을 class로 만들어 보았다.

 

class Katarina {

int x, y; //위치

void move(int x, y)//이동위치

void stop()

void Death Lotus ();

}

 

class Blitzcrank {

int x, y; //위치

void move(int x, y)//이동위치

void stop()

void StaticField();

}

class Draven {

int x, y; //위치

void move(int x, y)//이동위치

void stop()

void WhirlingDeath()

}

 

이를 공통부분으로 뽑아내 추상class로 만들고, 상속받도록 변경을 해보면,

 

abstract class ChampMove {

int x, y; //위치

abstract void move(int x, y);//이동위치

abstract void stop();

}

 

class Katarina extends ChampMove{

void move(int x, int y)

void Death Lotus ()

}

 

class Blitzcrank {

void move(int x, int y)

void StaticField();

}

class Draven {

void move(int x, int y)

void WhirlingDeath()

 

 

위와 같이 쓸 수 있을 것이다.

 

7. 다형성의 개념

다형성이란, 부모의 객체에 자녀를 담는 것이다. 부모의 객체를 자녀로 생성하였을 경우에는 부모의 변수만 사용할 수 있다.

 

 

 

 

ex)

class cl1 {

 

String x = "부모";

String y = "부모";

 

}

 

class cl2 extends cl1{

 

String y = "자녀";

String z = "자녀";

 

}

 

public class exam01 {

 

public static void main(String[] args) {

 

cl1 tset1 = new cl1();

System.out.println(tset1.x);

System.out.println(tset1.y);

cl2 tset2 = new cl2();

System.out.println(tset2.x);

System.out.println(tset2.y);

cl1 tset3 = new cl2();

System.out.println("다형성 규칙에 의하여 부모클래스에 있는 : " +tset3.x);

System.out.println("다형성 규칙에 의하여 부모클래스에 있는 : " +tset3.y);

 

}

 

}

 

실행결과

부모

부모

부모

자녀

다형성 규칙에 의하여 부모클래스에 있는 : 부모

다형성 규칙에 의하여 부모클래스에 있는 : 부모

 

무조건 부모의 것을 사용하여야 하는 이유는 객체를 하나로 통일시키기 위해서이다.

, object객체를 이용한다면, 무조건 부모의 변수를 사용하지 않아도 된다.

 

출처 :

http://cafe.naver.com/breakjava/49

 

http://cafe.naver.com/gisdev/461

 

http://cafe.naver.com/breakjava/49

 

https://wikidocs.net/280

'프로그래밍 언어 > JAVA' 카테고리의 다른 글

자바 프로그래밍 쓰레드(Thread)#1  (0) 2015.10.02

외부 인터럽트



인터럽트 처리


(이 다음 내용부터는 ATmega128을 기준으로 설명합니다.)

ATmega128에는 리셋을 포함하여 총 35개의 인터럽트 소스를 제공한다.



위 그림은 ATmega128에서 제공하는 인터럽트 소스들을 표로 나열한 것이다.

(출처 : http://miobot.tistory.com/25)


프로그래밍 언어에서 연산자들의 우선순위가 존재하듯이 인터럽트 레지스터 들에도 우선순위가 존재한다.

인터럽트 레지스터의 우선순이는 가장 낮은 주소를 갖는 인터럽트가 가장 높은 우선순위를 갖는다.

즉 위에 표를 보면 RESET 레지스터가 $0000으로 가장 높은 우선순위를 가지고 INT0이 $0002로 두번째 높은 우선순위를 갖는다.


인터럽트가 발생하여 인터럽트 서비스 루틴으로 점프하게 되면 전역 인터럽트 인에이블 비트인 SREG 레지스터의 I비트는 0으로 셋되며 모든 인터럽트가 무시된다. 이는 사용자가 직접 인에이블 시키기 위하여 셋 할수도 있다.


이벤트에 의하여  발생하는 인터럽트의 경우  이벤트가 발생했을 때 인터럽트 플래그가 셋된다. 만약 인터럽트 플래그가 클리어되고 인터럽트 조건이 유지된다면 인터럽트 플래그는 다음 이벤트가 발생할 때 까지 셋되지 않는다.


다음에는 외부인터럽에 대해서 더 자세하게 알아보자


'임베디드 시스템' 카테고리의 다른 글

AVR, Atmega128, 외부 인터럽트  (0) 2023.06.20
외부 인터럽트 개념 <인터럽트란?>  (0) 2016.06.23
외부 인터럽트



인터럽트란?


 MCU에서 입력을 받아들이는 방법에는 두가지가 있는데, 하나는 사용자가 명령어를 사용하여 입력핀의 값을 계속 또는 주기적으로 읽어서 변화를 알아내는 폴링(polling)방식이고, 다른 하나는 MCU 자체가 하드웨어적으로 그 변화를 체크하여 변화 시에만 일정한 동작을 하는 인터럽트(interrupt)방식이다.  


아래 그림은 인터럽트의 개념도를 그림으로 나타냈다.

인터럽트는 외부 또는 내부에서 인터럽트 소스(즉 원인)에 의하여 MCU에게 인터럽트신호가 전달되면 MCU는 미리 정해진 작업(인터럽트 서비스 루틴)을 실행한다. 인터럽트가 발생했을때 MCU는 지금까지 하던 프로그램을 일단 중지시키고 사용자에의해 정해진 인터럽트 서비스 루틴을 실행하게 되며, 그 루틴의 실행이 종료되면 다시 원래 실행하던 프로그램으로 돌아가 하던일을 계속하게 된다.

그리고 인터럽트 벡터 테이블이라는것이 존재한다.

인터럽트 벡터 테이블은 각각의 인터럽트 핸들러의 시작 번지를  모아 놓은 것이라고 정의한다.



그렇다면 폴링방식과 인터럽트방식의 차이점은 무엇일까?

폴링 방식에서는 입력핀의 변화를 확인하기위하여 입력핀의 값을 계속 읽을 필요가 있지만 인터럽트 방식에서는 하드웨어적인 변화가 있으면 자동적으로MCU에게 신호가 전달되는 방식이기 때문에 직접 입력핀의 값을 읽을 필요가 없다. 또한 폴링방식은 모든 경우의 입력 또는 값의 변화에 대응하여 처리가 가능하지만 인터럽트 방식은 하드웨어적으로 지원되는 몇개의 입력 또는 값의 변화에만 대응처리가 가능하며 처리속도는 일반적인 경우에 인터럽트 방식이 폴링방식보다 더 빠르다.

 

다시 정리한다면

인터럽트를 발생시킬 수 있도록 만들어진 것(외부 입력 핀, 타이머, 시리얼 포트 등) - 인터럽트 소스(interrupt source)

인터럽트 발생시 분기장소 즉 시작위치를 기록해 놓은 특정번지들의 내용 - 인터럽트 벡터 테이블(interrupt vector table)

인터럽트가 발생 하였을 때 그 인터럽트를 처리하는 프로그램 - 인터럽트 서비스 루틴(interrupt service routine)

라고 한다.




+ Recent posts