# 1. 시스템 부트스트랩 및 초기화 스크립트: ROMFS/px4fmu_common/
C++ 코드가 아무리 완벽하게 빌드되어 헥스(.px4) 파일로 바뀌더라도, CPU에 전기가 꽂힌 직후 이 수백 개의 모듈을 ‘어떤 순서로’, ‘누가 먼저’ 깨워야 하는지를 지시하는 안무가(Choreographer)가 없다면 시스템은 패닉에 빠진다. 센서 드라이버가 켜지기도 전에 EKF 추정기를 켜면 널 포인터를 참조해 기체가 기절해 버리기 때문이다.
PX4의 부팅 시퀀스(Boot Sequence)를 통제하는 절대적인 작전 지휘소가 바로 ROMFS/px4fmu_common/init.d/ 디렉토리 내부에 서식하는 초기화 스크립트(rc.S) 들이다.
NuttShell 스크립팅: 리눅스 배시(Bash)의 미니어처
이 디렉토리를 열어보면 프로그래밍 파일이 아니라 .px4 시절부터 내려온 기묘한 셸 스크립트 파일들로 가득 차 있다. 문법은 리눅스의 sh나 bash와 놀라울 정도로 흡사하다.
기체에 전원이 인가되고 NuttX 커널 초기화가 끝나면, 커널은 가장 먼저 숨겨진 가상 디스크(ROMFS) 마운트 공간에 있는 최상위 스크립트인 rc.S 파일을 찾아내어 한 줄씩 읽어 내리기 시작한다.
부팅 서사시 (The Boot Epic)
rc.S 가 지휘하는 시스템 부트스트랩의 과정은 다음과 같은 철저한 계급 규칙을 따른다.
- 버스 및 파일 시스템 장악: I2C, SPI 버스를 물리적으로 스캔(Scan)하고, SD 카드가 꽂혀 있다면
/fs/microsd통로를 마운트하여 데이터를 쓸 준비를 한다. - uORB 신경망 개통:
uorb start명령어로 내부 메시지 통신망(Broker)의 심장을 뛰게 한다. 이 신경망이 없으면 뒤이어 켜지는 어떤 형제들도 대화할 수 없다. - 파라미터 로드: 기체 고유의 튜닝 값(PID, 센서 오프셋)을 플래시나 SD 카드에서 추출하여 RAM 파라미터 공간에 캐싱(Caching)한다.
- 프레임 분기점 (
rc.autostart): 사용자가 QGroundControl에서 “나의 기체 형상은 쿼드콥터(4001)다“라고 세팅한 환경 변수SYS_AUTOSTART매직 넘버를 찾아낸다. 이 숫자에 따라init.d/airframes/통로 수백 개 중 단 하나의 대본을 로드하여, 쿼드콥터용 모터 믹서(Mixer)와 제어기 계수들을 투입한다. - 하위 드라이버 및 백그라운드 깨우기 (
rc.sensors,rc.logging): 설정된 기체 프레임에 맞는 타당한 센서 드라이버(IMU, GPS) 데몬들을start파라미터와 함께 백그라운드로 밀어 넣는다 (예:gps start &). - 마지막 뇌수 가동 (
rc.mc_apps등): 모든 물리적 감각 기관(센서)이 uORB 신경망에 데이터를 뿜기 시작했다는 것이 100% 확정되는 부팅의 극 후반부 찰나에, 최종적으로 비행 제어기(mc_att_control)와 EKF2 상태 추정기를 시동시킨다.
이 무자비한 순차 실행 루틴 중 단 한 줄에서 크래시(Crash)가 나면 스크립트 실행이 중단되며 메인 루프에 도달하지 못하여 그 유명한 “죽음의 빨간색/파란색 LED 고정” 상태를 유발한다. 따라서 이 셸 스크립트 영역을 건드리는 자는 시스템 OS의 프로세스 생명 주기를 완벽히 꿰뚫고 있어야 한다.