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


Коды выхода

Внимание

Это документация по Azure Sphere (устаревшая версия). Служба Azure Sphere (устаревшая версия) выходит на пенсию 27 сентября 2027 г., и к этому времени пользователи должны перейти в Azure Sphere (интегрированная). Используйте селектор версий, расположенный над toC, чтобы просмотреть документацию по Azure Sphere (интегрированная).

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

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

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

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

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

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

RTApps не может возвращать данные об ошибках непосредственно в службу безопасности 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;
}

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