19.3.1.2. 메인 루프(Main Loop) 구성 및 모듈 상태 관리(State Management) 변수 선언
모든 시스템 헤더 파일의 핏빛 혈관 연결 결합 작업이 무사히 에러 없이 끝났다면, 이제 퍼블리셔(Publisher) 데몬의 실질적 생사가 극적으로 결정되는 메인 스레드 컨트롤 타워(Control Tower)를 뼛속부터 단단하게 구축할 차례이다. PX4 생태계의 커스텀 백그라운드 모듈은 단 한 번 호출되어 절차적으로 실행되고 허무하게 죽어버리는 가벼운 파이썬 스크립트 나부랭이가 결코 아니다. 픽스호크 마더보드 칩셋에 배터리 전원이 인가되어 비행하는 그 내내 무한 루프(Infinite Loop) 사이클을 뱀처럼 돌며, 우직하게 센서 레지스터를 폴링(Polling)하고 전역 uORB 미들웨어에 데이터를 잔혹하게 쏟아붓는 불멸의 파수꾼 런타임 형상을 띠어야만 한다.
1. 절대적 무한 루프 뼈대 타설과 킬 스위치(Kill-Switch) 트리거
우리가 가장 앞선 19.1.3 메인 함수 단원에서 데몬의 라이프사이클을 통제하기 위해 시스템 전역 변수로 미리 선언해 둔 thread_should_exit 플래그는, 백그라운드 스레드가 외부 명령에 의해 스스로 목숨을 끊게(Stop) 만드는 유일한 절대 킬 스위치(Kill-Switch)이다. 이 플래그 변수를 유일한 조건식으로 삼는 무자비한 while 루프 감방을 메인 비즈니스 로직 함수(Thread 진입점) 텍스트 안에 바로 타설한다.
// 앞서 NSH 쉘 제어 단에서 선언한 데몬 파괴 통제 플래그를 절대적 조건으로 삼는 극한의 무한 루프
while (!thread_should_exit) {
// [TODO] 1. 센서 하드웨어 레지스터 다이렉트 접근 및 물리 데이터 칩셋 획득(Polling)
// [TODO] 2. 텅 빈 C++ 커스텀 메모리 구조체 방 안으로의 데이터 욱여넣기 필터 주입
// [TODO] 3. uORB 전역 미들웨어 링 버퍼망 우체통으로의 발행 출판(Publishing) 폭발
// [절대 주의] 코어 루프 타루(Starvation) 현상 방지를 위한 절대적 RTOS 강제 슬립 스케줄링 처리
// 이 한 줄을 까먹으면 이 스레드가 전체 칩셋 CPU 점유율을 100% 독식해버려 기체가 공중에서 즉각 패닉 추락한다.
px4_usleep(10000); // 10ms (100Hz 반복 주기) 대기하여 다른 코어 스레드 및 EKF에게 CPU 타임 슬라이스(Time Slice)를 영리하게 양보
}
2. 모듈 상태 관리(State Management) 제어 변환 블록 타설
이 단순 무지막지하게 빙글빙글 도는 1차원적 무한 루프 안에 곧바로 센서 데이터를 맹목적으로 채워 넣기 전에, 반드시 해결해야 할 선결 과제가 있다.
모듈의 현재 하드웨어 컨디션을 실시간으로 체크하고 비정상적인 폴트(Fault) 상태를 1차적으로 걸러내는 방어적 매크로(Defensive Macro) 논리 분기 엣지 로직을 루프 상단 최전방에 가장 먼저 꽂아 넣어야 한다. 센서 칩이 아직 전원 예열(Warm-up)되지 않았거나 I2C 보드 통신선이 끊어지는 등 치명타 에러가 났을 때, 아무 생각 없이 이전 쓰레기 더미 값을 uORB 미들웨어에 그대로 뿌리는 무지성 행위는, EKF 자세 추정기 매트릭스를 회복 불가능하게 오염시켜 기체 추락을 직접적으로 유발하는 1급 반역 행위이기 때문이다.
우리가 방금 전 19.2.2 자동 생성 헤더에서 .msg 텍스트 내부 스크립트에 구겨 넣었던 위대한 인라인 상태 상수 텍스트 메타데이터(sensor_test_data_s::STATE_UNINIT, STATE_OK, STATE_ERROR)들을 적극적으로 차용 파싱하여, 시스템 방어막 스칼라 변수를 루프 외곽 스택 상단에 최초 선언한다.
// 무한 루프 진입 전, 상태 통제용 로컬 지역 변수 힙(Heap) 오염 없는 초기화 선언
uint8_t current_sensor_state = sensor_test_data_s::STATE_UNINIT;
uint32_t sensor_error_acc = 0; // 치명적 시스템 누적 에러 카운트 집진 컨테이너 방
while (!thread_should_exit) {
// 가상의 외부 I2C/SPI 센서 하드웨어 생존 헬스 체크 물리적 분기 (Mock-up Polling)
bool is_sensor_healthy = check_dummy_sensor_hardware_alive();
if (!is_sensor_healthy) {
// 치명적 폴트(Error) 에러 발생 시 상태 코드를 ERROR 상수 지시자로 무자비하게 격하하고
// 쓰레기값을 미들웨어로 던지지 않도록 이번 10ms 퍼블리시 사이클 자체를 강력히 스킵(Skip) 통제
current_sensor_state = sensor_test_data_s::STATE_ERROR;
sensor_error_acc++;
PX4_ERR("Hardware Sensor disconnected! Publish Throttle pipeline skipped.");
px4_usleep(10000);
continue; // 하단 퍼블리싱 트리거 타격을 파기하고, 상단 루프망으로 강제 재시작 궤도 이탈
} else {
// 하드웨어 통신 정상 스윙 복귀 시 상태 코드를 다시 OK로 깔끔하게 격상
current_sensor_state = sensor_test_data_s::STATE_OK;
}
// ... 파괴적 에러를 무사히 통과한 후 정상 센서 데이터 취득 및 uORB 퍼블리싱 로직 폭발적 재개 ...
이 압도적인 루프 통제권 및 자기 객관화가 가능한 상태 관리 제어망(State Manager) 지배 로직이 견고하게 확립되어야만, 비로소 우리가 짜놓은 가상의 C++ 퍼블리셔 데몬은 그저 멍청하게 쓰레기 값을 던지는 값 던지기 자판기 수준에서 확실하게 벗어난다. 외부의 환경 상황 변화를 스스로 통제 파싱하고 판단하는 코어 레벨의 영리한 시스템 에이전트 인공지능 엔티티(Entity)로 완벽하게 징벌적 진화(Evolution)를 이루게 되는 것이다.