Sdílet prostřednictvím


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