Ukončovací kódy
Aplikace vysoké úrovně Azure Sphere může pomocí ukončovacích kódů vracet informace o tom, kde v kódu došlo k chybě a proč k ní došlo. Ukončovací kód odpovídá hodnotě mezi 0 a 255, kde 0 označuje úspěch.
Definování a použití ukončovací kódy v aplikaci
Pokud chcete definovat a používat ukončovací kódy v aplikaci, postupujte podle těchto pokynů:
- Vytvořte proměnnou ukončovacího kódu a na začátku aplikace ji inicializujte tak, aby byla úspěšná (0).
- Vrátí ukončovací kód z jakékoli funkce, u které došlo k chybě, která způsobila ukončení aplikace. Ukončovací kódy funkce můžou poskytovat podrobné informace o provozních chybách. Například funkce, která odesílá zprávu do aplikace IoT Central, může vrátit kód chyby, který poskytuje podrobnosti o tom, kde došlo k selhání: při vytváření zpráv, připojení IoT, přenosu zpráv atd. Jiná funkce zodpovědná za inicializaci periferních zařízení by vrátila jedinečný ukončovací kód označující selhání konkrétního periferního zařízení.
- Pokud funkce nastaví nebo vrátí ukončovací kód chyby (nenulový), ujistěte se, že je okamžitě šířený zpět, aby se hlavní funkce vrátila. To způsobí, že se aplikace ukončí s daným ukončovacím kódem. Operační systém Azure Sphere okamžitě restartuje vaši aplikaci (pokud jste používali ladicí program s připojenou vývojovou deskou) a pomocí zpráv o chybách můžete diagnostikovat důvod, proč došlo k ukončení.
Zprávy o chybách
Když se aplikace vysoké úrovně ukončí, operační systém Azure Sphere zaznamená ukončovací kód vrácený vaší aplikací a později denně nahraje zprávu o chybách obsahující tyto informace do služby zabezpečení Azure Sphere. Porovnáním ukončovacího kódu ve zprávě o chybách s ukončovacími kódy definovanými ve vaší aplikaci můžete často určit umístění a příčinu chyby. Další informace najdete v tématu Interpretace AppExits .
RTApps nemůže vracet data o chybách přímo do služby zabezpečení Azure Sphere. Pokud chcete implementovat sledování chyb v aplikaci RTApp, budete muset data o chybách z aplikace RTApp předat aplikaci vysoké úrovně pomocí komunikačního mechanismu mezi jádry. Podrobnosti najdete v tématech Komunikace s aplikací vysoké úrovně a Komunikace pomocí aplikace podporující v reálném čase .
Ukázková implementace ukončovacího kódu
Následující fragmenty kódu ukazují ukázku toho, jak můžete začlenit ukončovací kódy do aplikace vysoké úrovně.
Nejprve v aplikaci deklarujte ExitCode
výčet, který můžete použít k definování všech hodnot vašeho konkrétního ukončovacího kódu. Pak inicializujte globální exitCode
proměnnou do stavu úspěchu (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;
Funkce obsahující chybové případy, které by měly ukončit aplikaci, by měly vrátit výčet ExitCode. Pokud dojde k chybovému případu, který by měl aplikaci ukončit, vraťte konkrétní ukončovací kód, který jste pro tento případ definovali. V následujícím příkladu je definována InitPeripheralsAndHandlers
funkce, která inicializuje indikátor LED a tlačítko. Pokud se inicializace nezdaří, vrátí se odpovídající ExitCode
výše definovaná hodnota.
// 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;
}
Po inicializaci zůstane aplikace v hlavní smyčce, dokud je globální exitCode
proměnné stále přiřazena počáteční hodnota úspěchu. Pokud některá část hlavní logiky aplikace někdy nastaví exitCode
proměnnou na jinou hodnotu než úspěch, aplikace se vyloučí z hlavní smyčky a ukončí se sadou exitCode
. Operační systém Azure Sphere zaznamená událost ukončení aplikace a odpovídající ukončovací kód ve zprávě o chybě a pak aplikaci restartuje.
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;
}