종료 코드
Important
Azure Sphere(레거시) 설명서입니다. Azure Sphere(레거시)는 2027년 9월 27일에 사용 중지되며 사용자는 이 시간까지 Azure Sphere(통합)로 마이그레이션해야 합니다. TOC 위에 있는 버전 선택기를 사용하여 Azure Sphere(통합) 설명서를 볼 수 있습니다.
Azure Sphere 상위 수준 애플리케이션은 종료 코드를 사용하여 코드에서 오류가 발생한 위치 및 오류가 발생한 이유와 관련된 정보를 반환할 수 있습니다. 종료 코드는 0에서 255 사이의 값에 해당하며 여기서 0은 성공을 나타냅니다.
앱에서 종료 코드 정의 및 사용
다음 지침에 따라 앱에서 종료 코드를 정의하고 사용합니다.
- 종료 코드 변수를 만들고 애플리케이션 시작 시 성공(0)으로 초기화합니다.
- 오류로 인해 애플리케이션이 종료된 모든 함수에서 종료 코드를 반환합니다. 함수 종료 코드는 작동 오류에 대한 자세한 정보를 제공할 수 있습니다. 예를 들어 IoT Central 애플리케이션에 메시지를 보내는 함수는 오류 발생 위치(메시지 생성, IoT 연결, 메시지 전송 등)에 대한 세부 정보를 제공하는 오류 코드를 반환할 수 있습니다. 주변 장치 초기화를 담당하는 다른 함수는 특정 주변 장치에서 오류를 나타내는 고유한 종료 코드를 반환합니다.
- 실패 종료 코드(0이 아닌 코드)가 함수에 의해 설정되거나 반환되는 경우 주 함수가 반환될 수 있도록 즉시 다시 전파되는지 확인합니다. 이렇게 하면 애플리케이션이 지정된 종료 코드로 종료됩니다. Azure Sphere OS는 연결된 개발 보드에서 디버거를 사용하지 않는 한 애플리케이션을 즉시 다시 시작하고 오류 보고서를 사용하여 종료가 발생한 이유를 진단할 수 있습니다.
오류 보고서
상위 수준 애플리케이션이 종료되면 Azure Sphere OS는 애플리케이션에서 반환된 종료 코드를 기록하고 나중에 이 정보가 포함된 오류 보고서를 매일 Azure Sphere Security Service에 업로드합니다. 오류 보고서의 종료 코드를 애플리케이션에 정의된 종료 코드와 비교하여 오류의 위치와 원인을 확인할 수 있습니다. 자세한 내용은 AppExits 해석을 참조하세요.
RTApps는 오류 데이터를 Azure Sphere Security Service에 직접 반환할 수 없습니다. RTApp에서 오류 추적을 구현하려면 코어 간 통신 메커니즘을 사용하여 RTApp에서 상위 수준 앱으로 오류 데이터를 전달해야 합니다. 자세한 내용은 상위 수준 애플리케이션과 통신 및 실시간 지원 애플리케이션과 통신을 참조하세요.
샘플 종료 코드 구현
다음 코드 조각은 종료 코드를 상위 수준 애플리케이션에 통합하는 방법의 샘플을 보여 줍니다.
먼저 애플리케이션에서 특정 종료 코드 값을 모두 정의하는 데 사용할 수 있는 열거형을 선언 ExitCode
합니다. 그런 다음, 전역 exitCode
변수를 성공 상태(0)로 초기화합니다.
// Exit codes for this application.
typedef enum {
ExitCode_Success = 0;
ExitCode_Init_LED = 1;
ExitCode_Init_Button = 2;
} ExitCode;
// Initialize the termination state.
static volatile sig_atomic_t exitCode = ExitCode_Success;
애플리케이션을 종료해야 하는 오류 사례가 포함된 함수는 ExitCode 열거형을 반환해야 합니다. 애플리케이션을 종료해야 하는 오류 사례에 도달하면 해당 사례에 대해 정의한 특정 종료 코드를 반환합니다. 아래 예제 InitPeripheralsAndHandlers
에서는 LED 및 단추를 초기화하는 함수가 정의됩니다. 두 초기화 중 하나가 실패하면 위에 정의된 해당 ExitCode
값이 반환됩니다.
// Initialize the peripherals and handlers. Return ExitCode_Success if all resources were allocated
// successfully; otherwise another ExitCode value which indicates a specific failure.
static ExitCode InitPeripheralsAndHandler(void)
{
// Open SAMPLE_LED as output.
led = GPIO_OpenAsOutput(SAMPLE_LED);
if (led == -1) {
return ExitCode_Init_LED;
}
// Open SAMPLE_BUTTON as input.
button = GPIO_OpenAsInput(SAMPLE_BUTTON);
if (button == -1) {
return ExitCode_Init_Button;
}
return ExitCode_Success;
}
초기화 후 전역 exitCode
변수에 초기 성공 값이 계속 할당되는 한 애플리케이션은 주 루프에 유지됩니다. 주 애플리케이션 논리의 일부가 변수를 exitCode
성공 이외의 값으로 설정하는 경우 애플리케이션은 주 루프에서 벗어나 집합 exitCode
으로 종료됩니다. Azure Sphere OS는 오류 보고서에서 앱 종료 이벤트 및 해당 종료 코드를 캡처한 다음 애플리케이션을 다시 시작합니다.
int main(int argc, char* argv[])
{
exitCode = InitPeripheralsAndHandler();
while (exitCode == ExitCode_Success) {
// Run other application functions within this loop.
// When a function encounters an error, set a corresponding exit code and return from that function.
// This will break out of the while loop if the exit code is not ExitCode_Success.
}
return exitCode;
}