18.2.2.1 기본 자료형 매핑: `uint8_t`, `float32`, `bool` 등의 C++ 표준 타입 변환 매트릭스

18.2.2.1 기본 자료형 매핑: uint8_t, float32, bool 등의 C++ 표준 타입 변환 매트릭스

C++ 언어의 가장 큰 특징이자 동시에 하드 리얼타임 통신에서 가장 치명적인 약점은, 기본 자료형(Primitive Type)의 메모리 크기가 플랫폼과 컴파일러에 따라 유동적(Platform Dependent) 이라는 사실이다.

예를 들어 고전적인 C/C++ 표준에서 int 타입은 “시스템의 기본 워드 크기“를 의미하기 때문에, 16비트 구형 MCU에서는 2바이트(Byte), 32비트 ARM 프로세서에서는 4바이트, 64비트 리눅스 머신에서는 4바이트 또는 8바이트로 구현될 수 있다. 만약 64비트 리눅스가 탑재된 라즈베리 파이(Raspberry Pi, Companion Computer)와 32비트 픽스호크(Pixhawk) 보드가 서로 struct { int a; } 형태의 메모리를 통째로 교환(memcpy)한다면, 데이터 크기 불일치로 인해 필연적으로 메모리 바이트 시프트(Byte Shift) 쓰레기 값이 발생하게 된다.

uORB 파이프라인은 이러한 참사를 원천봉쇄하기 위해 모호한 C++ 기본 타입을 일절 배제하고, 크기가 절대적으로 고정된 <cstdint> 표준 타입 변환 매트릭스(Matrix) 를 엄격하게 적용한다.

1. uORB \rightarrow C++ 타입 변환 매트릭스

px4_generate_messages.py 스크립트는 .msg 파일 내에 작성된 ROS 문법의 데이터 타입을 아래의 매트릭스 규칙에 따라 하나도 빠짐없이 명시적인 C++ 타입으로 1:1 강제 매핑한다.

.msg 타입 (uORB)자동 생성된 C++ 타입메모리 할당 크기 보장 (플랫폼 무관)설명 및 용도
uint8 / int8uint8_t / int8_t정확히 1 바이트 (8 Bits)열거형 상태값, 비트마스크(Bitmask), 플래그 제어용
uint16 / int16uint16_t / int16_t정확히 2 바이트 (16 Bits)제한된 범위의 센서 ADC Raw 데이터 등
uint32 / int32uint32_t / int32_t정확히 4 바이트 (32 Bits)인덱스, 고해상도 상태 카운터
uint64 / int64uint64_t / int64_t정확히 8 바이트 (64 Bits)글로벌 타임스탬프(마이크로초), 초정밀 카운터
float32float정확히 4 바이트 (32 Bits)대부분의 물리량 제어 변수 (각도, 속도, 가속도 등)
float64double정확히 8 바이트 (64 Bits)WGS84 위도/경도 등 초정밀 부동소수점 데이터
boolbool정확히 1 바이트 (8 Bits)*참/거짓 논리 변수

*참고: C++ 표준에서 bool의 크기는 컴파일러 구현에 맡겨져 있으나, PX4가 지원하는 GCC/Clang (ARM/x86 환경)에서는 사실상 1바이트로 굳어져 있으며, PX4 빌드 시스템 내의 컴파일 타임 static_assert 구문을 통해 sizeof(bool) == 1 임을 펌웨어 전역에서 강제 검증한다. 부동소수점 역시 IEEE-754 표준 포맷으로 메모리 레이아웃이 동일함을 보장받는다.

2. 매핑의 물리적 의의

이러한 고정 폭 정수형(Fixed-width Integer Type)으로의 강제 매핑은 “구조체의 총 메모리 크기(Byte Size)sizeof(struct)가 어느 CPU 플랫폼에서 컴파일하든 완전히 동일한 상수(Constant)로 도출됨“을 보장하는 기초 공사이다.

이를 통해 픽스호크 내부의 ARM Cortex-M(32비트) 프로세서는 물론, ROS 2 브릿지(microRTPS/uXRCE-DDS)를 통해 연결된 이기종 컴패니언 컴퓨터(64비트 x86, ARM64 등) 간에도 어떠한 직렬화나 데이터 사이즈 캐스팅(Casting) 변환 없이 안전하게 구조체를 넘겨받아 해석할 수 있는 견고한 토대가 마련된다.