19.7.3.1. `PX4_INFO`, `PX4_WARN`, `PX4_ERR` 매크로를 이용한 콘솔 메시지 출력

19.7.3.1. PX4_INFO, PX4_WARN, PX4_ERR 매크로를 이용한 콘솔 메시지 출력

19.7.3 단원의 서두에서 C++ 표준의 printfstd::cout을 PX4 생태계에서 절대 금기시했던 가장 큰 이유는, 이 함수들이 OS 스케줄러의 문맥 전환(Context Switching) 락(Lock)을 걸어버려 수백 마이크로초(us) 동안 내 데몬 스레드를 프리징(Freezing) 시켜버리는 끔찍한 오버헤드를 발생시키기 때문이다.
또한 리눅스 터미널에 뿌려진 printf 텍스트는 드론이 전원을 끄는 순간 영원히 우주 속으로 증발하므로, 실제 비행 중에 터진 램 오류를 사후 검증할 길이 완전히 차단된다.

이 파멸을 방어하기 위해 PX4 코어 프레임워크는 <px4_platform_common/log.h> 헤더 안에 전지전능한 **3단계 로깅 매크로 삼신기(PX4_INFO, PX4_WARN, PX4_ERR)**를 탑재시켜 두었다.

1. 로깅 매크로의 듀플렉스(Duplex) 파동 아키텍처

이 매크로 삼신기를 코드 안에서 타격하는 순간, 백그라운드 uORB 로거 데몬(Logger)은 그 텍스트 스트링을 낚아채어 두 갈래의 길로 무자비하게 동시에 찢어 발사(Duplex)한다.

  1. 전경 렌더링 (Terminal Console): 개발자가 현재 눈으로 보고 있는 SITL NSH 콘솔 터미널 창(px4>) 위로 실시간 컬러 텍스트를 띄워준다.
  2. 영구 레이저 각인 (ULog File): 동시에 백그라운드 버퍼에 쌓아두었다가, 마더보드의 물리적 SD 카드 디스크에 저장되는 .ulg 블랙박스 파일의 타임라인(Timeline) 텍스트 채널 속에 영원히 삭제 불가능하게 각인(Flushing)해 버린다.

2. 단계 경계 태세 매크로의 물리적 타설법

이 매크로 함수들은 C 표준 라이브러리의 printf와 쌍둥이처럼 똑같은 문맥 포맷 지시자(%d, %f, %s)를 지원하므로 개발자는 문법을 새로 배울 필요가 없다. 오직 자신이 토해내고자 하는 텍스트가 시스템에서 어떤 색상(Color)과 위험 등급을 가지는지만 아키텍트의 피도 눈물도 없는 잣대로 결정하면 된다.

#include <px4_platform_common/log.h> // 절대 권력 매크로를 호출하기 위한 마스터 헤더

// (내 데몬 클래스의 멤버 함수나 C루프 내부 어딘가)

// ----------------------------------------------------------------------
// 1. [평화로운 상태 보고: PX4_INFO] (흰색/기본색 텍스트)
// - 데몬 부팅 성공, 특정 인스턴스 락온 성공 등 정상적인 흐름의 마일스톤을 기록
// - 남발해도 좋지만, 1000Hz 루프 안에서 매 틱마다 쏴버리면 SD 카드가 하루 만에 폭발한다.
PX4_INFO("Sensor %s daemon successfully booted. Assigned Instance: %d", "I2C_Temp", my_instance_id);


// ----------------------------------------------------------------------
// 2. [가벼운 경계 경보: PX4_WARN] (노란색 텍스트)
// - 데이터가 한두 번 누락되었거나(Timeout), 값이 정상을 살짝 벗어났지만 
// 데몬이 자동으로 복구(Failover)하여 비행에 치명적이지는 않은 우발적 상황
int missed_frames = check_data_drops();
if (missed_frames > 10) {
    PX4_WARN("Buffer lagging detected! Dropped %d frames. System auto-recovering...", missed_frames);
}


// ----------------------------------------------------------------------
// 3. [파멸과 추락의 선고: PX4_ERR] (시뻘건 핏빛 텍스트)
// - 다중 인스턴스 할당 공간이 고갈(OOM)되었거나, 모든 듀얼 GPS 방이 물리적으로 박살 난 상황
// - 이 로그가 뜨면 EKF 메인 항법 필터는 즉각 발산하고 드론은 추락한다. 
// - 절망적인 사망 선고를 콘솔에 찢어발기듯 출력한다.
if (all_sensors_dead) {
    PX4_ERR("FATAL: ALL 3 SENSOR INSTANCES TIMED OUT! NAVIGATION SYSTEM CATASTROPHIC FAILURE! BRACE FOR IMPACT!");
    return PX4_ERROR; // 즉각적인 데몬 할복(Terminate) 자살 트리거
}

이 매크로 레이더들을 영리하게 배치하는 순간, 개발자는 NSH 쉘 프롬프트 창에 앉아서 오색찬란하게 터져 나오는 INFO의 백색 로그와 WARN의 노란색 라인들을 구경하며, 보이지 않는 VFS 파이프라인 내부에서 일어나는 데이터의 혈투를 영화를 보듯 우아하게 감상할 수 있는 권력을 얻게 된다.
다음 19.7.3.2 단원에서는, 이 매크로를 퍼블리셔 0번 방과 구독자 루프 양쪽에 심어놓고, 양쪽이 주고받은 십진수 부동소수점 데이터가 단 0.0001의 오차율(Precision)도 없이 완벽하게 복사(Deep-copy) 임플란트 되었음을 콘솔 창에서 물리적으로 입증해 내는 궁극의 무결성 대조 실험을 진행할 것이다.