하드웨어 설계에 관련한 공개 강좌를 게재하는 공간입니다.
운영진에 의해 강좌글은 편집되며, 공익을 위한 게시글은 '하드웨어 강좌'란으로 이동될 수 있습니다.
판매자 | 아크마 | 판매 납포인트 | 무료 | 평점 | 1.0점 / 총 1명 참여 |
---|
제6장. 인터럽트
1. 인터럽트 란?
ㅇ 인터럽트란, 주프로그램 수행 중에 주프로그램을 일시적으로 중지시키는 조건이나 사건의 발생을 말함
ㅇ 인터럽트는 주프로그램에서 비동기적으로 발생하는 “event(사건)”에 대한 반응
주프로그램은 언제 인터럽트가 발생할지 알 수 없다.
ㅇ 인터럽트를 처리하는 프로그램을
- 인터럽트 서비스 루틴(interrupt service routine ; ISR)
또는 인터럽트 핸들러(interrupt handler)
- ISR은 인터럽트에 대한 응답으로 수행한다.
ㅇ 인터럽트가 발생할 때 주프로그램은 일시적으로 수행을 정지하고 ISR로 분기
즉, ISR이 실행되고 연산이 수행된 후,
"인터럽트로부터 복귀(return from interrupt)" 명령으로 복귀
Main program |
Time →
(a) Program execution without interrupt
ISR |
ISR |
Main |
|
Main |
↑ ↓ ↑ ↓
Main |
(b) Program execution with interrupt
2. 8051 인터럽트의 구성
ㅇ 8051은 5가지의 인터럽트 소스
- 2개의 외부 인터럽트
- 2개의 타이머 인터럽트
- 시리얼 포트 인터럽트.
2.1 인터럽트의 가능과 불가능
ㅇ 인터럽트를 가능하게 하고 또는 불가능하게 하는 것은 IE(Interrupt Enable) 레지스터의 조절에 의해 결정
비트 심볼 기능 설명(1 = 가능, 0 = 불가능) |
IE.7 EA 전역적 인터럽트 가능/불가능 IE.6 - 사용하지 않음 IE.5 ET2 타이머/카운터2 인터럽트 가능/불가능(8052) IE.4 ES 시리얼 포트 인터럽트 가능/불가능 IE.3 ET1 타이머/카운터1 인터럽트 가능/불가능 IE.2 EX1 외부1 인터럽트 가능/불가능 IE.1 ET0 타이머/카운터0 인터럽트 가능/불가능 IE.0 EX0 외부0 인터럽트 가능/불가능 |
- IE 레지스터는 비트 주소 가능한 레지스터이므로 해당 비트별로 인터럽트를 enable 하는 방법
SETB ET1 ; 타이머/카운터1 인터럽트 가능
SETB EA ; 전역적 인터럽트 가능 비트를 세트
- IE 레지스터 전체를 enable하는 방법
MOV IE, #1001000B
2.2 인터럽트 우선순위
ㅇ 2개 이상의 인터럽트가 동시에 발생하거나 또는 한 인터럽트가 서비스 받고 있는 동안 다른 인터럽트가 발생했다면 인터럽트를 순서를 결정하는 방법은 2가지
ㅇ 프로그램에 의해 순서를 변경할 수 있는 인터럽트 우선순위(Interrupt Priority)
비트 심볼 기능 설명(1 = 높은 순위, 0 = 낮은 순위) |
IP.7 - 사용하지 않음 IP.6 - 사용하지 않음 IP.5 PT2 타이머/카운터2 인터럽트에 대한 우선순위(8052) IP.4 PS 시리얼 포트 인터럽트에 대한 우선순위 IP.3 PT1 타이머/카운터1 인터럽트에 대한 우선순위 IP.2 PX1 외부1 인터럽트에 대한 우선순위 IP.1 PT0 타이머/카운터0 인터럽트에 대한 우선순위 IP.0 PX0 외부0 인터럽트에 대한 우선순위 |
- IP 레지스터는 비트 주소 지정이 가능한 레지스터
- 우선순위를 변경하고자 하는 플래그를 1로 하면 된다.
- 폴링 순서는 외부0, 타이머/카운터0, 외부1, 타이머/카운터1, 시리얼 포트, 타이머/카운터2 순으로 되어있으나 IP.4를 “1”로 셋하면 시리얼 포트가 가장 우선순위가 높고, 이후 폴링 순서대로 된다.
2.3 폴링 순서(Polling Sequence)
ㅇ 폴링 순서는 외부0, 타이머/카운터0, 외부1, 타이머/카운터1, 시리얼 포트, 타이머/카운터2 순
ㅇ 만약 같은 우선순위를 가진 2개의 인터럽트가 동시에 발생한다면 고정된 폴링 순서가 어떤 것이 먼저 서비스를 받을지 결정한다.
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
b0 |
TF1 |
TR1 |
TF0 |
TR0 |
IE1 |
IT1 |
IE0 |
IT0 |
ㅇ 타이머/카운터 제어 레지스터(TCON, Timer/counter CONtrol register)의 b3~b0
- 인터럽트에 해당되는 flag로써
IE0 : 인터럽트 에지0 플래그 (외부 인터럽트가 들어오면 하드웨어적으로 세트, 인터럽트 인지 후 자동 클리어)
IT0 : 인터럽트 타입0 플래그 (외부 인터럽트를 활성화하는 하강에지/하위 레벨을 지정하는 플래그, 소프트웨어적으로 세트/클리어)
IE1 : 인터럽트 에지1 플래그
IT1 : 인터럽트 타입1 플래그
3. 인터럽트 처리
ㅇ 인터럽트가 발생하고 CPU에 의해서 받아들여졌을 때, 주프로그램은 중단된다. 그 때 다음의 행동들이 발생된다.
□ 현재 명령어의 수행을 끝마친다.
□ 스택에 PC를 저장한다.
□ 현재 인터럽트가 받아들여지지는 않는다. blocking 된다.
□ ISR의 벡터 주소가 PC에 적재된다.
□ ISR이 수행된다.
ㅇ 인터럽트가 받아들여졌을 때 PC에 적재되는 값을 인터럽트 벡터(인터럽트 엔트리 포인트)라 부른다. 인터럽트 벡터는 인터럽트 소스에 대한 ISR의 시작 주소이다.
인터럽트 플래그 인터럽트 벡터 주소 |
시스템 리셋 RST 0000H 외부0 IE0 0003H 타이머/카운터0 TF0 000BH 외부1 IE1 0013H 타이머/카운터1 TF1 001BH 시리얼 포트 RI or TI 0023H 타이머/카운터2 TF2 or EXF2 002BH |
ㅇ 각각의 인터럽트 벡터 사이에는 8바이트의 코드 공간이 있다. 따라서 ISR이 8바이트 이내이면 아래와 같이 프로그램 할 수 있다.
ORG 0000H ; 리셋 엔트리 포인트
JMP MAIN
ORG 000BH ; 타이머/카운터0 엔트리 포인트
T0ISR: ː ; 타이머/카운터0 ISR 시작
ː
RETI ; 주 프로그램으로 복귀
MAIN: ː ; 주 프로그램
ː
ㅇ 만약 ISR이 8바이트 이상이면 아래와 같이 프로그램을 하여야 한다.
ORG 0000H ; 리셋 엔트리 포인트
JMP MAIN
ORG 000BH ; 타이머/카운터0 엔트리 포인트
JMP T0ISR
ORG 0030H ; 인터럽트 벡터들을 지난 부분에서 시작
MAIN: ː ; 주 프로그램
ː
T0ISR: ː ; 타이머/카운터0 ISR 시작
ː
RETI ; 주 프로그램으로 복귀
ㅇ 외부0,1, 타이머/카운터0,1은 인터럽트가 발생하면 IE0, IE1, TF0, TF1은 하드웨어에 의해서 자동적으로 클리어 된다.
시리얼 포트 및 타이머/카운터2는 자동적으로 클리어 되지 않으므로 소프트웨어적으로 클리어 시켜야 된다.