Sair de códigos

Um aplicativo de alto nível do Azure Sphere pode usar códigos de saída para retornar informações relacionadas ao local em que o erro ocorreu e por que ocorreu. Um código de saída corresponde a um valor entre 0 e 255, onde 0 indica êxito.

Definir e usar códigos de saída em um aplicativo

Siga estas diretrizes para definir e usar códigos de saída em um aplicativo:

  • Crie uma variável de código de saída e inicialize-a para o sucesso (0) no início do aplicativo.
  • Retorne um código de saída de qualquer função em que um erro tenha causado a saída do aplicativo. Os códigos de saída da função podem fornecer informações detalhadas sobre erros operacionais. Por exemplo, uma função que envia uma mensagem para um aplicativo IoT Central pode retornar um código de erro que fornece detalhes sobre onde ocorreu a falha: na construção de mensagens, conexão IoT, transmissão de mensagens e assim por diante. Uma função diferente responsável por inicializar periféricos retornaria um código de saída exclusivo para indicar uma falha com um periférico específico.
  • Se um código de saída de falha (não zero) for definido ou retornado por uma função, verifique se ele será imediatamente propagado de volta para a função main retornar. Isso fará com que o aplicativo saia com o código de saída fornecido. O sistema operacional do Azure Sphere reiniciará imediatamente seu aplicativo (a menos que você esteja usando o depurador com um quadro de desenvolvimento conectado) e você pode usar relatórios de erro para diagnosticar o motivo de uma saída ocorrida.

Relatórios de erro

Quando um aplicativo de alto nível sai, o sistema operacional do Azure Sphere registra o código de saída retornado pelo aplicativo e, posteriormente, carrega um relatório de erro que contém essas informações para o Serviço de Segurança do Azure Sphere diariamente. Comparando o código de saída no relatório de erro com os códigos de saída definidos em seu aplicativo, muitas vezes você pode determinar o local e a causa do erro. Consulte Interpretar AppExits para obter mais informações.

Os RTApps não podem retornar dados de erro diretamente para o Serviço de Segurança do Azure Sphere. Se você quiser implementar o rastreamento de erros em um RTApp, precisará comunicar os dados de erro do RTApp a um aplicativo de alto nível usando o mecanismo de comunicação entre núcleos. Consulte Comunicar-se com um aplicativo de alto nível e Comunicar-se com um aplicativo capaz em tempo real para obter detalhes.

Implementação de código de saída de exemplo

Os snippets a seguir mostram uma amostra de como você pode incorporar códigos de saída em um aplicativo de alto nível.

Primeiro, declare um ExitCode enumeração em seu aplicativo que você pode usar para definir todos os valores de código de saída específicos. Em seguida, inicialize uma variável global exitCode para o estado de sucesso (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;

Funções que contêm casos de erro que devem encerrar o aplicativo devem retornar um enumeração ExitCode. Se um caso de erro for atingido que deve encerrar o aplicativo, retorne o código de saída específico definido para esse caso. No exemplo abaixo, a InitPeripheralsAndHandlers função é definida, que inicializa um LED e um botão. Se uma inicialização falhar, o valor correspondente ExitCode definido acima será retornado.

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

Após a inicialização, o aplicativo permanece no loop main desde que a variável global exitCode ainda seja atribuída ao valor de sucesso inicial. Se qualquer parte da lógica do aplicativo main definir a exitCode variável como um valor diferente do sucesso, o aplicativo sairá do loop main e sairá com o conjunto exitCode. O sistema operacional do Azure Sphere capturará o evento de saída do aplicativo e o código de saída correspondente em um relatório de erro e reiniciará seu aplicativo.

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