Exitcodes

Eine allgemeine Azure Sphere-Anwendung kann Exitcodes verwenden, um Informationen darüber zurückzugeben, wo im Code der Fehler aufgetreten ist und warum er aufgetreten ist. Ein Exitcode entspricht einem Wert zwischen 0 und 255, wobei 0 den Erfolg anzeigt.

Definieren und Verwenden von Exitcodes in einer App

Befolgen Sie diese Richtlinien, um Exitcodes in einer App zu definieren und zu verwenden:

  • Erstellen Sie eine Exitcodevariable, und initialisieren Sie sie am Anfang der Anwendung als erfolgreich (0).
  • Gibt einen Exitcode von jeder Funktion zurück, bei der ein Fehler dazu geführt hat, dass die Anwendung beendet wurde. Die Funktionsausgangscodes können detaillierte Informationen zu Betriebsfehlern bereitstellen. Beispielsweise kann eine Funktion, die eine Nachricht an eine IoT Central-Anwendung sendet, einen Fehlercode zurückgeben, der Details zum Fehlerort bereitstellt: bei der Nachrichtenerstellung, ioT-Verbindung, Nachrichtenübertragung usw. Eine andere Funktion, die für die Initialisierung von Peripheriegeräten verantwortlich ist, gibt einen eindeutigen Exitcode zurück, um einen Fehler mit einem bestimmten Peripheriegerät anzuzeigen.
  • Wenn ein Fehlerendcode (ungleich null) von einer Funktion festgelegt oder zurückgegeben wird, stellen Sie sicher, dass er sofort zurückgesendet wird, damit die Standard Funktion zurückgegeben wird. Dies führt dazu, dass die Anwendung mit dem angegebenen Exitcode beendet wird. Das Azure Sphere-Betriebssystem startet Ihre Anwendung sofort neu (es sei denn, Sie haben den Debugger mit einem verbundenen Entwicklungsboard verwendet), und Sie können Fehlerberichte verwenden, um den Grund zu diagnostizieren, warum ein Exit nicht aufgetreten ist.

Fehlerberichte

Wenn eine allgemeine Anwendung beendet wird, protokolliert das Azure Sphere-Betriebssystem den von Ihrer Anwendung zurückgegebenen Exitcode und lädt später täglich einen Fehlerbericht mit diesen Informationen in den Azure Sphere-Sicherheitsdienst hoch. Indem Sie den Exitcode im Fehlerbericht mit den in Ihrer Anwendung definierten Exitcodes vergleichen, können Sie häufig den Speicherort und die Ursache des Fehlers ermitteln. Weitere Informationen finden Sie unter Interpretieren von AppExits .

RTApps kann Fehlerdaten nicht direkt an den Azure Sphere-Sicherheitsdienst zurückgeben. Wenn Sie die Fehlernachverfolgung in einer RTApp implementieren möchten, müssen Sie die Fehlerdaten aus der RTApp mithilfe des Kernkommunikationsmechanismus an eine allgemeine App übermitteln. Weitere Informationen finden Sie unter Kommunizieren mit einer allgemeinen Anwendung und Kommunizieren mit einer Echtzeitanwendung .

Beispiel für die Exitcodeimplementierung

Die folgenden Codeausschnitte zeigen ein Beispiel dafür, wie Sie Exitcodes in eine allgemeine Anwendung integrieren können.

Deklarieren Sie zunächst eine ExitCode Enumeration in Ihrer Anwendung, mit der Sie alle Ihre spezifischen Exitcodewerte definieren können. Initialisieren Sie dann eine globale exitCode Variable mit dem Erfolgszustand (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;

Funktionen, die Fehlerfälle enthalten, die die Anwendung beenden sollten, sollten eine ExitCode-Enumeration zurückgeben. Wenn ein Fehlerfall erreicht wird, der die Anwendung beenden soll, geben Sie den spezifischen Exitcode zurück, den Sie für diesen Fall definiert haben. Im folgenden Beispiel ist die InitPeripheralsAndHandlers Funktion definiert, die eine LED und eine Taste initialisiert. Wenn bei beiden Initialisierungen ein Fehler auftritt, wird der entsprechende ExitCode oben definierte Wert zurückgegeben.

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

Nach der Initialisierung verbleibt die Anwendung in der Standard-Schleife, solange der globalen exitCode Variablen noch der anfängliche Erfolgswert zugewiesen ist. Wenn ein Teil der Standard Anwendungslogik die exitCode Variable jemals auf einen anderen Wert als success festlegt, bricht die Anwendung aus der Standard-Schleife aus und beendet mit dem festgelegten exitCode. Das Azure Sphere-Betriebssystem erfasst das App-Exitereignis und den entsprechenden Exitcode in einem Fehlerbericht und startet dann Ihre Anwendung neu.

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