21.5.2.1.1. 매크로에 정의된 `px4::params::CUSTOM_APP_MAX` 심볼이 펌웨어 빌드 시 XML 메타데이터로 추출되는 파이프라인

21.5.2.1.1. 매크로에 정의된 px4::params::CUSTOM_APP_MAX 심볼이 펌웨어 빌드 시 XML 메타데이터로 추출되는 파이프라인

앞서 우리는 (ParamFloat<px4::params::CUSTOM_APP_MAX>) _param_custom_app_max 라는 다소 난해한 템플릿 매크로 표현식을 소스 코드에 박아 넣었다.

여기서 CUSTOM_APP_MAX라는 변수 이름 대문자 텍스트 뒤에는 파라미터가 가질 수 있는 최댓값, 최솟값, 기본값, 그리고 이 파라미터가 무슨 역할을 하는지에 대한 사용자 설명(Description) 문구가 영혼처럼 매달려 있어야 한다. 이 혼(Soul)은 주로 소스 코드 옆에 있는 [모듈명]_params.c 형태의 C 언어 주석 파일로 작성된다.

하지만 C++ 컴파일러(GCC)는 주석 속에 적힌 영어 작문을 읽을 줄 모른다. GCC에게 주석은 그저 버려지는 쓰레기 텍스트일 뿐이다.
그렇다면 QGroundControl은 대체 어떻게 C++ 소스 코드 파일(주석) 안에 갇혀있는 이 메타데이터들을 화면에 띄워주는 것일까?

이 마술의 주인공은 컴파일러가 아니라, 펌웨어 빌드를 조정하는 **CMake 스크립트와 파이썬(Python) 파서(Parser)**이다.

1. 단계: 파이썬 파서의 소스 코드 스캐닝

여러분이 콘솔에서 make px4_fmu-vX_default 를 치고 엔터를 누르면, 진짜 C++ 컴파일이 시작되기 직전에 파이썬 스크립트 하나가 보이지 않게 실행된다. 이 스크립트의 목표는 전체 PX4 소스 코드를 텍스트 레벨에서 모조리 훑어 내는 것이다.

파이썬 스크립트는 정규 표현식(Regex)을 사용하여 파일들을 뒤지다가 이런 형태의 특별한 주석 블록을 발견하면 환호성을 지른다.

// module_params.c 파일 내부 어딘가...

/**
 * Custom App Max Speed Limit
 *
 * This parameter sets the absolute maximum speed the custom module can request.
 *
 * @unit m/s
 * @min 0.0
 * @max 30.0
 * @decimal 1
 * @increment 0.5
 * @group Custom_App
 */
PARAM_DEFINE_FLOAT(CUSTOM_APP_MAX, 15.0f);

이 주석은 단순한 잡담이 아니라, 파라미터 메타데이터 생성기가 읽어 들이는 아주 엄격한 규격의 **Doxygen 스타일 태그(Tags)**이다.
파이썬 스크립트는 @unit 태그를 보고 QGC에서 숫자에 ‘m/s’ 단위를 붙이기로 결정하고, 최솟값을 0.0, 최댓값을 30.0으로 제한하는 UI 슬라이더 바 규칙을 생성해 낸다. 제일 밑의 PARAM_DEFINE_FLOAT 코드를 통해 15.0f라는 기본값(Default)을 확정한다.

2. 단계: 거대한 XML 덩어리로의 융합

파이썬 스크립트는 수백 개의 파일에서 이런 메타데이터 조각들을 긁어모아 거대한 하나의 산출물, parameters.xml 이라는 텍스트 트리를 조립해 낸다.

<!-- 파이썬이 짜 맞춰낸 최종 parameters.xml 파일 엿보기 -->
<parameter default="15.0" name="CUSTOM_APP_MAX" type="FLOAT">
    <short_desc>Custom App Max Speed Limit</short_desc>
    <long_desc>This parameter sets the absolute maximum speed the custom module can request.</long_desc>
    <min>0.0</min>
    <max>30.0</max>
    <unit>m/s</unit>
    <decimal>1</decimal>
    <increment>0.5</increment>
</parameter>

3. 단계: 바이너리 압축 및 펌웨어 포장

이 거대한 문자열 텍스트 파일(XML)을 그대로 펌웨어에 박아 넣기엔 픽스호크의 메모리는 너무나 비좁다.
따라서 CMake 빌드 시스템은 이 XML 파일을 GZip 류의 압축 알고리즘으로 꾹꾹 눌러서(Compress) 알아볼 수 없는 이진 바이너리 바이트 덩어리(Byte Array)로 빚어낸다.

마지막으로, 최종 펌웨어 바이너리(.px4 파일)를 패키징할 때, 실제 C++ 코드가 컴파일된 기계어 덩어리와 함께 이 압축된 메타데이터 덩어리를 펌웨어 뒤편에 몰래 붙여서(Appending) 하나의 완성된 비행 컨트롤러 영혼을 탄생시킨다.

여러분이 기체에 USB를 꽂는 순간, QGC는 이 뒷구멍에 숨겨져 있던 바이너리 압축 덩어리들을 재빨리 해동(Decompress)시킨 뒤 XML 파일을 파싱하여, 마치 살아있는 C++ 객체의 뇌 속을 스캔하는 것처럼 직관적인 파라미터 튜닝 화면을 여러분의 모니터 위에 예쁘게 렌더링해 내는 것이다.