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

実行手順

色々と試しましたが、、、この流れがベストのようです。

  1. azsphere device recoverでOSを18.11にする。
  2. azsphere device prep-debug
  3. VSからアプリを実行して、停止。(Flashにアプリを入れる)
  4. ロジックアナライザを接続。
  5. resetボタンをクリック。
  6. ロジックアナライザがキャプチャできていることを確認。
  7. azsphere device wifi addして、azsphere device wifi listでconnectedになることを確認、すぐにresetボタンをクリック。←この操作は短時間に!
  8. 10分くらいキャプチャし続ける。

実行結果

  • アプリが起動してから(OSアップデートで)停止するまで、約377秒(約6分)
  • (OSアップデートで)アプリ停止時間、約83秒(約1分)
  • OSのダウンロードがアプリ稼働中か停止中かは、判断つかなかった。

f:id:matsujirushix:20190114102756p:plain

  • アプリ停止直前は、SIGTERMシグナルが来ていた。

f:id:matsujirushix:20190114103803p:plain

まとめ

実運用では、OSアップデートで1分くらい停止しても大丈夫なように、全体設計しておく必要がありそうです。