# 1. 하드웨어 추상화 및 타겟 보드 설정: `boards/` 및 `platforms/`

# 1. 하드웨어 추상화 및 타겟 보드 설정: boards/platforms/

수백 번의 make px4_fmu-v6c_default 명령어를 치면서도 이 명령어가 소스 트리 내부 어디로 향하는지 모르는 엔지니어가 태반이다. PX4의 진정한 이식성(Portability)은 순수 비행 로직(src/)과 하드웨어 스펙(boards/) 및 커널 인터페이스(platforms/)를 무자비하게 분리한 아키텍처 디자인에서 뿜어져 나온다.

boards/ 디렉토리: 하드웨어의 혈통서
이곳은 납땜 된 저항 하나, 핀 구명 하나까지 C++ 매크로로 형상화해 놓은 제조 공장이다. boards/px4/fmu-v6c/ 폴더 내부로 진입해 보면 다음과 같은 치밀한 설정 파일들이 아가리를 벌리고 있다.

  1. default.px4board (Kconfig의 결정판): 이 보드에 어떤 센서 드라이버 모듈을 태우고 어떤 컨트롤러(예: Rover 제외, Multicopter 포함)를 탑재할지 CONFIG_DRIVERS_IMU_BOSCH_BMI088=y 방식으로 나열한 텍스트 기반 설계도다. 플래시 메모리 한계치에 따라 포함할 모듈을 여기서 칼같이 재단한다.
  2. hw_config.h (하드웨어 핀 맵핑): 픽스호크 보드 메인 MCU(예: STM32H7)의 1번 핀이 PWM 아웃풋인지, UART 통신의 TX인지, 아니면 ADC 포트인지 레지스터 값을 GPIO_ 매크로를 통해 하드코딩 해놓는다. 하드웨어 엔지니어가 자신의 보드를 땜질 새로 했다면 이 파일을 1순위로 건드려야 한다.
  3. board_config.h: 보드 고유의 클럭 스피드(PLL), 배터리 전압 분배 저항비, 기본 통신 속도(Baudrate) 등 전자회로 레벨의 초기화 상수가 박혀있다.

platforms/ 디렉토리: 커널 독립의 성채
NuttX(임베디드 타겟)와 POSIX(SITL, 라즈베리파이 타겟)는 운영체제가 다르므로 스레드(Task)를 깨우고 메모리를 할당(malloc)하는 문법이 완전히 상이하다. PX4는 src/에 있는 코드가 OS의 눈치를 보지 않고 오직 px4_task_spawn_cmd() 같은 통합 매크로만 부르게 만들어 놓았다.
px4_task... 통합 매크로가 호출되면, 컴파일 타임에 platforms/nuttx/ 폴더 안의 래퍼(Wrapper) 로 넘어가서 진짜 NuttX용 task_create() 로 치환되거나, platforms/posix/ 폴더로 넘어가서 리눅스용 pthread_create() 로 갈라져 번역된다.
즉, platforms/ 는 하나의 소스 코드가 어떤 OS 진흙탕에서도 더럽혀지지 않게 막아주는 강력한 인터페이스 어댑터(Adapter) 방어벽 역할을 수행한다.