Поделиться через


Коды выхода

Высокоуровневое приложение Azure Sphere может использовать коды выхода для возврата сведений о том, где в коде произошла ошибка и почему она произошла. Код выхода соответствует значению от 0 до 255, где 0 указывает на успешное выполнение.

Определение и использование кодов выхода в приложении

Следуйте этим рекомендациям, чтобы определить и использовать коды выхода в приложении:

  • Создайте переменную кода выхода и инициализируйте ее с успехом (0) в начале приложения.
  • Возвращает код выхода из любой функции, в которой ошибка привела к выходу приложения. Коды выхода функции могут содержать подробные сведения об операционных ошибках. Например, функция, которая отправляет сообщение в приложение IoT Central, может возвращать код ошибки, предоставляющий сведения о том, где произошел сбой: при создании сообщения, подключении к Интернету вещей, передаче сообщений и т. д. Другая функция, отвечающая за инициализацию периферийных устройств, будет возвращать уникальный код выхода, указывающий на сбой с конкретным периферийным устройством.
  • Если функция задала или возвращает код выхода из сбоя (ненулевое), убедитесь, что он немедленно распространяется обратно, чтобы функция main возвращала. Это приведет к выходу приложения с заданным кодом выхода. ОС Azure Sphere немедленно перезапустит приложение (если вы не использовали отладчик с подключенной платой разработки), и вы можете использовать отчеты об ошибках для диагностики причины выхода из системы.

Отчеты об ошибках

При выходе из высокоуровневого приложения ОС Azure Sphere регистрирует код выхода, возвращенный приложением, а затем ежедневно отправляет отчет об ошибке, содержащий эту информацию, в службу безопасности Azure Sphere. Сравнивая код выхода в отчете об ошибках с кодами выхода, определенными в приложении, часто можно определить расположение и причину ошибки. Дополнительные сведения см. в разделе Интерпретация AppExits .

Приложения RTApp не могут возвращать данные об ошибках непосредственно в службу безопасности Azure Sphere. Если вы хотите реализовать отслеживание ошибок в ПРИЛОЖЕНИИ RTApp, необходимо передать данные об ошибках из ПРИЛОЖЕНИЯ RTApp в приложение высокого уровня с помощью механизма взаимодействия между ядрами. Дополнительные сведения см. в разделах Взаимодействие с приложением высокого уровня и Взаимодействие с приложением с поддержкой реального времени .

Пример реализации кода выхода

В следующих фрагментах кода показано, как можно включить коды выхода в высокоуровневое приложение.

Сначала объявите перечисление ExitCode в приложении, которое можно использовать для определения всех конкретных значений кода выхода. Затем инициализируйте глобальную exitCode переменную в состояние успешного выполнения (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;

Функции, содержащие случаи ошибок, которые должны завершить работу приложения, должны возвращать перечисление ExitCode. Если достигнут случай ошибки, который должен завершить работу приложения, верните конкретный код выхода, определенный для этого случая. В приведенном ниже примере определена InitPeripheralsAndHandlers функция, которая инициализирует индикатор и кнопку. В случае сбоя инициализации возвращается соответствующее ExitCode значение, определенное выше.

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

После инициализации приложение остается в цикле main до тех пор, пока глобальной exitCode переменной по-прежнему назначено начальное значение успешного выполнения. Если какая-либо часть логики приложения main когда-либо задает exitCode для переменной значение, отличное от успешного, приложение вырвется из цикла main и завершит работу с набором exitCode. ОС Azure Sphere записывает событие выхода приложения и соответствующий код выхода в отчет об ошибке, а затем перезапустит приложение.

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