Коды выхода
Высокоуровневое приложение 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;
}