19.3.3.1. orb_advertise()를 통한 Topic 등록 및 발행 핸들(orb_advert_t) 획득
우리가 아무리 완벽한 센서 데이터를 0으로 포맷팅하고 값비싼 구조체에 꽉꽉 채워 넣었다고 한들, PX4 커널 VFS 시스템 코어는 내가 그것을 미들웨어에 쏠 자격이 있는지 스스로 증명해 내기 전까지는 절대로 전역 링 버퍼(Ring Buffer)로의 입구를 열어주지 않는다. C++ 메모리 변수를 넘어 거대한 시스템 펌웨어 생태계로 데이터를 송출하기 위한 가장 첫 번째이자 절대적인 합법적 도선(Pipeline) 개통 절차는 바로 ’광고(Advertisement)’라는 일방적 선언 행위이다.
이 행위는 C++ 워커 스레드가 **“나라는 데몬 프로세스가 지금부터 이 특정 규격(sensor_test_data)의 데이터를 PX4 미들웨어망에 독점적(혹은 다중)으로 무한정 퍼블리시(Publish)하겠다”**라고 시스템의 uORB 코어 통제소에 폭력적으로 선전포고를 날리고, 그 대가로 데이터를 쏠 수 있는 합법적 허가증 마스터 키(Handle)를 뜯어 얻어내는 무자비한 해킹 과정이다.
1. orb_advertise() C API 코어의 해부 타설
시스템 하부 아키텍처에 가장 로우 레벨(Low-level)이자 하드코어하게 접근하는 정통적인 C++ 임베디드 코딩 방식은, 순수 마스터 C API인 orb_advertise() 함수를 직접 타격하는 것이다. 가장 중요한 설계 철칙은, 이 무거운 시스템 콜 함수는 데몬 일생에 **단 한 번 호출되며, 반드시 메인 무한 루프 블록 바깥(상단)**에 타설되어야 한다는 것이다. 무한 루프(while) 감방 안에서 매 반복마다 미들웨어에 광고 폭격을 때리는 것은, 커널의 파일 시스템(VFS) 코어 자원과 CPU를 통째로 갉아먹고 기체를 추락시키는 미친 1급 자해 행위이다.
// 1. 초기 덤프 데이터 포맷팅 (명세상 광고를 뚫을 때 초기 데이터 첫 프레임을 가상으로라도 밀어 넣어야 한다)
sensor_test_data_s initial_data{};
initial_data.timestamp = hrt_absolute_time();
// 2. 미들웨어 VFS 통제망에 퍼블리셔 선전포고 (메인 무한 루프 진입 전 1회만 단독 실행)
// - 첫 번째 인자 ORB_ID(sensor_test_data): 19.2.4 단원에서 역설계로 확인했던 그 거대한 절대 메타데이터 주소 앵커 매크로
// - 두 번째 인자 &initial_data: VFS 노드 디렉토리 트리를 뚫자마자 최초로 초기화시켜 버릴 첫 페이로드 포인터 물리 주소
orb_advert_t sensor_pub_handle = orb_advertise(ORB_ID(sensor_test_data), &initial_data);
// 3. 광고 획득 실패에 대한 무자비한 물리적 방어 분기 처리
// (보통 VFS 메모리가 꽉 찼거나, 컴파일 링킹이 끊어졌을 때 nullptr을 토해낸다)
if (sensor_pub_handle == nullptr) {
PX4_ERR("Failed to advertise sensor_test_data topic! Core will suicide.");
return -1; // VFS 노드 생성 실패가 감지되면 어설프게 살려두지 않고 데몬을 즉각 자살(Exit) 처리시킨다.
}
// ... 이 방어벽을 뚫어낸 이후 비로소 무한 루프 진입 ...
while (!thread_should_exit) {
// 센서 취득 및 발행 로직
}
2. 영구 발행 허가증의 정체: orb_advert_t 핸들(Handle)
위의 orb_advertise() C 마스터 함수가 NuttX 커널단에서 에러 없이 무사히 성공(Success) 반환되었다면, 우리 데몬 스레드는 힙에 orb_advert_t라는 묘한 타입의 절대적인 메모리 포인터 블랙박스 핸들(Handle)을 손에 단독으로 거머쥔 것이다. 이 얇고 보잘것없어 보이는 포인터 변수 주소값의 소름 돋는 실체는, 내부적으로 NuttX RTOS 파일 시스템 트리 내부(예: /obj/sensor_test_data)에 단일로 뚫린 링 버퍼 파일 디스크립터(File Descriptor, FD)를 향해 24시간 열려 있는 가장 빠른 다이렉트 핫라인(Hotline) 전용 고속도로다.
이제 우리는 감방 같은 무한 루프의 속박 안에서, 매 사이클(100Hz) 반복마다 orb_advertise()를 부르며 내가 누군지 멍청하게 인증할 필요가 전혀 없다. 그저 저 외곽에서 한 번 훔쳐 확보해 둔 sensor_pub_handle 마스터 키 하나만 덜렁 쥐고, 그저 깡통 커스텀 구조체의 내용물(온도, 스칼라값)만 10ms마다 미친 듯이 최신화로 지워 바꾼 뒤, orb_publish() 단일 서브루틴 명령 한 방으로 버퍼 파이프에 수십 바이트 구조체를 통째로 들이붓기만 하면 되는 것이다.
시스템 코어 스케줄러는 이 핸들을 통해 “아, 저 C++ 스레드가 부팅 직후 아까 당당하게 호적을 판 광고했던 그 합법적 퍼블리셔가 맞군!” 하고 무거운 보안 인증 단계 틱(Tick)들을 모조리 생략한 채, 당신이 쏜 피눈물 나는 데이터를 단 5마이크로초 이내에 링 버퍼망 최심층부로 초고속 렌더링 통과시켜 버리는 시스템 패권을 거머쥐게 되는 것이다.