### 0.0.1 드라이버 모듈 진입점(Entry Point) 및 객체 생명주기
PX4-Autopilot 아키텍처에서 모든 센서 드라이버 모듈은 독립적인 콘솔 애플리케이션(Console Application)처럼 행동하도록 설계되었다. NuttX RTOS 기반의 셸(NSH) 프롬프트 창에서 사용자가 gps start라고 타이핑하면 백그라운드 스레드가 띄워지고, gps stop을 쳐서 안전하게 객체들을 식락(Teardown)시킬 수 있는 일종의 마이크로 서비스(Micro-service) 생태계를 모방한다.
이러한 모듈형 동작을 가능케 하는 심장부가 바로 src/drivers/gps 디렉토리 내에 위치한 gps_main.cpp 진입점(Entry Point) 모듈이며, 이 파일은 인스턴스 레이어와 C++ 애플리케이션 레이어를 잇는 단단한 브릿지(Bridge) 역할을 수행한다.
0.1 전역 인스턴스(Global Instance) 관리와 싱글턴(Singleton) 지향 패턴
하나의 비행 제어기 하드웨어 보드에는 통상적으로 1개, 듀얼(Dual) GPS 구성 시 최대 2개의 GPS만 장착된다. PX4는 메모리와 시스템 자원의 남용을 방지하기 위해 gps_main.cpp 상단에 네임스페이스 전역 포인터(Global Pointer)를 선언하여 인스턴스의 증식(Proliferation)을 엄격하게 제한한다.
namespace gps컨텍스트 내부에GPS *g_dev = nullptr;형태로 메인 객체 포인터가 대기한다.- 만약 부팅 스크립트(Startup Script)나 사용자가
gps start명령어를 연속으로 두 번 날리게 되더라도, 커널 인터페이스는if (g_dev != nullptr)조건문을 통해 이미 활성화된 객체가 존재함을 파악하고 “GPS is already running” 이라는 경고와 함께 두 번째 생성 시도를 조기에 차단해 버린다. 이는 하드웨어 UART 포트 자원 충돌을 방지하는 가장 원시적이면서도 확실한 객체 생명주기(Lifecycle) 통제 기법이다.
0.2 task_spawn()을 이용한 백그라운드 워커 스레드 점화(Ignition)
모듈의 진입점 로직 중 가장 핵심적인 순간은, 셸 스레드(명령을 친 사용자 스레드)와 실제 드라이버가 구동될 백그라운드 스레드를 분리해 내는 분기점(Bifurcation)이다.
gps start커맨드가 접수되면, 구문 분석 파서는 매개변수들(예:-d /dev/ttyS3,-b 115200등 지정 포트 옵션)을 쓸어 담아 설정 구조체를 채운다.- 옵션 검증이 끝나면 PX4의 프로세스 생성 래퍼 알고리즘인
px4_task_spawn_cmd()가 호출된다. - 이 함수는 지정된 메모리 스택 크기(Stack Size)와 내부 우선순위(Priority, 통상 기본 스케줄링 큐 내에서 적중률이 높은 값)를 할당받아, 운영체제의 문맥망(Context Web) 깊숙한 곳에 고립된 백그라운드 스레드인
gps_thread_main()무한 루프 인스턴스를 격발(Trigger)시킨다. - 생성 스레드는 무사히 백그라운드 스레드가 동작을 개시했음을 확인한 직후,
0(성공) 코드를 반환하며 셸 프롬프트 제어권을 다시 사용자에게 깔끔하게 돌려준다.
0.3 마스터(Master) 객체의 생성과 해체(Teardown) 단계
방금 탄생하여 런타임 위를 질주하기 시작한 백그라운드 gps_thread_main() 스레드는 가장 먼저 자신을 관장할 C++ 마스터 객체(class GPS)를 메모리에 동적 할당(Instantiate)한다.
- 생성(Instantiating):
new GPS(설정자들...)구문을 통해 할당된 이 마스터 객체는 드라이버 전체의 문맥을 품는다. 앞서 언급한 ’1번’의g_dev포인터에 자신의 메모리 주소를 각인시킨 뒤, 내부의 Run 루프(run())로 뛰어든다. 이때부터 UART 버퍼 폴링과 uORB 퍼블리싱(Publishing)의 기나긴 여정이 이어진다. - 중지 지시자 접수: 비행이 종료되거나 센서 리셋을 위해 사용자가
gps stop을 타건하면, 커널은gps_main.cpp상단에 선언된 스레드 안전성(Thread-safe) 플래그인thread_should_exit불리언(Boolean) 변수를true로 바꾼다. - 우아한 해체(Graceful Teardown): 돌고 있던 마스터 객체의 루틴은 폴링이 끝나는 매 틱(Tick)마다 저 변수를 엿본다.
true를 발견하는 즉시 무한 루프(while (!thread_should_exit))를 탈출하고, 직렬 포트(close(fd))를 닫고, uORB 발행기 메모리를 정리한 뒤, 객체 자기 자신을 안전하게 파괴(delete g_dev;)한다.
어떠한 강제 종료(SIGKILL)나 메모리 누수(Memory Leak) 없이, 모든 자원을 운영체제 힙(Heap)에 고스란히 반납하고 사라지는 PX4 드라이버 모듈만의 이 정돈된 생태 구조는 이후 다른 모든 센서(IMU, Baro 등) 드라이버 구현 방식의 표본(Standard)이 된다.