# 1. PX4 부팅 시퀀스(Boot Sequence) 및 초기화 과정
배터리의 XT60 커넥터가 꽂히면서 전기가 픽스호크 보드로 밀려 들어가는 그 찰나의 순간(0.000초), 아무 생각 없는 차가운 돌덩어리(실리콘)가 거대한 비행 시스템으로 환골탈태하기까지의 부트스트랩(Bootstrap) 서사시를 분해한다. 1 밀리초 단위로 벌어지는 이 극비 스크립트 시퀀스를 장악하지 못하면, 시스템 먹통(Hang)이나 센서 인식 불가 오류 앞에서 하염없이 LED 불빛만 바라보며 저주를 퍼붓게 될 것이다.
Phase 1: Bootloader의 황금 시간 (0s ~ 5s)
가장 밑바닥 플래시 메모리(0x08000000)에서 조그마한 PX4 부트로더가 눈을 뜬다. 가장 먼저 기초적인 클럭(PLL)만을 인가한 뒤, USB 포트롤 열고 약 5초간 침묵 모드(Waiting State)로 방어 태세를 취한다. 이 시간에 호스트 컴퓨터 텔레메트리에서 upload 패킷 핑거프린트가 날아오면 펌웨어 강제 플래싱 모드로 전환된다. 5초가 지나도 신호가 없으면, 부트로더는 제어권(PC, Program Counter)을 쿨하게 메인 펌웨어의 시작 주소로 던져버린다(Jump).
Phase 2: NuttX 커널의 빙의 (OS Bring-up)
제어권을 넘겨받은 메인 펌웨어의 시작점은 C++ 이 아니라 어셈블리어 초기화 벡터 테이블이다. 스택 포인터(SP)를 램(RAM) 끝자락에 꽂고 곧바로 nx_start() 함수를 호출한다. 이때 비로소 운영체제(OS)가 탄생한다.
- RAM 영역의 쓰레기 공간(.bss 섹션)을 0으로 싹 밀어버린다.
- 인터럽트 처리기(NVIC)를 활성화한다.
- 힙(Heap) 메모리 매니저를 가동한다. 이제부터
malloc()이 생명력을 얻는다. - OS가 최초의 심장 박동(Idle Task) 스레드를 가동하면서 뼈대 공사가 끝난다.
Phase 3: 무자비한 rc.S 가동 (PX4 Initialization)
커널 공사가 끝나는 순간, OS는 /etc/init.d/rc.S 파일에 적혀있는 텍스트 셸 스크립트(NuttShell)를 한 줄씩 라인 바이 라인으로 읽어 들이며 시스템 앱(모듈)들을 강제 기상시키기 시작한다.
- 장기 이식 (Mount): SD 카드를 VFS 트리
/fs/microsd에 마운트한다. - uORB 혈맥 개통: 버스 통신망인
uorb start데몬을 올려 메시징 버스 트래픽을 오픈한다. - 신경망 확장 (Parameters & I2C/SPI): 배터리에 절여져 있던 플래시에서 파라미터 트리를 RAM으로 캐싱(Caching)해 온다. 그리고 I2C 버스를 스캔하여
bmp388(기압계),bmi088(IMU) 등의 센서 드라이버 스레드를 줄줄이 백그라운드로 띄운다bmi088 start -s &. - DNA 결합 (Airframe): 매직 파라미터
SYS_AUTOSTART(예: 4001) 를 참조하여 쿼드콥터 전용 서브스크립트rc.mc_apps분기점으로 뛰어들어 모터 믹서(Mixer) 파일을 로드해 채널 맵핑을 마무리한다. - 두뇌 가동 (Commander & Estimator): 마지막으로 최후미에 대기하고 있던 최고 자아인
commander(의사결정) 와ekf2(데이터 융합 추정기)에 전원을 투입한다.
이 방대한 스크립트 실행이 단 한 줄의 세그멘테이션 폴트(Segmentation Fault)도 없이 메모리에 안착하는 그 순간, 비로소 부저(Buzzer)에서 웅장한 시그니처 멜로디 3단 콤보가 울려 퍼진다. 부팅 승리 선언이다.