Kody wyjścia

Aplikacja wysokiego poziomu Azure Sphere może używać kodów wyjścia do zwracania informacji dotyczących miejsca w kodzie, w którym wystąpił błąd i dlaczego wystąpił. Kod wyjścia odpowiada wartości z przedziału od 0 do 255, gdzie 0 oznacza sukces.

Definiowanie i używanie kodów wyjścia w aplikacji

Postępuj zgodnie z poniższymi wskazówkami, aby zdefiniować kody wyjścia i używać ich w aplikacji:

  • Utwórz zmienną kodu wyjścia i zainicjuj ją do pomyślnego (0) na początku aplikacji.
  • Zwróć kod wyjścia z dowolnej funkcji, w której błąd spowodował zamknięcie aplikacji. Kody wyjścia funkcji mogą zawierać szczegółowe informacje o błędach operacyjnych. Na przykład funkcja, która wysyła wiadomość do aplikacji IoT Central, może zwrócić kod błędu, który zawiera szczegółowe informacje o tym, gdzie wystąpił błąd: w konstruowaniu wiadomości, połączeniu IoT, transmisji wiadomości itd. Inna funkcja odpowiedzialna za inicjowanie urządzeń peryferyjnych zwróciłaby unikatowy kod wyjścia wskazujący błąd z określonym urządzeniem peryferyjnym.
  • Jeśli kod wyjścia błędu (niezerowy) jest ustawiany lub zwracany przez funkcję, upewnij się, że jest on natychmiast propagowany z powrotem, aby funkcja główna zwróciła. Spowoduje to, że aplikacja zakończy pracę z danym kodem wyjścia. System operacyjny Azure Sphere natychmiast uruchomi ponownie aplikację (chyba że korzystano z debugera z połączoną tablicą deweloperów) i możesz użyć raportów o błędach, aby zdiagnozować przyczynę wyjścia.

Raporty o błędach

Po zamknięciu aplikacji wysokiego poziomu system operacyjny Azure Sphere rejestruje kod wyjścia zwrócony przez aplikację, a następnie codziennie przekazuje raport o błędach zawierający te informacje do usługi zabezpieczeń Azure Sphere. Porównując kod zakończenia w raporcie o błędach z kodami wyjścia zdefiniowanymi w aplikacji, często można określić lokalizację i przyczynę błędu. Aby uzyskać więcej informacji , zobacz Interpretowanie funkcji AppExits .

Aplikacja RTApps nie może zwrócić danych o błędach bezpośrednio do usługi zabezpieczeń Azure Sphere. Jeśli chcesz zaimplementować śledzenie błędów w aplikacji RTApp, musisz przekazać dane o błędach z aplikacji RTApp do aplikacji wysokiego poziomu za pomocą międzyrdzeniowego mechanizmu komunikacji. Aby uzyskać szczegółowe informacje, zobacz Komunikowanie się za pomocą aplikacji wysokiego poziomu i Komunikowanie się za pomocą aplikacji z obsługą czasu rzeczywistego .

Przykładowe wdrożenie kodu wyjścia

Poniższe fragmenty przedstawiają przykładowe sposoby dołączania kodów wyjścia do aplikacji wysokiego poziomu.

Najpierw zadeklaruj wyliczanie ExitCode w aplikacji, za pomocą którego możesz zdefiniować wszystkie określone wartości kodu wyjścia. Następnie zainicjuj zmienną globalną exitCode do stanu sukcesu (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;

Funkcje, które zawierają przypadki błędów, które powinny zakończyć aplikację, powinny zwrócić wyliczanie ExitCode. Jeśli zostanie osiągnięty przypadek błędu, który powinien zakończyć aplikację, zwróć określony kod wyjścia zdefiniowany dla tej sprawy. W poniższym przykładzie zdefiniowano funkcję InitPeripheralsAndHandlers , która inicjuje diodę LED i przycisk. Jeśli inicjowanie zakończy się niepowodzeniem, zostanie zwrócona odpowiadająca jej ExitCode wartość zdefiniowana powyżej.

// 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;
}

Po zainicjowaniu aplikacja pozostaje w pętli głównej, o ile zmienna globalna exitCode nadal otrzymuje początkową wartość sukcesu. Jeśli dowolna część logiki aplikacji głównej kiedykolwiek ustawia exitCode zmienną na wartość inną niż sukces, aplikacja wyłamie się z pętli głównej i zakończy się wraz z zestawem exitCode. System operacyjny Azure Sphere przechwyci zdarzenie zakończenia aplikacji i odpowiedni kod wyjścia w raporcie o błędzie, a następnie uruchom ponownie aplikację.

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;
}