인터럽트 핸들러(interrupt handler)는 인터럽트 처리에 등록하기 위해 작성된 프로그램이다.
인터럽트 처리는 일반적인 처리보다도 CPU가 먼저 동작시킨다. 따라서 인터럽트 처리가 길면 일반 처리에 영향을 끼치므로 되도록 간단하고 최소한의 처리만을 작성하도록 주의하여야 한다.
인터럽트 핸들러 자체는 인터럽트 벡터에 대상 프로그램의 시작 번지를 등록함으로써 인터럽트가 발생했을 때 CPU가 자동으로 전환해 준다.
다음 예시는 AVR 환경(Atmega 128 등 ..)에서 Timer0을 이용하는 예시이다.
AVR 환경에서는 다음과 같이 기술함으로써 인터럽트 벡터로 등록할 수 있다. ISR()(Interrupt Service Routine)이라는 매크로 함수를 이용해서 등록하고 싶은 인터럽트 벡터 위치를 지정한다.
( TCCR0A에 할당된 CTC(Clear Timer on Compare Match) 모드는 OCRnA의 레지스터에 원하는 값을 넣게되면 TCNT0가 OCRnA의 값만큼 증가된 뒤 인터럽트(Compare Match Interrupt)가 발생하게 되어 사용자가 원하는 값으로 인터럽트를 일으킬 수 있는 장점이 있다.)
#include <avr/io.h>
#include <avr/interrupt.h>
/*timer0의 인터럽트 함수*/
ISR(TIMER0_COMPA_vct) {
// 인터럽트 시 처리 작성
do_something();
}
int main(void){
/* 인터럽트 관련 초기화 */
TCCR0A = 0b10000010; /* 10: 비교 매치 A로 LOW, 10:CTC 모드 */
TCCR0B = 0b00000001; /* 주파수 분할 없음 */
TIMSK0 = 0b00000010; /* 비교 매치 A의 인터럽트 설정 */
/* 비교 매치할 시간 설정 */
OCR0A = 32499; /* 32.5ms로 비교 매치 @1MHz */
...
sei(); /* 인터럽트 허가 */
for(;;){
/* 무한 루프 */
/*
main 처리를 기술함
*/
}
return 0;
}
인터럽트 벡터의 등록 처리는 CPU 별로 지정 방법, 프로그램의 작성법 등이 다르므로 개발환경의 매뉴얼을 확인하여야 합니다.
다음 도서를 참고하였습니다.
http://www.yes24.com/Product/Goods/91226909
'About > Embedded System' 카테고리의 다른 글
[Embedded] volatile 선언(하드웨어 폴링과 volatile) (0) | 2021.12.21 |
---|