임베디드 면접 용어 사전
인터럽트

인터럽트

하드웨어나 소프트웨어가 CPU에게 '지금 처리할 일이 생겼다'고 알리는 신호. CPU는 하던 일을 멈추고 정해진 처리 루틴으로 점프했다가 되돌아온다.

"기다리지 말고, 생기면 알려 달라" 는 방식이다. 임베디드에서 가장 기본이 되는 구조다.

폴링과의 차이부터

while ((UART->STATUS & RX_READY) == 0) { }   // 폴링 — 그동안 CPU 는 아무것도 못 한다
uart_read();

void UART_IRQHandler(void) { uart_read(); }  // 인터럽트 — 올 때만 부른다

폴링은 CPU 시간을 대기에 쓴다. 인터럽트는 사건이 생긴 순간에만 CPU 를 쓰므로, 같은 일을 하면서 나머지 시간을 다른 태스크나 저전력 모드에 넘길 수 있다.

CPU 안에서 벌어지는 일 (Cortex-M 기준)

① 주변장치가 신호를 올린다        예: 타이머 오버플로, 핀 에지, UART 수신
② NVIC 가 우선순위를 비교한다      현재 실행 중인 것보다 높으면 받아들인다
③ 자동 스태킹                    R0-R3, R12, LR, PC, xPSR 을 스택에 하드웨어가 밀어 넣는다
④ 벡터 테이블에서 주소를 읽는다     인터럽트 번호 → 핸들러 주소
⑤ 핸들러(ISR) 실행
⑥ 특수한 값으로 복귀              LR 에 담긴 EXC_RETURN 을 만나면 스택에서 원상 복구

③이 하드웨어라는 점이 중요하다. 컴파일러가 레지스터 저장 코드를 넣지 않아도 되므로 ISR 을 평범한 C 함수로 쓸 수 있고, 진입이 빠르다.

종류

외부 인터럽트   핀 에지, 통신 수신, 타이머 — 주변장치가 만든다
내부 예외      HardFault, SVC, PendSV, SysTick — 코어가 만든다
소프트웨어      명령으로 일부러 발생시킨다 (SVC 등)

지연(latency)은 무엇으로 이뤄지나

검출 → 우선순위 판정 → 스태킹 → 벡터 읽기 → 핸들러 첫 명령
      + 더 높은 우선순위가 실행 중이면 그것이 끝날 때까지
      + 인터럽트를 막아 둔 임계 구역이 있으면 그 시간만큼

그래서 임계 구역을 길게 잡으면 지연이 늘어난다. "인터럽트를 껐다 켜는 구간은 최대한 짧게" 라는 규칙이 여기서 나온다.

지켜야 할 것

  • ISR 은 짧게 — 플래그만 세우고 본 작업은 태스크로 미룬다
  • ISR 과 공유하는 변수는 volatile, 여러 바이트면 원자성까지 고려한다
  • ISR 안에서 블로킹·동적 할당·긴 루프 금지
  • 플래그 클리어를 빠뜨리면 같은 인터럽트가 무한히 재진입한다

면접에서

"인터럽트가 뭔가요"는 정의만 답하면 아쉽다. "CPU 시간을 대기에 쓰지 않게 해 주고, 대신 공유 데이터와 지연 문제를 떠안는다" 까지 말하면 트레이드오프를 아는 사람으로 들린다.

함께 보면 좋은 용어

노트에서 맥락과 함께 보기 — 인터럽트 — 벡터·우선순위·latency·재진입·ISR 금기·디바운싱