인터럽트

eunsukim·2024년 10월 15일

Peek and Poke

프로그래밍에서 메모리에 접근하는 명령어로, Peek은 특정 메모리 주소에 저장된 바이트 내용을 취하는 명령어이고, Poke는 특정 메모리 주소에 저장된 바이트 내용을 바꾸는 명령어이다.

int peek(char *location) {
 return *location; }
 
void poke(char *location, char newval) {
 (*location) = newval; }
 

Busy/wait output

current_char = mystring;
while (*current_char != '\0') {
 poke(OUT_CHAR, *current_char);
 while (peek(OUT_STATUS) != 0);
 current_char++;
}

ex) mystring = "hello" 인 경우
*current_char = 'h'이고, null이 아니므로 poke()를 통해 OUT_CHAR에 'h' 저장. 여기서 OUT_CHAR은 출력 장치를 의미함. poke() 실행 후 peek()을 통해 출력 장치가 다음 데이터 'e' 를 받을 준비가 될 때까지 "바쁜 대기"

이러한 바쁜 대기 방식은 비효율적이다. 왜냐하면

  1. CPU는 장치가 준비될 때까지 지속적으로 루프를 돌기 때문에 다른 작업을 수행할 수 없다.

  2. 여러 장치와의 입출력 작업을 동시에 수행하기 어렵다.

인터럽트

인터럽트란 CPU가 작업을 처리하고 있을 때, 입출력 하드웨어 등의 장치에 예외 상황이 발생하여 처리가 필요한 경우에 이를 CPU에 알려 처리할 수 있도록 하는 것을 말한다.

  • 장치가 CPU의 제어 흐름을 변경할 수 있다.
    인터럽트는 장치가 작업을 완료하거나 데이터 처리가 필요할 때 CPU에게 신호를 보내 작업을 중단시키고, 해당 작업을 처리할 수 있는 서브루틴을 호출하게 한다.

  • CPU는 다른 작업을 수행할 수 있다.
    CPU는 바쁜 대기를 하지 않고 다른 작업을 수행하다가, 장치가 준비되면 인터럽트가 발생하여 작업을 처리한다. 이를 통해 CPU 자원의 효율적 사용이 가능하다.

  • CPU

    • PC를 통해 현재 실행 중인 명령어를 관리한다.
    • 자신의 프로그램을 실행하다가, 장치가 준비되면 인터럽트 발생.
  • Device

    • Status Register: 장치의 상태를 나타낸다.
    • Data Register: 장치가 처리할 실제 데이터를 저장하는 레지스터.
    • Device mechanism: 장치 내부 동작 메커니즘.
  1. Interrupt request

    • 장치가 준비되면 Status Register가 업데이트되고, CPU로 Interrupt Request를 보낸다.
  2. Interrupt Acknowledge

    • CPU는 인터럽트 요청을 받으면 현재 작업을 잠시 중단하고 인터럽트를 처리하는 서브루틴을 호출한다.
    • CPU는 응답을 보내 인터럽트 요청을 수락했음을 알린다.
  3. Data/Address

    • Data register를 통해 데이터를 읽거나 쓰는 작업을 수행함.
    • 처리가 완료되면 CPU는 원래 작업으로 복귀함.

인터럽트 발생 시 CPU 동작

  1. 인터럽트 발생 시 서브루틴을 호출하여 인터럽트 처리 코드 실행.

  2. 인터럽트 발생 시 CPU는 다음 명령어를 강제로 정해진 서브루틴(인터럽트 서비스 루틴, ISR) 로 변경하여 실행.

  3. 인터럽트 처리 후 원래 실행 중이던 프로그램으로 돌아갈 수 있도록, 인터럽트가 발생하기 전의 복귀 주소를 저장한다.

Priorities and Vector

  1. Priorities(우선순위):
    우선순위는 어떤 인터럽트가 CPU에 의해 먼저 처리되는지를 결정한다. 높은 우선순위를 가진 인터럽트는 CPU에 더 빨리 처리된다.

  2. Vectors:
    벡터는 어떤 코드가 각 인터럽트를 처리할지를 결정한다. 각 인터럽트는 고유한 벡터를 가지고 있으며, 이 벡터는 인터럽트 서비스 루틴(ISR)로 연결된다.

    • CPU가 디바이스로부터 받은 인터럽트 요청을 승인하면, 디바이스는 해당 인터럽트를 처리할 수 있는 벡터 정보를 CPU에 전송한다. 이는 핸들러를 포함한다. CPU는 이를 통해 해당 인터럽트 처리 코드를 실행한다.

  1. 메커니즘의 독립성(Orthogonality):
    우선순위와 벡터는 독립적인 메커니즘이다. 서로 별개로 작동하며, 대부분의 CPU는 이 두 메커니즘 모두 지원한다.
  • Masking(마스킹): 현재 처리 중인 인터럽트보다 우선순위가 낮은 인터럽트를 무시하거나 인식하지 않는 메커니즘. 중요도가 낮은 인터럽트가 중요한 작업을 방해하지 않도록 함.

  • Non-maskable interrupt(비마스크 인터럽트): 가장 높은 우선순위를 가지며, 마스킹 되지 않는다. 어떠한 상황에서도 무조건 먼저 처리되어야 하는 중요한 인터럽트이다. 다른 인터럽트가 처리 중이더라도 바로 실행된다.

