19.5.3. Work Queue (Work Item) 기반의 최적화된 콜백 구조

19.5.3. Work Queue (Work Item) 기반의 최적화된 콜백 구조

앞선 지옥 같았던 섹션들에서 우리는 px4_poll()이라는 순수 마스터 C API를 통해, 1000Hz 단위의 리얼타임 하드웨어 인터럽트를 스레드 단에서 직접 제어하는 시스템 콜의 핏빛 정수를 맛보았다.
하지만 이와 같은 완벽한 ’절대적 로우 레벨(Low-level) 통제권’에는 항상 ’유지보수성의 파괴(Destroy of Maintainability)’라는 치명적인 대가(Cost)가 끔찍하게 뒤따르기 마련이다. 타겟 파이프라인 N개를 위해 일일이 구조체 배열 크기를 스택에 수동으로 맞추고, 각 배열의 매핑된 정수 ID 번호를 개발자가 종이에 외우며, 지저분하고 파편화된 if 분기문으로 난해한 멀티 비트마스킹(Bit-masking)을 때려잡아야 하는 그 가혹한 하드코딩 절차 모델은, 비행 데몬이 EKF 수준으로 조금만 더 거대해져도 순식간에 런타임 오류가 폭발하는 스파게티(Spaghetti) 코드로 전락해 버리고 만다.

이러한 1세대 C 스타일의 원시적 야만성을 극도로 유연하고 우아한 C++ 객체 지향(Object-Oriented) 스케줄링의 미학으로 완전히 덮어버린, PX4 코어 펌웨어 생태계의 비동기 마스터 최종 병기가 바로 ’Work Queue (작업 대기열)’와 ‘이벤트 콜백(Event Callback)’ 아키텍처이다.

이 통합 단원에서는 19.1 단원부터 우리가 결벽증처럼 목숨을 걸고 쥐고 있던 while (!thread_should_exit)이라는 메인 무한 루프의 감옥을 과감하게 산산조각 폭파해 버린다. 무자비한 while 루프가 내 메모리 컨텍스트를 스케줄러에 억지로 묶어두는 거대한 족쇄를 완전히 끊어내고, 대신 오직 “데이터 갱신 알림 인터럽트(Event)가 커널에서 정확히 터지는 그 순간“에만, 펌웨어가 내부적으로 굴리는 백그라운드 글로벌 작업 큐(Work Queue) 위로 내 C++ 클래스의 메소드가 번개처럼 **‘팝업 호출(Callback)’**되어 단 한 번 숨을 쉬어 연산하고 곧바로 흔적 없이 숨어버리는 람다(Lambda) 및 서버리스(Serverless) 개념의 궁극기 스케줄링 아키텍처를 파헤치게 된다.

  • px4::WorkItem 코어 추상 클래스의 상속을 통한 제어권 탈취 및 비동기 태스크 프레임워크 타설
  • 모든 링커와 버퍼 핸들 처리를 완벽하게 숨기고 캡슐화한 uORB::SubscriptionCallback이라는 절대 래퍼(Wrapper) 클래스가 제공하는 우아한 데이터 인젝션
  • 루프 대신 단발성 Run() 메서드 내에 수혈되어 구현되는, 순수한 이벤트 드리븐(Event-driven) 상태 머신의 파괴적 코어 로직 해부

이 아키텍처를 이해하는 순간, 당신의 모듈은 더 이상 매초 스스로 CPU 사이클을 구걸하기 위해 무한 루프를 뺑뺑이 도는 잡스러운 하급 로거(Logger) 데몬이 아니라, 오직 치명적인 이벤트가 타격되는 찰나의 순간마다 콜백으로 소환되어 시스템을 호령하는 가장 우아한 객체 지향 마스터 피스로 모터 제어망에 다시 태어날 것이다.