20140508 (Interrupt, 서적관리 프로그램 작성, open)
56일차
----------------------
ATMega128 Interrupt
----------------------
--- 밥을 먹는데 큰게 마렵다. 그래서 화장실을 갔다와서 다시 밥을 먹었다.
여기서 큰게 마려운것을 Interrupt 라고 부른다.
어떤 작업 중에 어떤 신호를 받아서 그 신호를 처리 하는 것을 인터럽트라고 한다.
--- Polling
인터럽트와 반대되는 개념으로 똥이 마려운지 계속 생각하는 것을 말한다.
프로그램 코드로 짰을 경우 while, for문 등 반복문으로 어떤 신호를 받았나
계속 체크 하는 것을 말한다.
--- Interrupt, Polling 장단점
Interrupt
- 처리속도가 빠르다.
- H/W, S/W 적으로 처리되는 정해진 신호만 처리할 수 있음.
Polling
- 프로그래머가 구현함에 따라 여러 신호 처리 가능.
- 계속 신호를 확인해야 하므로 cpu를 많이 잡아먹는다.
인터럽트는 신호가 왔을 때에만 움직이기 때문에 평소에 다른 작업을 하는 등
cpu 점유율이 낮지만 폴링의 경우 계속 신호를 확인해야 하므로 그 확인 작업에
점유율을 차지하게 된다.
폴링은 프로그래머가 어떻게 구현하느냐에 따라 여러 신호를 만들어 낼 수 있지만
인터럽트의 경우 H/W 적으로 cpu가 처음 만들어 졌을때 정해진 신호와
S/W적으로 구현해 놓은 신호만 처리 가능하다.
--- H/W, S/W Interrupt
H/W Interrupt는 내부와 외부로 나뉘는데
내부는 메모리 침범, 0을 나누는등 그런일이 일어났을 때 내부 인터럽트라 하고,
I/O, 타이머, 시리얼 포트 입력신호, 등등 외부 장비에서 신호가 발생하는 것을 외부 인터럽트라고 한다.
ATMega128의 경우 내부, 외부가 이런식으로 나뉘는데
다른 장비의 경우 I/O, 타이머 등이 내부에 속해 있는 경우도 있다고 하는데
지금은 ATMega만 만지니깐 우선 패스~
S/W Interrupt는 소프트웨어적으로 인터럽트를 발생시키는 것인데
예로는 OS 영역에서 발생하는 것을 볼 수 있다.
Windows 계열의 경우 메시지,
Linux 계열의 경우 시그널 이라고 Interrupt를 이렇게 부른다.
--- ATMega128 Interrupt Vector Table
Interrupt 는 sram이 아닌 flash에 저장되어 있다.
flash의 경우 2byte를 한개의 번지로 저장한다.
그래서 Reset 번지의 용량은 4byte이다.
이 번지에는 각 함수의 주소가 저장되어 있다.
이렇게 인터럽트가 발생할 때마다 cpu에게 인터럽트 함수의 주소를 넘겨주는 방식을
벡터형 인터럽트라고 한다.
벡터형 인터럽트 방식은
즉시 인터럽트 서비스 루틴을 찾아가므로 인터럽트 응답시간이 빠르며, 이 인터럽트 응답시간이 주변장치의 수가 많고 적음에 영향을 받지 않는다.
이와 같은 장점 때문에 빠른 인터럽트 처리가 요구되는 마이크로컨트롤러에서는 대부분 이 방식을 사용하며, ATMega128에서의 인터럽트 처리도 모두 이와 같은 벡터형 인터럽트 방식으로 되어 있다.
ATMega128은 프로그램이 실행 시작했을 때 0번지 부터 시작한다.(엔트리 포인트)
Reset 함수가 저장되어 있는 곳을 따라가면 crtm128.o 를 실행을 먼저하고
crtm128.o에 main으로 실행되게 링크되어 있다.
제작사마다 엔트리 포인트가 다르기 때문에 꼭 0번지 부터 시작하는 것은 아니다.
--- 컴파일러마다 인터럽트의 함수 정의가 다른데
지금 사용 중인 WinAVR의 경우 함수 이름이 미리 정해져 있다.
다른 컴파일러의 경우 프로그래머가 조작이 가능한 컴파일러도 있다고 한다.
미리 정의된 함수 확인 방법은 main.map 파일안을 확인하면 된다.
밑 그림에 __vector_22.... 이 것들이 vector Num에 해당하는 함수 이름.
--- 인터럽트 함수 선언 방법
avr-gcc에서만 사용하는 문법.
__attribute__ 속성
signal 인터럽트 신호
used 사용하겠다
externally_visible 외부에서 보여준다(외부함수 호출 가능)
- C
--------------------
서적관리 프로그램
--------------------
--- 파일 열기
--- open
#include <fcntl.h>
int open( char *filename, int access, int permission );
저수준인 open 함수를 사용하여 파일을 연다.
첫번째 인자는 파일 주소
두번째 인자는 열기 옵션인데
fcntl.h 파일을 통해 옵션을 볼 수 있다.
세번째 인자는 보통 생략 가능하다.
S_IWRITE S_IREAD S_IWRITE | S_IREAD
The open() function returns an integer value, which is used to refer to the file. If un- successful, it returns -1, and sets the global variable errno to indicate the error type.
- 소스파일