인터럽트

기운찬곰·2020년 10월 10일
1

Computer Science

목록 보기
15/27

인터럽트

인터럽트란 마이크로프로세서(CPU)가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 또는 예외상황이 발생하여 처리가 필요할 경우에 마이크로프로세서에게 알려 처리할 수 있도록 하는 것을 말합니다. - 위키피디아-

출처 : https://www.rt-thread.io/document/site/interrupt/interrupt/

만약 CPU가 어떤 프로그램을 순차적으로 수행하는 중에 외부로부터 인터럽트 요구가 들어오게 되면, CPU는 원래 프로그램의 수행을 중단하고, 인터럽트를 먼저 처리해 줍니다. 인터럽트 처리가 끝나면 원래의 프로그램으로 복귀하여 그 수행을 계속 합니다.


폴링과 인터럽트

  • 폴링(polling) : 대상을 주기적으로 감시하여 상황이 발생하면 해당처리 루틴을 실행해 처리
  • 인터럽트 : 상대가 마이크로프로세서에게 일을 처리해 달라고 요청하는 수단

예를들어 볼까요? 제가 사장님이고 직원한테 일을 맡겨놨습니다. 그리고 제가 계속 주기적으로 직원을 감시하면서 일을 끝냈나 못끝냈나 확인합니다. 이게 폴링 방식입니다. 굉장히 비효율적이죠. 제가 일을 집중해서 못하니까요.

이렇게 하는것보다 차라리 직원한테 일을 맡기고 끝나면 나한테 알리라고 시켜는게 더 좋습니다. 그럼 제가 맘 놓고 일을 하고 있다가 직원이 일이 끝나면 말하겠죠. 이런 방식을 인터럽트라고 합니다.

인터럽트를 왜 쓰는지 이제 감이 잡히죠?


인터럽트의 종류

인터럽트의 종류에 대해 알아볼까요?

  • Program : 오버플로우, 0으로 나눈다던가, 문법적인 에러 등과 같은 조건일때 발생
  • Timer : 타이머에 의해 발생. 의도적인 인터럽트
  • I/O : I/O 컨트롤러에 의해 발생. 요청 혹은 에러 상황일 때 발생
  • Hardware failure : 하드웨어적 결함

원하는 인터럽트와 원하지 않는 인터럽트, 혹은 하드웨어적 인터럽트와 소프트웨어적인 인터럽트로도 나눠서 생각해볼 수도 있습니다.


인터럽트 처리과정

저번시간에 처음에 보던 그림입니다. 근데 여기에 Interrupt Stage가 추가되었습니다.

instruction cycle state diagram으로 보면 다음과 같습니다. 여기서 말하고자 하는 핵심은 인터럽트 요청이 들어왔다고 해서 이를 바로 처리하는것이 아닙니다. 명령어 실행을 마칠때 마다 중앙처리장치는 반복적으로 인터럽트 요청이 있는지 계속 확인하는 겁니다.


이미지 출처 : https://m.blog.naver.com/dilector/221786020526

1단계. 인터럽트 발생

인터럽트 가능 플래그를 1로 설정. 인터럽트 요청신호를 발생시키면 인터럽트 발생.

구체적으로 설명하자면 인터럽트 종류는 굉장히 많습니다. 그래서 어떤 인터럽트를 쓸것인지 미리 설정을 해야 합니다. ATmega128를 예로 들어 설명하자면 ICCR이 인터럽트 사용 설정에 대한 레지스터이고, ICMR이 어떤 인터럽트를 사용할 것인지 선택하는 레지스터입니다.

그리고 인터럽트를 발생시키려면 해당 인터럽트 관련 레지스터를 설정하면 됩니다.


2단계. 프로그램 중단 및 상태보관

현재 실행하던 프로세스를 중단하고, PC(Program Counter, IP) 값은 자동 저장 됩니다. 현재 진행중인 프로그램의 레지스터들도 따로 저장합니다.


3단계. 인터럽트 처리와 수행

인터럽트 벡터

위에는 예시로 가져온 인터럽트 벡터 테이블입니다. 쭉 보면 I2C. LCD, GPIO, Timers, USB, UART 등 다양한 인터럽트가 존재하는걸 볼 수 있습니다. 따라서 이것을 보면서 어떤 인터럽트가 발생했는지 알아냅니다. ISR 주소값을 얻습니다.

인터럽트 서비스 루틴(ISR)
인터럽트 벡터 테이블에서 찾은 ISR 주소 값에 따라서 ISR로 점프를 한다음 해당 코드(함수)를 실행합니다. 인터럽트 핸들러(interrupt handler)라고도 합니다.


4단계. 프로그램 상태 복구 및 재실행

해당 일을 다 처리하면, 대피시킨 레지스터를 복원합니다. 저장된 PC 값을 복원하여 이전 실행 위치로 복원합니다. 인터럽트 레지스터를 (자동으로 해제 되거나) 해제 시킵니다.


다중인터럽트

만약 인터럽트 발생시 인터럽트가 또 발생하면 어떻게 될까요? 이 경우에는 두가지 방식이 있습니다.

첫번째는 CPU가 인터럽트 서비스 루틴을 처리하는 중에 새로운 인터럽트가 들어오더라도 수행중인 인터럽트 서비스 루틴이 끝날 때 까지 새로운 인터럽트 사이클을 수행하지 않도록 하는것이고(마치 인터럽트 불가능 상태와 같습니다.)

두번째는 인터럽트 간의 우선순위를 정하고, 우선순위가 낮은 인터럽트를 처리하는 중에 우선순위가 높은 인터럽트가 발생한다면, 현재 수행중인 명령어를 멈춰두고, 새로운 인터럽트를 먼저 처리하도록 하는 것입니다.


마침

오늘도 정말 중요한 내용에 대해 공부했습니다. 저번시간과 이어지는 개념이니 꼭 알고 넘어갔으면 좋겠습니다.

References

profile
배움을 좋아합니다. 새로운 것을 좋아합니다.

0개의 댓글