19.4. 구독자(Subscriber) 구현: 폴링(Polling) 및 직접 읽기 방식
앞선 수십 단원의 거대한 퍼블리셔(Publisher) 창조 관문들을 완벽하게 에러 없이 돌파했다면, 이제 픽스호크 마더보드 위 PX4 미들웨어의 컴컴한 VFS 링 버퍼 바다에는 우리가 무오류로 쏘아 올린 sensor_test_data 텔레메트리 패킷들이 100Hz로 미친 듯이 범람하며 요동치고 있을 것이다.
하지만 이 시스템 생태계에서 누군가 이 고독하게 흘러가는 비싼 데이터들을 낚아채어 생존에 직결되는 의미 있는 연산(예: 칼만 EKF 필터 추정 로직, 모터 PWM 믹싱 행렬 등)에 직접 써먹지 않는다면, 이 모든 수고로운 시스템 트래픽은 그저 배터리 전력만 허공에 태워버리는 쓰레기 스팸(Spam) 데이터 조각에 불과하다.
이제부터 우리는 잔혹했던 퍼블리셔의 완벽한 거울 단면이자, PX4 미들웨어 데이터 생태계 구역의 굶주린 최종 포식자인 구독자(Subscriber) 스레드 데몬 애플리케이션을 기초 바닥부터 설계하고 구축하는 가혹한 탐독망 시스템 파싱의 길로 들어선다.
구독자 모듈의 핵심 아키텍처는 **“어떻게 하면 소중한 커널 CPU 자원 낭비(Starvation)를 극한으로 최소화하면서도, 버퍼 파이프에 새 데이터가 떨어지는 찰나의 순간에 최대한 지연(Latency) 없이 결벽에 가깝게 페이로드를 뽑아 먹을 수 있는가”**에 완전히 종속되어 있다. 본 통합 단원에서는 PX4 생태계를 양분하며 지배하는 두 가지 가장 극단적인 데이터 섭취(Reading) 패러다임 로직을 그 뼈대부터 하나씩 파헤칠 것이다.
- 단순 무차별 읽기(Simple Copy Reading) 아키텍처: 커널 단의 인터럽트 신호(Signal)를 우아하게 기다리지 않고, 자신의 루프 타이밍에 맞춰 무식하게 카메라 스냅샷을 찍듯 링 버퍼 내부를 강제로 헤집어 가장 최신 데이터 꼬리(Tail)만 직접 뜯어오는 방식. 구현이 비참할 정도로 파격적으로 쉽지만, 리소스 효율과 동기화 관점에서는 매우 위태로운 1세대 방식.
- 인터럽트 기반 고성능 폴링(Polling) 스케줄링 아키텍처: 전통적인
poll()C API 시스템 콜이나uORB::SubscriptionInterval래퍼의 압도적인 위력을 빌려 워커 스레드를 커널 단에서 강제로 기절(Block)시켜 두었다가, 링 버퍼에 새로운 패킷 수혈이 한 방울이라도 떨어지는 즉시 번개처럼 깨어나 가장 신선한 1프레임의 데이터를 낚아채어 오버헤드 0%를 달성하는 고해상도 초정밀 동기화 수신 기법.
이 두 가지 통신 인프라 수신 파이프라인 중 어떠한 아키텍처를 당신의 픽스호크 보드에 이식 선택하느냐에 따라, 당신의 커스텀 모듈은 그저 초당 1번 도는 가벼운 디버그용 텔레메트리 스크립트 나부랭이로 남을 것인지, 아니면 1000Hz의 모터 PID 피드백 이너 루프(Inner Loop)를 온전히 장악하는 크리티컬 코어 서브 시스템의 제왕으로 승격될 것인지 그 냉혹한 운명이 완전히 갈려 결정될 것이다.