# 1. 하드웨어 인터럽트(Interrupt)와 드라이버 모델 처리 원리

# 1. 하드웨어 인터럽트(Interrupt)와 드라이버 모델 처리 원리

비행 제어 컴퓨터는 외부 세상에서 벌어지는 물리적 사건(Event)에 즉각적으로 반응해야 한다. 자이로스코프 칩이 “나 방금 회전 데이터 계산 다 끝났어!” 라고 소리치거나, 수신기에서 “조종사가 스로틀을 올렸어!” 라며 펄스 엣지(Edge)가 올라가는 그 찰나의 순간(마이크로초 영역), CPU가 하던 모든 정규 스레드 작업을 멈추고 해당 이벤트를 가로채는 마법, 바로 하드웨어 인터럽트(Interrupt) 다.

인터럽트의 극단주의: 하드웨어 vs. 소프트웨어
Pixhawk의 ARM Cortex 프로세서 코어 내부에는 NVIC (Nested Vectored Interrupt Controller) 라는 강력한 하드웨어 인터럽트 관리자가 내장되어 있다. 1번 핀에 전압이 튀면 즉시 인터럽트 벡터 번호 X 로 물리적인 강제 점프(Jump)를 뛴다.
그런데 PX4 드라이버 코드를 열어보면 이 인터럽트 서비스 루틴(ISR: Interrupt Service Routine) 내부에는 놀라울 정도로 코드가 텅 비어있다. 겨우 세마포어(Semaphore) 신호 하나를 띡 던지고 루틴을 즉각 종료(Return)시켜 버린다. 왜 일까?

톱 하프(Top-Half) 와 바텀 하프(Bottom-Half) 아키텍처
만약 센서 인터럽트가 터졌을 때 그 안에서 SPI 통신으로 데이터를 읽어오고 부동소수점 변환까지 다 해버린다면, 수 밀리초에 달하는 시간 동안 CPU는 다른 인터럽트를 전혀 받지 못해 시스템이 마비된다. 이를 막기 위해 PX4 OS 커널은 2단 분리 철학을 고집한다.

  1. Top-Half (물리적 인터럽트 영역): 하드웨어 핀 인터럽트가 터진 즉시 실행된다. 수행 시간은 단 몇 나노초. 가장 먼저 하는 일은 커널에 자고 있던 드라이버 스레드(Worker Thread)를 깨우라는 ‘시그널 세마포어(Signal Semaphore)’ 방아쇠를 당기는 것뿐이다. 그 뒤 곧바로 원래의 시스템으로 복귀(Return)한다.
  2. Bottom-Half (소프트웨어 드라이버 스레드 영역): 앞선 방아쇠 덕분에 NuttX 커널 스케줄러에 의해 잠에서 깨어난 sensor_worker 스레드다. 이 녀석은 정규 프로세스이므로, SPI 통신을 느긋하게 돌리며 외부 칩셋의 레지스터 쓰레기 값을 온전히 긁어와 국제 표준(SI) 물리량으로 가공하고 uORB에 택배 상자를 포장해 던져넣는다.

이러한 인터럽트 지연(Deferral) 및 워커 큐(Worker Queue) 배분 방식을 통해 PX4는 초당 1만 번이 넘게 쏟아지는 하드웨어 인터럽트의 융단폭격 속에서도 커널 패닉에 빠지지 않고 온전성을 방어해 내는 것이다.