Delen via


Afsluitcodes

Een Azure Sphere-toepassing op hoog niveau kan afsluitcodes gebruiken om informatie te retourneren met betrekking tot waar in de code de fout is opgetreden en waarom deze is opgetreden. Een afsluitcode komt overeen met een waarde tussen 0 en 255, waarbij 0 aangeeft dat het is gelukt.

Afsluitcodes definiëren en gebruiken in een app

Volg deze richtlijnen om afsluitcodes in een app te definiëren en te gebruiken:

  • Maak een afsluitcodevariabele en initialiseer deze met succes (0) aan het begin van de toepassing.
  • Retourneert een afsluitcode van een functie waarbij de toepassing is afgesloten door een fout. De functie-afsluitcodes kunnen gedetailleerde informatie bieden over operationele fouten. Een functie die een bericht naar een IoT Central-toepassing verzendt, kan bijvoorbeeld een foutcode retourneren die details geeft over waar de fout is opgetreden: in berichtconstructie, IoT-verbinding, berichtoverdracht, enzovoort. Een andere functie die verantwoordelijk is voor het initialiseren van randapparatuur, retourneert een unieke afsluitcode om een fout met een specifiek randapparaat aan te geven.
  • Als een afsluitcode voor fouten (niet-standaard) wordt ingesteld of geretourneerd door een functie, moet u ervoor zorgen dat deze onmiddellijk wordt doorgegeven zodat de hoofdfunctie kan worden geretourneerd. Hierdoor wordt de toepassing afgesloten met de opgegeven afsluitcode. Het Azure Sphere-besturingssysteem start uw toepassing onmiddellijk opnieuw op (tenzij u het foutopsporingsprogramma met een verbonden ontwikkelbord gebruikte) en u kunt foutrapporten gebruiken om de reden van een afsluitfout vast te stellen.

Foutrapporten

Wanneer een toepassing op hoog niveau wordt afgesloten, registreert het Azure Sphere-besturingssysteem de afsluitcode die door uw toepassing wordt geretourneerd en uploadt het later dagelijks een foutenrapport met deze informatie naar de Azure Sphere-beveiligingsservice. Door de afsluitcode in het foutenrapport te vergelijken met de afsluitcodes die in uw toepassing zijn gedefinieerd, kunt u vaak de locatie en oorzaak van de fout bepalen. Zie AppExits interpreteren voor meer informatie.

RTApps kan foutgegevens niet rechtstreeks naar de Azure Sphere-beveiligingsservice retourneren. Als u fouten bijhouden in een RTApp wilt implementeren, moet u de foutgegevens van de RTApp communiceren naar een app op hoog niveau met behulp van het communicatiemechanisme tussen kernen. Zie Communiceren met een toepassing op hoog niveau en Communiceren met een toepassing die in realtime kan worden gebruikt voor meer informatie.

Voorbeeld van implementatie van afsluitcode

In de volgende codefragmenten ziet u een voorbeeld van hoe u afsluitcodes kunt opnemen in een toepassing op hoog niveau.

Declareer eerst een ExitCode opsomming in uw toepassing die u kunt gebruiken om al uw specifieke afsluitcodewaarden te definiëren. Initialiseer vervolgens een globale exitCode variabele naar de geslaagde status (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;

Functies die foutcases bevatten die de toepassing moeten beëindigen, moeten een ExitCode-opsomming retourneren. Als er een fout is bereikt die de toepassing moet beëindigen, retourneert u de specifieke afsluitcode die u voor dat geval hebt gedefinieerd. In het onderstaande voorbeeld wordt de InitPeripheralsAndHandlers functie gedefinieerd, waarmee een LED en een knop worden geïnitialiseerd. Als een van de initialisaties mislukt, wordt de bijbehorende ExitCode waarde geretourneerd die hierboven is gedefinieerd.

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

Na de initialisatie blijft de toepassing in de hoofdlus zolang aan de globale exitCode variabele nog steeds de initiële succeswaarde is toegewezen. Als een deel van de hoofdtoepassingslogica de exitCode variabele ooit instelt op een andere waarde dan geslaagd, wordt de toepassing uit de hoofdlus gebroken en afgesloten met de set exitCode. Het Azure Sphere-besturingssysteem legt de gebeurtenis voor het afsluiten van de app en de bijbehorende afsluitcode vast in een foutenrapport en start vervolgens de toepassing opnieuw op.

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