인터럽트란 ?
CPU 가 정해진 프로그램의 처리 중에 하드웨어적인 요청에 의해 다른 프로그램을 실행하는 것 제어용 장치는 실시간 처리가 요구되는데
하드웨어적인 요청에 바로 응답하여 처리동시에 여러 개의 프로그램을 처리할 수
없으므로 실행 중인 프로그램은 중지하고 , 인터럽트 처리 후 계속한다 .
CPU 는 하드웨어가 언제 요청할 지 모름
인터럽트를 이해하기 위한 비유
책을 읽는다 .
읽던 곳을 접어둔다 .
접어 두었던 곳을 편다 .
책을 다시 읽는다 .
전화벨수화기를 든다 .
전화 용건을 처리한다 .
수화기를 놓는다 .
인터럽트 프로그램 방식
Interrupts vs. Polling인터럽트 방식 : 하드웨어에서 전자적인
신호를 통해 CPU 에게 알려 현재 진행 중인 프로그램 중지하고 인터럽트 처리 루틴을 실행
폴링 (polling) : 하드웨어적으로 CPU에게 알리는 방법이 없이 CPU 가 계속 해당 하드웨어를 감시하여 처리하는 방식 복잡한 인터럽트를 사용하지 않아 단순 실시간 처리에서 문제가 될 수 있다 .
마스커블 인터럽트
마스커블 인터럽트 : 인터럽트를 요인이 발생 했을 때 처리를 할 것 인지를 설정할 수 있는 인터럽트 Maskable Interrupt 8051 에서 사용 (IE 레지스터 사용 )
논마스커블 인터럽트 : 인터럽트 요인이 발생하면 CPU 는 무조건 처리 해야 하는 인터럽트 예 ) 전원 이상 시 긴급 상황 대처 8051 에서는 사용 하지 않음
ISR 인터럽트 처리 루틴
Interrupt Service Routine인터럽트 소스에 따라 정해진 기능을
수행하기 위한 처리 루틴이 필요 – 함수와 다름
인터럽트 처리 함수 찾는 방식 특정 번지로 점프하여 실행
8051 사용 , Z80, 8080 점프할 주소 값이 있는 곳을 설정하고 각
인터럽트 소스에 따라 주소를 정하여 주소값을 저장 한다 . 이것을 읽어 점프 한다 . 인터럽트 벡터 테이블 (Interrupt Vector Table) 80x86, 68000
마스커블 인터럽트 처리 환경
PC 을 저장할 스택이 준비 되어야 한다 . MOV SP,#60H – 8051 의 내부 RAM 0x61
부터 사용 C 에서는 startup.obj 에서 결정
인터럽트 처리 루틴이 미리 준비 되어 있어야 한다 . (ISR)
인터럽트 요인 발생 시 요청이 가능 하도록 설정 되어야 한다 .
인터럽트 처리 시 고려 사항
실행 중인 프로그램은 CPU 의 레지스터 값이 인터럽트 루틴에 의해 변경 되면 안된다 .
인터럽트가 발생하는 시점이 정해지지 않아 어느 명령이 끝나고 ISR 로 점프 했는지 복귀 주소 저장이 필요하다 . 실행 위치로 복귀가 가능하도록
ISR 도 레지스터 사용이 필요 하다 .
인터럽트 처리 과정
현재 실행 중인 프로그램 동작 시키기 위해 대피 해야 할 레지스터 A, B, PSW 레지스터 일반 레지스터 R0~R7 복귀를 위한 PC
스택은 데이터 저장 방식 상 SP 값을 저장 필요 없다 . 대피 레지스터는 스택에 저장
인터럽트 실행과 레지스터
현재 진행 중인 명령이끝나기를 기다린다 .
인터럽트 처리 요청
복귀를 위해 PC 을스택에 저장
ISR 주소 값을 찾아PC 넣어 점프
A, B, PSW, Rn 을스택에 저장
인터럽트 처리 루틴을실행 한다 .
Rn,PSW,B,A 를 복귀
RETI 에 의해 PC 값을 복귀
인터럽트 처리과정 I
1. 인터럽트가 발생하면 현재 진행 중인 명령이 끝나면 인터럽트 처리에 들어간다 . CPU 는 PC 값을 스택에 저장 한다 . – 16 비트 정해진 인터럽트 소스에 맞는 주소로 PC 을
설정하여 점프 한다 .
2. ISR 에서는 필요한 레지스터 값을 스택을 이용 대피한다 . ISR 안에서 사용하는 레지스터만 필요에 따라 대피 한다 .
3. 일반레지스터는 뱅크를 사용한다면 PSW 의 뱅크를 변경하여 보존할 수 있다 .
4. 인터럽트에 맞는 기능을 수행한다 .
인터럽트로 부터 복귀 과정 II
1. ISR 이 끝나면 이제는 복귀 과정에 들어간다 . 일반레지스터는 대피 방법에 따라 복귀한다 . 스택을 사용 했다면 POP 으로 다른 뱅크를 사용 했다면 원래 대로 복귀 (POP PSW)
2. 기타 PUSH 에 의해 저장된 레지스터를 반대 순서로 POP 복귀 한다 .
PUSH 순서에 저장된 레지스터만 복귀
3. RETI 에 의해 ISR 시작 전으로 복귀 PC 값을 스택으로 부터 복귀 한다 . (RETI 에 의해
자동으로 )
C 의 인터럽트 처리 예
void SerialEcho(void) interrupt 0{ char ch; if (RI == 1) { RI = 0; ch = SBUF; SBUF = ch; } else { TI = 0; } }
; FUNCTION SerialEcho (BEGIN)PUSH PSWMOV PSW,#00HPUSH AR7
JNB RI,?C0002CLR RI
; Variable 'ch' assigned to Register 'R7' MOV R7,SBUFMOV SBUF,R7SJMP ?C0004
?C0002:CLR TI
?C0004:
POP AR7POP PSWRETI
인터럽트 생성 출처
CPU
RAMROM프로그램
4 I/O 포트
Timer 0
Serial PortOSC
Interrupt Control
외부 인터럽트
Timer 1
Timer/Counter
Bus Control
TxD RxDP0 P1 P2 P3
타이머에서 설정 시간이
흘렀을 때
송수신 할 데이터가
있을 때
외부에서 인터럽트가 필요해서 입력 했을 때
인터럽트 구조
인터럽트 소스는 5 개
인터럽트 원인 인터럽트처리 시작번지
외부 인터럽트 0 0x03
타이머 /카운터 0 0x0B
외부 인터럽트 1 0x13
타이머 /카운터 1 0x1B
시리얼 포트 0x23
인터럽트에 필요한 레지스터
IE(Interrupt Enable) – mask 인터럽트 소스에서 인터럽트 요인이 발생 했을
때 처리를 할 것인가 무시를 할 것인가를 결정IP(Interrupt Priority)
여러 개의 인터럽트 소스에서 여러 개의 인터럽트가 발생할 경우 처리 우선 순위를 결정
TCON 과 SCON 인터럽트 요인이 발생하면 플래그에 세트하고
하드웨어적인 논리에 의해 CPU 에 전달
인터럽트 설정 및 처리
1. 우선 인터럽트를 처리할 인에이블 레지스터 (IE) 를 설정한다 .
2. 인터럽트 우선 순위 레지스터 (IP) 을 조사해서 자기보다 높은 순위를 처리하면 무시 한다 .
3. 인터럽트 처리루틴에 들어가면 , 자동으로 해당 인터럽트 플래그 (IE0, IE1, TF0, TF1) 을 클리어 되고 인터럽트 루틴을 시작한다 . 단 RI,TI 는 클리어 되지 않는다 .
인터럽트 소스의 요청 상황 I
인터럽트 발생 상황은 TCON 과 SCON 레지스터로 판단 한다 .
1 을 설정되어 있으면 인터럽트 요인 발생
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
Timer 1 Timer0 Interrupt
7 6 5 4 3 2 1 0
IE0 : 외부 인터럽트 요청 발생 External Interrupt 0 edge flagTF0 : 타이머 0 overflow Timer 0 Overflow flagIE1 : 외부 인터럽트 요청 발생 External Interrupt 1 edge flagTF0 : 타이머 1 overflow Timer 1 Overflow flag
인터럽트 소스의 요청 상황 II
SCON – 시리얼 통신 제어 레지스터
SM0 SM1 SM2 REN TB8 RB8 TI RI
7 6 5 4 3 2 1 0
TI : 전송 준비가 되면 발생 Transmit Interrupt flagRI : 수신 데이터 준비 시 발생 Receive Interrupt flag
IE(Interrupt Enable) Mask
Mask Bit : 각 비트는 인터럽트 발생 상황 시 인터럽트를 처리할 것인가를 결정 한다 . ‘1’ 로 설정하면 인에이블
EA 는 CPU 가 인터럽트를 처리할 것인가를 결정 한다 . 따라서 ‘0’ 이면 CPU 는 모든 인터럽트 거절
EA=1 에서 각 인에이블 플래그 (ES,ET1,EX1,ET0,EX0)의 설정에 따라 인터럽트 처리를 설정 한다 .
EA - - ES ET1 EX1 ET0 EX0
7 6 5 4 3 2 1 0
EA (Enable All Interrupt) : ‘1’ = 모든 인터럽트 가능ES (Enable Serial Interrupt) : ‘1’ = RI & TI 인터럽트 가능ET1 (Enable Timer1 Interrupt) : ‘1’ = 타이머 1 인터럽트 가능EX1 (Enable eXternal1 Interrupt) : ‘1’ = 외부 인터럽트 1 인터럽트 가능ET0 (Enable Timer0 Interrupt) : ‘1’ = 타이머 0 인터럽트 가능EX0 (Enable eXternal0 Interrupt) : ‘1’ = 외부 인터럽트 0 인터럽트 가능
IP(Interrupt Priority)
현재 낮은 레벌 인터럽트 처리 중 높은 레벌 인터럽트가 발생 하면 낮은 레벌 ISR 을 중지하고 높은 레벨의 인터럽트 서비스 시작
현재 인터럽트 보다 낮은 레벌 인터럽트가 오면 요청을 무시 한다 .
- - - PS PT1 PX1 PT0 PX0
7 6 5 4 3 2 1 0
PS (Serial port priority control) : ‘1’ = 시리얼 인터럽트을 높은 레벌로PT1 (Timer1 priority control) : ‘1’ = 타이머 1 인터럽트을 높은 레벌로PX1 (external interrupt1 priority control) : ‘1’ = 외부인터럽트 1 을 높은 레벌로PT0 (Timer0 priority control) : ‘1’ = 타이머 0 인터럽트을 높은 레벌로PX0 (external interrupt0 priority control) : ‘1’ = 외부인터럽트 0 을 높은 레벌로
외부 인터럽트
외부 인터럽트 입력 핀 /INT0, /INT1 의 2 가지 입력 상황에 의해 발생
입력 신호가 하강 모서리 이면 발생레벨 (0 입력 ) 이면 발생
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
7 6 5 4 3 2 1 0
IT0 (Interrupt 0 Type control)• IT0=1 : /INT0(P3.2) 핀의 하강 모서리 (↓) 에서 인터럽트 요청• IT0=0 : /INT0(P3.2) 핀의 L 레벨에서 인터럽트 요청IT1 (Interrupt 1 Type control)• IT1=1 : /INT1(P3.3) 핀의 하강 모서리 (↓) 에서 인터럽트 요청• IT1=0 : /INT1(P3.3) 핀의 L 레벨에서 인터럽트 요청
C 에서 인터럽트 처리 루틴 만들기
인터럽트 처리 루틴 (ISR) 을 사용자가 직접 정의 할 수 있다 . 인수 전달 할 수 없다 . 인수 리턴 불가능 ISR 는 C51 라이브러리가 제공하는 함수
사용할 수 없다 . ISR 에서 사용하는 레지스터들은 루틴
시작전에 자동으로 저장 된다 . 인터럽트 함수는 직접 콜 할 수 없다 .
인터럽트 종류 및 인터럽트 벡터
인터럽트 원인 벡터번호 ISR 시작번지
외부 인터럽트 0 0 0x03
타이머 /카운터 0 1 0x0B
외부 인터럽트 1 2 0x13
타이머 /카운터 1 3 0x1B
시리얼 포트 4 0x23
인터럽트 함수 형태
void ISR_Name(void) interrupt 3 using 2 ISR_Name : 사용자에 의해 정의 되는 함수
이름 interrupt 3 : 인터럽트 벡터 번호 ( 반드시
필요 ) – 0 ~4 ( 표 4-2) using 2 : 인터럽트에서 사용하는 뱅크번호
( 없어도 됨 ) - 0~7
ISR 의 함수 예
외부 인터럽트 0 예 #include <win51.h>
void Ex_KeyUp(void) interrupt 0 using 1{ . . . // 기능 루틴}
타이머 0
#include <win51.h>
void Tm0_Clock(void) interrupt 1{ . . . // 기능 루틴}