9.2.2.3 예외 처리 부재를 극복하기 위한 강건한 상태 플래그(Status Flag) 비트 연산 설계

9.2.2.3 예외 처리 부재를 극복하기 위한 강건한 상태 플래그(Status Flag) 비트 연산 설계

Java나 Python 등 하이 레벨 언어의 가장 큰 특권론 중 하나는 블록이 무너질 때 터져 나오는 예외(Exception)를 우아하게 잡아내는 try-catch 스택 구조다. 어떤 오류가 발생하든 프로그램은 패닉 없이 콜 스택을 거슬러 올라가 에러 핸들러 존에 불시착할 수 있다.
그러나 베어메탈(Bare-metal)이나 실시간 커널에 이식되는 zenoh-c 와 같은 하드코어 시스템 레벨 프로그래밍에는 이러한 예외 복구(Exception Handling) 장치가 아예 존재하지 않는다.

예외 처리 체계가 전무한 환경에서, 함수의 호출 실패 응답(네트워크 단절, 버퍼 결핍 등)을 부주의하게 흘려보내는 행위는 곧바로 허공을 가리키는 널 포인터 참조(Null Pointer Exception)나 코어 덤프(Core Dump)로 이어진다. 본 절에서는 예외 처리 기작의 부재를 완벽하게 메워주는 방어망인 상태 플래그(Status Flag) 비트 연산 기반의 강건한 에러 캐치 아키텍처를 전개한다.

1. 정수형 반환 오류 코드의 연쇄 추적(Error Propagation)

C 환경에서의 에러 핸들링 기본은 모든 기능적 API가 구조체 포인터를 매개변수(Parameter)로 위임받고, 함수 자체의 return 값은 오로지 성공과 실패 상태(z_owned_session_t 초기화 성공 여부 등)만을 정수로 표출하도록 설계하는 데서 출발한다.

zenoh-c는 대부분의 선언(Declare) 초기화 함수가 반환 값으로 0(성공) 또는 음수(실패)를 던진다. 따라서, 개발자는 다음과 같이 한 함수가 끝날 때마다 결과 값을 반드시 검수하는 단단한 성벽 구조를 세워야 한다.

// [강건성이 확보된 자원 획득 프로토콜 레이어]
z_owned_config_t config = z_config_default();
z_owned_session_t session;

// 1. 에러 전파(Propagation)를 강제하는 리턴 검수 구조 
if (z_open(&session, config, NULL) != 0) {
    fprintf(stderr, "치명적 오류: Zenoh 코어 라우터 엔진 점화 실패\n");
    // [중요] 예외 블럭이 없으므로 직접 시스템 안전 상태 진입 후 종료(Graceful exit)
    enter_safe_failover_mode();
    return EXIT_FAILURE; 
}

이처럼 방패를 세우듯 모든 I/O 분기마다 실패 지점을 매핑하는 일관된 리턴 체크 로직 없이는, 시스템의 비정상 종료 시 그 역학적(Stack trace) 위치조차 알 수 없는 암흑 속을 헤매게 된다.

2. 상태 플래그(Status Flag) 비트 마스킹(Bit Masking) 기법

단일 함수의 오류 반환만으로는 다중화된 IoT 센서 데이터 수거망에서 전체 로봇의 “완전성(Healthiness)“을 평가하기 역부족이다. 카메라 모듈, 모터 제어기 센서, 라이더 모듈 등 여러 소스의 Zenoh 통신망 상태를 통합 관리하기 위해서는 **비트 연산을 이용한 전역 상태 플래그(Status Flag Masking)**를 도입하여야 시스템 병목 없이 극도로 가볍게 예외 상황을 관리할 수 있다.

// 32비트 마스킹으로 텔레메트리 컴포넌트 오류 관리 선언 (메모리 단 4바이트 점유)
#define STATUS_OK                0x00000000
#define FAULT_CAMERA_TIMEOUT     0x00000001
#define FAULT_LIDAR_DISCONNECT   0x00000002
#define FAULT_ZENOH_SESSION_LOST 0x00000004

uint32_t system_health_status = STATUS_OK;

void loop_check_networks() {
    // 특정 네트워크 수신 에러 감지 시 비트 열 추가 (OR) 연산
    if (!check_zenoh_session_alive()) {
        system_health_status |= FAULT_ZENOH_SESSION_LOST;
    }
}

비트 OR(|=) 연산은 CPU 안의 ALU(산술논리연산장치)를 단 한 번의 단일 사이클로 진동시키며 지연 시간 없이 오류를 즉각 적재한다.

3. 단일 분기망으로의 예외 격추(Mask-driven Interception)

비트 단위로 에러들이 통합되어 system_health_status에 응축되었다면, 메인 조향 스레드는 무수한 if-else 거미줄을 작성할 필요 없이, 단 한번의 비트 마스킹 논리곱(AND) 연산을 통해 치명적 예외 여부를 일망타진할 수 있다.

// 치명적인 주행 불가 오류들의 집합 (Mask)
#define CRITICAL_FAULTS_MASK (FAULT_LIDAR_DISCONNECT | FAULT_ZENOH_SESSION_LOST)

void execute_main_control_loop() {
    // 단 1번의 비트 AND 연산으로 예외 상태 캐치
    if (system_health_status & CRITICAL_FAULTS_MASK) {
        // [소프트웨어적 try-catch 블록의 물리적 구현]
        engage_emergency_brake(); 
        resurrect_zenoh_network_module(); 
        return; 
    }
    
    // 정상 주행 지속 루틴
}

try-catch 스택 다이버(Stack Diver) 기능이 제공하는 안전망을, zenoh-c 환경에서는 상기와 같은 극한의 연산 효율성을 띈 비트 플래그 아키텍처를 이용하여 인공적으로 구현해 내는 것이다. 단 몇 바이트의 연산만으로 시스템 전역의 파이프라인 무결성을 보존하고 통제 불능 추락을 자율주행 회피망으로 돌려세우는 강건한(Robust) 컴파일러 친화 전술이다.