Codici di uscita

Un'applicazione di alto livello Azure Sphere può usare i codici di uscita per restituire informazioni relative alla posizione nel codice in cui si è verificato l'errore e al motivo per cui si è verificato. Un codice di uscita corrisponde a un valore compreso tra 0 e 255, dove 0 indica operazione riuscita.

Definire e usare i codici di uscita in un'app

Segui queste linee guida per definire e usare i codici di uscita in un'app:

  • Crea una variabile di codice di uscita e inizializzala per l'operazione riuscita (0) all'inizio dell'applicazione.
  • Restituisci un codice di uscita da qualsiasi funzione in cui un errore ha causato l'uscita dell'applicazione. I codici di uscita della funzione possono fornire informazioni dettagliate sugli errori operativi. Ad esempio, una funzione che invia un messaggio a un'applicazione IoT Central potrebbe restituire un codice di errore che fornisce dettagli sulla posizione dell'errore: nella costruzione del messaggio, nella connessione IoT, nella trasmissione dei messaggi e così via. Una funzione diversa responsabile dell'inizializzazione delle periferiche restituirebbe un codice di uscita univoco per indicare un errore con una periferica specifica.
  • Se un codice di uscita (diverso da zero) viene impostato o restituito da una funzione, assicurarsi che venga propagato immediatamente per restituire la funzione principale . Ciò causerà l'uscita dell'applicazione con il codice di uscita specificato. Il sistema operativo Azure Sphere riavvierà immediatamente l'applicazione (a meno che non si stesse usando il debugger con una bacheca di sviluppo connessa) ed è possibile usare le segnalazioni degli errori per diagnosticare il motivo per cui è stata terminata l'uscita.

Segnalazioni di errori

Quando un'applicazione di alto livello esce, il sistema operativo Azure Sphere registra il codice di uscita restituito dall'applicazione e in seguito carica quotidianamente una segnalazione degli errori contenente queste informazioni nel servizio di sicurezza Azure Sphere. Confrontando il codice di uscita nel report degli errori con i codici di uscita definiti nell'applicazione, è spesso possibile determinare la posizione e la causa dell'errore. Per altre informazioni, vedere Interpretare AppExits .

RTApps non può restituire i dati di errore direttamente al servizio di sicurezza Azure Sphere. Se si vuole implementare il rilevamento degli errori in un'RTApp, è necessario comunicare i dati dell'errore dall'RTApp a un'app di alto livello usando il meccanismo di comunicazione tra core. Per informazioni dettagliate, vedere Comunicare con un'applicazione di alto livello e Comunicare con un'applicazione in tempo reale .

Esempio di implementazione del codice di uscita

I frammenti seguenti mostrano un esempio di come incorporare codici di uscita in un'applicazione di alto livello.

Prima di tutto, dichiarare un'enumerazione ExitCode nell'applicazione che è possibile usare per definire tutti i valori specifici del codice di uscita. Inizializza quindi una variabile globale exitCode nello stato di successo (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;

Le funzioni che contengono casi di errore che devono terminare l'applicazione devono restituire un exitcode enum. Se viene raggiunto un caso di errore che deve terminare l'applicazione, restituire il codice di uscita specifico definito per quel caso. Nell'esempio seguente, la InitPeripheralsAndHandlers funzione è definita, che inizializza un LED e un pulsante. Se una delle due inizializzazioni non riesce, viene restituito il valore corrispondente ExitCode definito sopra.

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

Dopo l'inizializzazione, l'applicazione rimane nel ciclo principale finché alla variabile globale exitCode viene ancora assegnato il valore iniziale di successo. Se una parte della logica principale dell'applicazione imposta mai la exitCode variabile su un valore diverso da success, l'applicazione si interromperà dal ciclo principale e uscire con il set exitCode. Il sistema operativo Azure Sphere acquisisce l'evento di uscita dell'app e il codice di uscita corrispondente in una segnalazione di errore, quindi riavvia l'applicazione.

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