# 1. 시스템 모니터링 및 성능 분석(Profiling)
펌웨어 최적화라는 극단주의적 세계에서 추측(Guessing)은 죄악이다. “아마 여기서 타이밍이 밀렸을 거야“라는 짐작만으로 C++ 코드를 수정했다가는 전혀 엉뚱한 부수 효과(Side-effect)로 기체를 날려 먹기 일쑤다. PX4는 커널 내부에서 어느 스레드가 CPU를 얼마나 갉아먹는지, 어느 인터럽트가 지연(Latency)을 유발하는지 소수점 마이크로초 단위로 추적하는 고강도 프로파일링(Profiling) 메커니즘을 내장하고 있다.
커널 심전도 추적: top 명령어 아키텍처
GCS 환경인 제어 QGroundControl MAVLink 콘솔이나 직접 J-Link를 통해 NSH 프롬프트에 들어가 top 명령어를 입력하면, 리눅스의 그것과 매우 흡사한 실시간 모니터링 표가 무자비하게 쏟아져 내린다.
이 텍스트 패널은 단순한 텍스트 덩어리가 아니라, NuttX 커널 타임 타이머(Tick)에 직접 의존하여 다음 항목들을 초당 정밀 타격한다.
- CPU 점유율 (%):
mc_att_control이나ekf2가 CPU 시간을 얼마나 가져가는지 직관적으로 보여준다. 만약 당신이 새로 추가한 커스텀 앱 모듈이 15% 단위를 넘어선다면 즉각 코드 효율성을 의심해야 한다. - 스택(Stack) 여유량 검증: 각 스레드(Task)를 처음 생성할 때
px4_task_spawn함수의 4번째 인자로 스택 깊이(예: 2048 바이트)를 강제로 할당한다.top명령은 이 중 가장 많이 빨려 들어간 한계 수위(High Watermark)를 추적하여 여유 공간(Left)을 바이트 단위로 전시한다. 여유 공간이 0에 도달하면 그것이 바로 ‘스택 오버플로(Stack Overflow)’ 메모리 침범 하드폴트 사망의 원흉이다.
마이크로초 프로파일링: perf (Performance Counter) 카운터
CPU 퍼센트는 전체적인 숲이라면, perf 엔진은 소스코드 특정 라켓 블록의 멱살을 잡고 ’이 함수 블록을 통과하는 데 정확히 몇 마이크로초(us)가 걸렸는지’를 현미경으로 채집하는 절대 무기다.
PX4의 주요 수학 연산 소스코드(ekf2.cpp 등) 내부를 열어보면 블록 시작점과 종료점에 perf_begin(counter) 및 perf_end(counter) 매크로가 도배되어 있다. 이 블록이 시스템 타이머 레지스터를 찍어 기록하는 것이다.
콘솔 창에서 perf 커맨드를 발사하면, 어떤 C++ 함수가 평균 40us, 최대 1500us(Max) 로 튀어 오르는 지터를 발생시켰는지 통계적으로 까발려준다. 이 Maximum 통계값이 바로 시스템 타이밍 보증을 깨부수는 악성 코드 덩어리를 색출하는 유일한 단서가 된다.
이러한 마이크로 프로파일링 방어 기제들을 자유자재로 다루잡지 않고서는 결코 자율 비행 커스텀 펌의 릴리즈 승인 티켓을 거머쥘 수 없다.