Generic interrupt mechanism

  1. 인터럽트 요청: 인터럽트가 발생했다면, 해당 인터럽트를 처리한다.

  2. 우선순위 확인: 현재 처리 중인 인터럽트보다 새로 발생한 인터럽트가 더 높은 우선순위를 가지는지 확인한다.

  3. 인터럽트 승인: CPU가 인터럽트 처리할 준비가 되었음을 나타냄.

  4. 벡터 확인: 벡터가 없다면 타임아웃 및 버스에러.

Sources of interrupt overhead

  • 핸들러 실행 시간
  • 인터럽트 메커니즘 오버헤드
  • 레지스터 저장/복구
  • 파이프라인 관련 패널티
  • 캐시 관련 패널티

ARM 인터럽트 처리 절차

  • CPU 동작

    1. 현재 실행 중인 프로그램 카운터(PC) 값 저장.
    2. 현재 프로그램 상태 레지스터(CPSR) 값을 저장된 프로그램 상태 레지스터(SPSR)로 복사한다.
    3. CPSR의 특정 비트를 강제로 설정하여 인터럽트 발생 사실을 기록한다.
    4. PC를 인터럽트 벡터 테이블로 이동시킨다.
  • Handler responsibility

    • 인터럽트 처리가 끝나면 저장된 PC를 복원한다.
    • SPSR의 값을 CPSR로 복원한다.
    • 인터럽트 비활성화 플래그 해제 -> 인터럽트 차단 중지.

C55x 프로세서

인터럽트 지연시간은 7 ~ 13 사이클

Maskable Interrupt Sequence

  1. Interrupt flag register is set
    인터럽트 발생 시 해당 인터럽트의 플래그 레지스터가 설정된다.
  2. Interrupt enable register is checked
    인터럽트 활성화 레지스터를 확인하여 해당 인터럽트가 활성화되어 있는지 확인한다.
  3. Interrput mask register is checked
    마스크 레지스터를 확인하여 해당 인터럽트가 차단되어 있는지 확인한다.
  4. Interrupt flag register is cleared
    인터럽트 처리 준비가 되면 인터럽트 플래그 레지스터를 초기화한다.
  5. Appropriate registers are saved
    현재 실행 중이던 작업을 중단하고 관련 레지스터 값들을 저장하여 추후 복구하도록 한다.
  6. INTM set to 1, DBGM set to 1, EALLOW set to 0
    INTM, DBGM, EALLOW 같은 특정 제어 비트를 설정하여 인터럽트 처리 루틴이 안전하게 실행될 수 있도록 설정한다.
  7. Branch to ISR
    준비가 완료되면 CPU는 인터럽트 서비스 루틴(ISR)으로 분기하여 인터럽트를 처리한다.

두 가지 복귀 방식

  • Fast Return: 빠른 복귀 방식으로, 최소한의 작업으로 원래 프로그램으로 복귀함. 시간이 더 적게 소요되나, 정확하지 않을 수 있음.

  • Slow Return: 느린 복귀 방식으로, 더 많은 작업을 수행하여 완전한 상태 복구를 보장함.

ATmega2560 인터럽트

ATmega2560은 외부 인터럽트 핀을 통해 여러 외부 신호를 처리한다.

ATmega2560은 유연한 인터럽트 제어 모듈을 가지고 있다.

  • Global Interrupt Enable bit: 모든 인터럽트를 전역적으로 제어하기 위해 상태 레지스터에 전역 인터럽트 활성화 비트(Global Interrupt Enable bit) 이 존재한다. 이 비트를 설정하면 인터럽트 처리가 가능하고, 해제하면 인터럽트가 비활성화된다.

  • attachInterrupt(interrupt, function, mode): 특정 핀에서 인터럽트를 설정하는 함수이다. 첫번째 인자로 인터럽트 번호, 두번째 인자로 인터럽트 발생 시 호출 함수, 세번째 인자는 인터럽트 트리거 모드(발동 조건)을 의미한다.

    • 트리거 모드:
      • LOW: 핀 신호가 낮을 때 인터럽트 발생.
      • CHANGE: 핀 신호가 변할 때 인터럽트 발생.
      • RISING: 핀 신호가 상승할 때 인터럽트 발생.
      • FALLING: 핀 신호가 하강할 때 인터럽트 발생.
  • detachInterrupt(interrupt): 특정 인터럽트 비활성화

벡터 번호가 낮을수록 우선순위가 높다. 벡터 값이 작은 인터럽트가 먼저 처리된다.

0개의 댓글