19.3. 발행자(Publisher) 애플리케이션 구현
우리 손으로 텍스트 에디터에서 직접 빚어낸 얄팍한 호스트 통신 규격 파일(.msg)이 거대한 CMake 툴체인 파이프라인의 폭풍을 무사히 관통하여 완벽한 C++ 시스템 구조체 헤더로 변이 환생(Reincarnation)했다면, 픽스호크 마더보드 위에는 이제 더러운 패딩(Padding) 하나 없는 티 없이 깨끗한 링 버퍼(Ring Buffer) 데이터 고속도로망과 미들웨어 우체통이 정식으로 개통 설치된 셈이다.
하지만 아키텍처적으로 아무리 아름다운 우체통만 덩그러니 놓여 있다고 한들, 누군가가 편지를 쓰지 않는 이상 그 파이프 안에서 저절로 데이터 맥박이 뛰지는 않는다.
이제 우리는 이 텅 빈 우체통 안에다가 초당 수십수백 번씩 물리적 외부 환경에서 긁어모은 신선한 로우(Raw) 데이터와 피투성이의 에러 비트마스크들을 우겨넣어 펌웨어 전 세계(시스템 전역)로 폭력적으로 흩뿌려대는, 마이크로 데이터 생태계의 절대적 조물주인 발행자(Publisher) 백그라운드 C++ 데몬(Daemon) 애플리케이션을 내 손으로 직접 구현 타설해야 할 타이밍이다.
이 거대하고 공격적인 퍼블리셔(Publisher) 시스템 개발 단원에서는, 당신이 그동안 PC에서 짜왔던 일반적인 데스크탑용 소프트웨어 애플리케이션 작성을 아득히 뛰어넘어 센서 하드웨어 레지스터와 직접 호흡하고 RTOS 커널 스케줄러의 타임 슬라이스(Time Slice)를 물리적으로 지배하는 극한의 펌웨어 프로그래밍 기법을 타설하게 된다. 우리는 다음의 핵심 마일스톤들을 차례대로 조각내며 박살 내어 돌파해 나갈 것이다.
- 퍼블리셔 스켈레톤(Skeleton) 및 생존 분기 타설: 앞선 19.1.3 단원에서 텅 빈 깡통으로 설계했던 하드 리얼타임 NSH 데몬 커맨드 뼈대 위에, 거대한 uORB 시스템 인터페이스 마스터 헤더 라이브러리(
<uORB/uORB.h>)를 강제로 훅업(Hook-up)시키고, 스레드가 영원히 살아 숨 쉬는 폴링(Polling) 대기 메인 무한 루프 인프라를 바닥부터 구축한다. - 객체 인스턴스 메모리 강제 할당 및 VFS 광고(Advertisement) 마법: 우리가 제너레이터를 통해 핏빛으로 창조해 낸
sensor_test_data_s구조체의 아가리를 벌려 C++ 임베디드 RAM 메모리 위에 띄우고(Instantiate), “내가 지금부터 이 절대 주소로 이 데이터를 미친 듯이 뿌려대겠다“라고 NSH 시스템 커널 링커에게 물리적 선전포고를 날려 미들웨어 통신 경로의 마스터 점유 권한(Handle)을 단독으로 얻어내는orb_advertise()API 매크로의 치명적 비밀을 역해부한다. - 페이로드 메모리 장악 및 주입술(Publishing) 폭발: 텅 빈 C++ 구조체 변수 메모리 방주 안에 가상의 온도 센서 스칼라값과 헬스 비트마스크(Bitmask) 데이터를
memcpy쓰로틀링 없이 단숨에 밀어 넣은 뒤,orb_publish()C++ 시스템 명령 타격 한 방울만으로 이 꽉 찬 데이터를 미들웨어 링 버퍼 바다 심연으로 무자비하게 방출시키는 시스템 패스(Pass)의 절정을 미친 듯이 맛본다.
이 잔인한 3단계 프로그래밍 구현 마일스톤을 모두 완벽히 장악하게 되면, 코어 아키텍트인 당신은 이제 픽스호크 칩셋 포트에 그 어떠한 기괴하고 생소한 다국적 신규 하드웨어 센서를 동박으로 억지로 납땜해 갖다 붙이더라도 두려울 것이 없다. C++ I2C/SPI 로우 펌웨어 통신망을 강제로 끌어와서 자신의 이름으로 전역 시스템 미들웨어에 스스로의 거대한 발자국 흔적을 쾅 코딩해 새겨 넣을 수 있는, PX4 마스터 코어 펌웨어 모듈 개발자로서의 진정한 살생부 자격을 온전히 증명하게 되는 것이다.