21.1.1.2. 애플리케이션, 모듈, 드라이버 컴포넌트 간의 컨텍스트(Context) 분리
PX4 모듈 아키텍처의 근간을 이루는 또 다른 핵심 축은 ’컨텍스트(Context)’의 분리이다. 앞서 21.1.1.1 단원에서 다룬 ’계층(Layer)’이 코드의 논리적, 물리적 위치와 권한에 대한 이야기였다면, ’컨텍스트’는 동일한 시간에 병렬로 돌아가는 시스템 안에서 내 코드가 정확히 누구의 시간(CPU Time)을 쪼개어 쓰고 있는가에 대한 실행(Execution) 관점의 이야기이다.
개발자가 아무리 좋은 C++ 알고리즘을 작성했더라도, 그 코드가 센서 데이터를 긁어오는 ’드라이버 컨텍스트’에서 실행되는지, 아니면 파일에 로그를 기록하는 ’애플리케이션 데몬 컨텍스트’에서 실행되는지에 따라 펌웨어의 무결성(Integrity)은 천국과 지옥을 오가게 된다.
1. 컨텍스트(Context)란 무엇인가?
소프트웨어 공학에서 컨텍스트란 스레드(Thread)나 프로세스가 현재 CPU를 점유하고 있을 때의 ’실행 상태(레지스터 값, 스택 포인트, 메모리 맵)’의 총합을 의미한다.
PX4 생태계 내에서 동작하는 모든 C++ 컴포넌트들은 각자의 고유한 컨텍스트 위에서 돌아가며, 이들은 크게 애플리케이션, 모듈, 드라이버 세 가지 범주의 실행 레인(Lane)으로 나누어진다.
- 애플리케이션 컨텍스트 (Application Context)
- 목적: GCS(QGroundControl)와의 MAVLink 통신, SD 카드 파일 기록(Logger), 복잡한 상태 머신(Commander) 관리 등 긴 처리 시간과 가변적인 지연(Latency)이 허용되는 작업.
- 특징: 이 컨텍스트에서 도는 코드는 상대적으로 낮은 우선순위(Priority)를 받는다. uORB에서 메시지가 오기를 느긋하게 기다리거나(Polling),
sleep()계열 함수를 통해 일정 시간 스레드를 재워도 무방하다. 주로 과거의 전통적인 NuttXtask_create형태로 띄워지는 메인 데몬(Daemon)들이 이 영역을 지배한다.
- 모듈(제어 루프) 컨텍스트 (Module / Control Loop Context)
- 목적: 자세 추정(EKF2), 멀티로터 자세 제어(mc_att_control) 등 드론이 하늘에 떠 있기 위해 1초에 수백 번 쉼 없이 돌아가야 하는 코어 수학 연산.
- 특징: 초고속, 하드 리얼타임(Hard Real-time)이 생명이다. 이 컨텍스트는 매우 높은 우선순위를 가지며, 주로 고효율의
Work Queue스케줄러 위에서 돌아간다. 이 영역에 올라온 코드는 절대 블로킹(Blocking) I/O 대기 상태에 빠져서는 안 되며, 연산이 끝나면 0.1ms 안에 다음 콜백을 위해 CPU를 반납(Yield)하는 것을 미덕으로 삼는다.
- 드라이버(인터럽트) 컨텍스트 (Driver / Interrupt Context)
- 목적: I2C, SPI 버스로 연결된 물리적 센서 칩셋(IMU, Barometer 등)에 하드웨어 인터럽트(IRQ)가 걸렸을 때, 칩의 레지스터를 읽어와 초기 가공을 수행하는 작업.
- 특징: 가장 짧고, 가장 폭력적으로 CPU를 낚아채는 최상위 포식자 계층이다. 커스텀 모듈 작성 시 I2C 디바이스를 직접 건드리는 개발을 하지 않는 이상 여러분이 직접 이 컨텍스트의 코드를 짤 일은 드물다. 이 환경 안에서는 뮤텍스(Mutex)를 잡아도 안 되고 메모리를 동적 할당해서도 안 된다.
2. 컨텍스트 침범의 재앙
PX4 아키텍처를 파괴하는 가장 흔한 개발자의 실수는 이 컨텍스트 간의 경계 침범이다.
- 치명타 예시 1: 제어 모듈 컨텍스트(Work Queue 위에서 400Hz로 도는 자세 제어기) 한가운데에 MAVLink
printf디버깅 메시지를 심어놓는 행위. I/O 블로킹이 발생하여 제어 루프 컨텍스트가 멈추고 드론은 조종 불능에 빠진다. - 치명타 예시 2: 애플리케이션 컨텍스트(느린 데몬)에서 센서 데이터 구조체를 뮤텍스(Mutex) 락만 걸고 연산하는 동안 카톡을 확인하듯 너무 오랜 시간을 끌어버리는 경우. 인터럽트 컨텍스트에서 새 센서 값이 들어왔는데 뮤텍스에 막혀 업데이트를 못 하고 병목이 폭발한다.
성공적인 사용자 정의 앱(Custom App) 설계란, **무거운 연산을 하는 부분(비동기 I/O 등)은 느슨한 데몬 컨텍스트(21.1.1.2.1 단원 참조)**로 분리해 내고, 센서 값에 즉각 반응하여 모터를 제어해야 하는 부분은 하드 리얼타임의 핏줄(21.1.1.2.2 단원 참조) 속에 얹혀가도록 설계하는 이원화(Bifurcation)의 예술이다.
다음 단원들에서는 이 두 극단적인 세계(데몬과 인루프)의 생명주기와 제약 사항을 각각 현미경으로 들여다본다.