19.4.1. 단순 읽기(Simple Read) 방식의 구현

19.4.1. 단순 읽기(Simple Read) 방식의 구현

앞선 통합 단원에서 강하게 예고했듯이, PX4 펌웨어 생태계 내에서 배터리 상태 체커(battery_status)나 외부 LED 눈뽕 제어기처럼 1초에 한 번만 느린 템포로 데이터를 확인해도 비행에 아무런 지장이 없는 덜 치명적인(Non-critical) 워커 모듈들을 위해 의도적으로 설계된, 가장 원시적이면서도 원초적인 VFS 데이터 수신 기법이 바로 ‘단순 무차별 읽기(Simple Read)’ 아키텍처이다.

이 방식은 이름 그대로 그 잔혹한 특성을 보여준다. 미들웨어 링 버퍼(Ring Buffer) 큐에 데이터 패킷이 방금 새로 들어왔건, 아님 10분 전에 들어온 썩은 데이터이건 간에 일말의 상관조차 하지 않는다. 심지어 다른 스레드가 데이터를 밀어 넣고 있는 중이라 미들웨어가 락(Lock)을 걸어두고 있어도, 내 데몬 스레드가 수면 모드에서 깨어난 바로 그 찰나의 타이밍에 무조건 무식하게 버퍼 시스템 뚜껑을 강제로 열어젖히고, 그 맨 윗단에 고여 있는 가장 최신의 데이터 찌꺼기(Snapshot) 하나만을 메인 메모리로 폭력적으로 떠먹어 강제 복사해 버리는 가장 이기적이고 단순 무식한 1차원적 구현법이다.

이 무지성 스냅샷 폴링(Polling) 아키텍처 파이프라인을 펌웨어에 구현하기 위해, 우리는 데몬 스레드의 C++ 메인 함수 내부에 다음 두 가지 고전적인 원시 C API 블록 단계를 아주 선형적으로 타설하게 된다.

  • 1단계. orb_subscribe() C 마스터 API를 통한 VFS 파이프 뚫기: 퍼블리셔 쪽에서 아까 orb_advertise()를 때려 링 버퍼의 송출 파이프라인 아가리를 만들었다면, 서브스크라이버 쪽인 우리는 수신 파이프의 반대쪽 응어리에 orb_subscribe()라는 강력한 시스템 콜을 찔러 넣어 강제로 개방시키고, 링 버퍼에서 내 스레드 로컬 메모리로 쏟아지는 파일 디스크립터(File Descriptor, FD) 튜브 마스터 핸들(Handle)을 억지로 확보해 낸다.
  • 2단계. 무한 루프 내에서의 orb_copy() 스냅샷 강탈 타격: 수신 파이프라인 핸들을 손에 거머쥔 상태에서 숨 막히는 백그라운드 무한 루프(while) 제어 블록 안에 진입한 뒤, 루프 주기마다 orb_copy() 함수를 무차별 호출하여, 미들웨어 링 버퍼망 안에 아무렇게나 고여있는 바이트 덩어리를 딥 카피(memcpy)하여 내 로컬 구조체 조각 메모리 변수 방 안으로 강제 복사 탈취(Overwrite)해 버린다.

이 단 두 줄의 함수만 이용한 원초적 절차만 물리적으로 타설해 낸다면, 코어를 공부하는 입문자 관점에서는 타 스레드 블록과의 숨 막히고 끔찍한 인터럽트 세마포어(Semaphore) 동기화 파싱 늪에 허우적댈 필요조차 완전 사라진다. 오직 내 수신 모듈의 이기적인 루프 대기 주기에만 철저히 맞춰, 아주 편안하면서도 기생충처럼 외부 데몬 놈들의 내부 상태 온도 데이터를 끝없이 지속 훔쳐 탐독할 수 있는 강력한 전지적 관찰자 시점 통제권을 무료로 얻게 될 것이다.