### 0.0.1 NuttX 운영체제의 Work Queue 시스템을 활용한 GPS 스레드(Thread) 독립 실행 구조
단일 코어(Single-core) 또는 제한된 멀티 코어 환경을 갖춘 비행 제어기 마이크로컨트롤러(예: STM32 시리즈)에서, 수십 개의 센서 드라이버가 서로 CPU 점유율을 다투는 상황은 교통 체증과 같다. PX4는 메인 OS인 NuttX의 고도화된 스케줄링 메커니즘인 Work Queue(워크 큐) 시스템을 통해 GPS 파서(Parser)라는 골칫거리를 매우 우아하게 격리해 냈다.
이 절에서는 gps_main.cpp가 어떻게 단순한 무한 루프 스레드(task_spawn)를 넘어, 커널 수준의 Work Queue 인터페이스와 조우하는지 그 내밀한 구조를 파헤친다.
0.1 전용 스레드(Dedicated Thread) 방식의 한계
초기 PX4 설계나 덜 정교한 타사 펌웨어에서는 GPS 모듈 처리를 위해 전용 스레드(보통 pthread_create 또는 task_spawn으로 생성)를 띄워 무한 루프(while(1))를 돌렸다.
하지만 드론에는 GPS뿐만 아니라 텔레메트리(Telemetry), FrSky 수신기, 광학 흐름(Optical Flow) 카메라 등 수많은 직렬(Serial) 통신 장치가 존재한다. 이들 각각이 모두 무한 루프 스레드를 소유하게 되면, OS 커널은 수십 개의 스레드 컨텍스트 스위칭(Context Switching) 오버헤드에 짓눌려 기절해 버리고 만다.
0.2 NuttX Work Queue 아키텍처의 도입
이러한 스레드 인플레이션을 막기 위해, PX4는 최신 아키텍처에서 고정(Fixed) I/O 폴링이나 무거운 백그라운드 연산을 처리하기 위해 운영체제(NuttX)가 미리 만들어둔 스레드 풀(Thread Pool)인 **Work Queue(LPWORK / HPWORK 시스템)**를 적극적으로 활용하기 시작했다.
HPWORK(High-priority Work Queue): 자이로스코프(GYRO), 가속도계(ACCEL)처럼 1ms 단위의 지터(Jitter)조차 허용되지 않는 초정밀 마이크로초(µs) 단위 센서들이 스케줄링을 위탁하는 매트릭스이다.LPWORK(Low-priority Work Queue): GPS처럼 대역폭은 크지만 갱신 주기는 100ms 파이프라인으로 넉넉하며(10Hz), 직렬 포트가 막힐 확률이 높은 주변장치들의 쉼터이다. GPS 드라이버는 자신의 데이터 수집 및 파싱 사이클을 몽땅 묶어 이LPWORK큐(Queue)에 등록(work_queue()) 시켜버린다.
0.3 Work Item 단위의 비동기 실행 및 콜백(Callback) 연쇄
gps_main에서 스레드를 구동할 때, 내부 구조는 단순히 “무한정 포트를 쳐다보며 대기하라“가 아니라, **“NuttX 커널이 한가할 때(LPWORK 차례가 올 때) 내 파서 함수를 딱 한 번만 실행시켜 달라”**는 Work Item 등록 구조로 변모했다.
- Work 등록(
work_queue): GPS 루틴은 자신의 폴링 틱(Tick)을 계산하여 OS의lpwork_thread에게 자신을 예약한다 (예: “20ms 뒤에 깨워주시오”). - 스케줄러에 의한 호출: 약속된 시간이 되면 NuttX의 저우선순위 스레드가 깨어나서 등록된 GPS 함수 뭉치(Callback)를 실행해 준다.
- 1회성 파싱 처리: 호출된 GPS 워커(Worker)는 그 짧은 순간 UART 버퍼(
read())를 비우고 파싱 상태 머신을 돌려ubx_payload를 갱신한다. - 자가 연쇄 등록: 1회성 처리가 끝나면, 종료되기 직전 스스로를 다시 큐에 예약(
work_queue)하고 소멸한다(Return).
0.4 고립과 독립의 진정한 가치
GPS 드라이버를 Work Queue 시스템에 귀속시킴으로써 PX4가 획득한 것은 절대적인 독립성(Independence) 이다.
GPS 케이블이 갑자기 단선되거나, 싸구려 모듈이 고장 나 1초 동안 가비지 바이트를 폭포수처럼 쏟아내더라도, 그 재앙은 오직 LPWORK라는 작은 스레드 풀 바구니 안에서만 맴돌 뿐이다. 메인 EKF2 필터나 모터 믹서(Mixer) 데몬은 GPS의 파업에 전혀 아랑곳하지 않고 자신들의 고정된 400Hz 타임 슬라이스(Time Slice)를 영위하며 안정적으로 추락을 면할 수 있다.
이것이 무인항공기 소프트웨어가 단순한 임베디드 코드를 넘어 항공우주급 무결성(Integrity)을 확보하게 만든 스레드 격리 아키텍처의 요체이다.