Codes de sortie

Une application de haut niveau Azure Sphere peut utiliser des codes de sortie pour retourner des informations relatives à l’endroit où dans le code l’erreur s’est produite et à la raison pour laquelle elle s’est produite. Un code de sortie correspond à une valeur comprise entre 0 et 255, où 0 indique la réussite.

Définir et utiliser des codes de sortie dans une application

Suivez ces instructions pour définir et utiliser des codes de sortie dans une application :

  • Créez une variable de code de sortie et initialisez-la avec succès (0) au début de l’application.
  • Retourne un code de sortie à partir d’une fonction où une erreur a provoqué la fermeture de l’application. Les codes de sortie de la fonction peuvent fournir des informations détaillées sur les erreurs opérationnelles. Par exemple, une fonction qui envoie un message à une application IoT Central peut retourner un code d’erreur qui fournit des détails sur l’endroit où l’échec s’est produit : dans la construction du message, la connexion IoT, la transmission des messages, etc. Une autre fonction responsable de l’initialisation des périphériques retourne un code de sortie unique pour indiquer une défaillance avec un périphérique spécifique.
  • Si un code de sortie d’échec (différent de zéro) est défini ou retourné par une fonction, assurez-vous qu’il est immédiatement propagé pour que la fonction main retourne. Cela entraîne la fermeture de l’application avec le code de sortie donné. Le système d’exploitation Azure Sphere redémarre immédiatement votre application (sauf si vous utilisiez le débogueur avec une carte de développement connectée), et vous pouvez utiliser des rapports d’erreurs pour diagnostiquer la raison d’une sortie.

Rapports d’erreurs

Lorsqu’une application de haut niveau se termine, le système d’exploitation Azure Sphere enregistre le code de sortie retourné par votre application et charge par la suite un rapport d’erreurs contenant ces informations dans le service de sécurité Azure Sphere quotidiennement. En comparant le code de sortie du rapport d’erreurs aux codes de sortie définis dans votre application, vous pouvez souvent déterminer l’emplacement et la cause de l’erreur. Pour plus d’informations , consultez Interpret AppExits .

Les applications en temps réel ne peuvent pas retourner les données d’erreur directement au service de sécurité Azure Sphere. Si vous souhaitez implémenter le suivi des erreurs dans une application RTApp, vous devez communiquer les données d’erreur de l’application rtapp à une application de haut niveau à l’aide du mécanisme de communication entre cœurs. Pour plus d’informations, consultez Communiquer avec une application de haut niveau et Communiquer avec une application prenant en charge le temps réel .

Exemple d’implémentation de code de sortie

Les extraits de code suivants montrent un exemple de la façon dont vous pouvez incorporer des codes de sortie dans une application de haut niveau.

Tout d’abord, déclarez une ExitCode énumération dans votre application que vous pouvez utiliser pour définir toutes vos valeurs de code de sortie spécifiques. Ensuite, initialisez une variable globale exitCode à l’état de réussite (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;

Les fonctions qui contiennent des cas d’erreur qui doivent arrêter l’application doivent retourner une énumération ExitCode. Si un cas d’erreur qui doit arrêter l’application est atteint, retournez le code de sortie spécifique que vous avez défini pour ce cas. Dans l’exemple ci-dessous, la InitPeripheralsAndHandlers fonction est définie, qui initialise une LED et un bouton. En cas d’échec de l’initialisation, la valeur correspondante ExitCode définie ci-dessus est retournée.

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

Après l’initialisation, l’application reste dans la boucle main tant que la variable globale exitCode se voit toujours attribuer la valeur de réussite initiale. Si une partie de la logique d’application main définit la exitCode variable sur une valeur autre que success, l’application sort de la boucle main et se termine avec l’ensemble exitCode. Le système d’exploitation Azure Sphere capture l’événement de sortie de l’application et le code de sortie correspondant dans un rapport d’erreurs, puis redémarre votre application.

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