Azure SphereのOSアップデートの挙動を調べた
以前から、OSアップデートするときにアプリケーションはどうなるのか気になっていた、、、
- OSのダウンロード中にアプリは停止するのか?
- アプリの停止は事前に通知されるのか?
- アプリの停止時間は?
のですが、1/10にAzure Sphere OS 18.11.2のOSアップデートがOTA配信開始したので、挙動を調べることに。
挙動を調べるためのコード
アプリが再起動するため、Visual Studio(やgdb)でLog_Debugを見て確認することができません。 そこで、UARTに連続してデータを出力して、それをロジックアナライザでキャプチャすることにしました。
アプリは、起動時に"STX\n"を送信した後、0x00~0xffを連続して送信し続けます。SIGTERMを受けたら、"ETX\n"を送信して終了。
int main(int argc, char *argv[]) { Log_Debug("Application starting.\n"); // Register a SIGTERM handler for termination requests struct sigaction action; memset(&action, 0, sizeof(struct sigaction)); action.sa_handler = TerminationHandler; sigaction(SIGTERM, &action, NULL); UART_Config config; UART_InitConfig(&config); config.baudRate = 115200; config.flowControl = UART_FlowControl_None; int uartFd = UART_Open(MT3620_UART_ISU3, &config); assert(uartFd); write(uartFd, "STX\n", 4); char data = 0; while (!terminationRequired) { int ret = write(uartFd, &data, 1); if (ret == 1) data++; } wait_ms(100); // easyio write(uartFd, "ETX\n", 4); wait_ms(100); // easyio close(uartFd); Log_Debug("Application exiting.\n"); return 0; }
実行手順
色々と試しましたが、、、この流れがベストのようです。
azsphere device recover
でOSを18.11にする。azsphere device prep-debug
。- VSからアプリを実行して、停止。(Flashにアプリを入れる)
- ロジックアナライザを接続。
- resetボタンをクリック。
- ロジックアナライザがキャプチャできていることを確認。
azsphere device wifi add
して、azsphere device wifi list
でconnectedになることを確認、すぐにresetボタンをクリック。←この操作は短時間に!- 10分くらいキャプチャし続ける。
実行結果
- アプリが起動してから(OSアップデートで)停止するまで、約377秒(約6分)
- (OSアップデートで)アプリ停止時間、約83秒(約1分)
- OSのダウンロードがアプリ稼働中か停止中かは、判断つかなかった。
- アプリ停止直前は、SIGTERMシグナルが来ていた。
まとめ
実運用では、OSアップデートで1分くらい停止しても大丈夫なように、全体設計しておく必要がありそうです。