結束代碼
Azure 球體高層級應用程式可以使用結束碼來傳回錯誤發生所在位置及其發生原因的相關資訊。 結束代碼會對應到 0 到 255 之間的值,其中 0 代表成功。
在應用程式中定義和使用結束代碼
請遵循下列指導方針,在應用程式中定義及使用結束代碼:
- 建立結束程式碼變數並初始化為成功 (應用程式開頭為 0) 。
- 傳回導致應用程式退出之任何函數的結束代碼。 函數結束程式碼可以提供操作錯誤的詳細資訊。 例如,傳送郵件到 IoT 中樞應用程式的函數可能會傳回錯誤碼,提供失敗發生的詳細資料:在郵件結構、IoT 連線、郵件傳輸等等。 負責初始化周邊設備的不同函數會傳回唯一的結束代碼,以指出特定周邊故障。
- 如果函數設定或傳回非零) 碼 (失敗,請確定它會立即傳播回, 讓主 函數傳回。 這會導致應用程式以指定的結束代碼結束。 除非您將偵錯程式與連線的開發面板) 使用,否則 Azure 球體作業系統會立即重新開機應用程式 (,而且您可以使用錯誤報表來診斷結束出現的原因。
錯誤報表
當高階應用程式結束時,Azure 球體作業系統會記錄您的應用程式所傳回的結束碼,並于稍後每天將包含此資訊的錯誤報表上傳至 Azure 球體安全性服務。 藉由比較錯誤報表中的結束碼與應用程式中定義的結束代碼,您通常可以判斷錯誤的位置和原因。 如需詳細資訊,請參閱 解讀 AppExits 。
RTApps 無法直接將錯誤資料傳回 Azure 球體安全性服務。 如果您想要在 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
,會定義函數,以縮寫 LED 和按鈕。 如果初始化失敗,會傳回上述定義的對應 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 球體 OS 會在錯誤報表中擷取應用程式結束事件和對應的結束代碼,然後重新開機應用程式。
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;
}