次の方法で共有


デバイス更新を保留する

重要

これは Azure Sphere (レガシ) のドキュメントです。 Azure Sphere (レガシ) は 2027 年 9 月 27 日に 再提供されておりユーザーは現時点で Azure Sphere (統合) に移行する必要があります。 TOC の上にある Version セレクターを使用して、Azure Sphere (統合) のドキュメントを表示します。

高度なアプリケーションでは、更新によって重要な処理が中断されないように、Azure Sphere OS とアプリケーション イメージに対する更新を一時的に保留することができます。 たとえば、キッチン用器具内の Azure Sphere デバイスでは、使用中に更新を保留できます。 更新を保留する機会を得るには、アプリで更新通知を登録します。 OS によって更新プログラムがダウンロードされると、アプリケーションに通知されるので、アプリケーションでは更新プログラム関する詳細情報を取得して保留を要求できます。

Deferred Update サンプルからは、イベント ループとシステム イベントを利用して更新を保留する方法がわかります。

リアルタイム対応アプリケーション (RTApp) では、更新通知の受信や保留の要求はできません。 高度なアプリは、デバイス上の RTApp に代わって更新の保留を管理する役割を担います。

保留の要件

更新を保留するアプリケーションでは、適切なヘッダー ファイルをインクルードし、保留の設定をアプリケーション マニフェストに追加する必要があります。

ヘッダー ファイル

プロジェクトに eventloop ヘッダーと sysevent ヘッダーを含めます。

 #include <applibs/eventloop.h>
 #include <applibs/sysevent.h>

アプリケーション マニフェストの設定

ソフトウェア更新イベントについて通知を受け、そのような更新を保留する機会を得られるように、アプリケーションではアプリケーション マニフェスト ファイルに次の 2 つの機能を含めます。

  • SystemEventNotifications
  • SoftwareUpdateDeferral

システム更新イベントの通知を受信するには、app_manifest ファイル内の SystemEventNotifications フィールドを true に設定します。 また、「通知メカニズム」で説明されているように、アプリケーションでイベント通知を登録する必要があります。 アプリで更新の保留と再開を可能にするには、SoftwareUpdateDeferraltrue に設定します。

通知と保留の両方を有効にするために必要な app_manifest.json 設定を次に示します。

"Capabilities": {
        "SystemEventNotifications" : true,
        "SoftwareUpdateDeferral" : true
    }

通知メカニズム

Azure Sphere では、イベント通知とイベント ループ メカニズムによって更新の保留がサポートされます。 アプリケーションでは、EventLoop が作成されます。これは、保留中のイベントをアプリケーションに通知するために使用されるシングルスレッド オブジェクトです。

通知を受信するために、アプリでは以下のパラメーターを渡して SysEvent_RegisterForEventNotifications を呼び出します。

  • イベント ループへのポインター
  • アプリで通知を要求するイベントを指定する eventBitmask
  • アプリで定義されたコールバック関数へのポインター
  • コールバックに渡される省略可能なコンテキスト ポインター

SysEvent_RegisterForEventNotifications で使用できる EventLoop オブジェクトはスレッドあたり 1 つだけです。 別の EventLoop オブジェクトを使用した SysEvent_RegisterForEventNotifications に対する 2 回目の呼び出しは失敗します。

登録後、アプリケーションでは EventLoop_Run を呼び出します。これにより、イベントの状態が変更された場合にコールバック関数が呼び出されます。 コールバック関数は、イベントの種類を識別する SysEvent_Events 値を受け取ります。 さらに、コールバックによって SysEvent_Info_GetUpdateData が呼び出され、イベントが OS 更新とアプリケーション更新のどちらであるかと、更新を保留できる時間の長さが確認されます。 その後、アプリによってイベント通知の処理方法が決定されます。

Azure Sphere では、更新イベントごとにいくつかの状態通知が送信されることがあります。

状態 説明
SysEvent_Status_Pending 更新イベントが発生し、保留できることを示す 10 秒の警告。
SysEvent_Status_Final 更新イベントが発生し、保留できないことを示す 10 秒の警告。
SysEvent_Status_Deferred 以前の保留中イベントが保留されており、後で行われます。
SysEvent_Status_Complete ソフトウェアの更新プロセスが完了しました。 このイベント通知は、アプリケーションの更新についてのみ送信されます。

アプリでは、SysEvent_Status_Pending 通知を受信した後にのみ、保留を要求できます。 更新を直ちに実行できるようにするために、アプリケーションでは通知を無視できます。

更新を保留するには、アプリケーションで SysEvent_DeferEvent を呼び出し、更新を保留する時間 (分) を渡します。 OS の更新の場合、保留の最大値は 1440 分 (24 時間) です。 アプリケーションの更新の場合、保留の最大値は 10,020 分 (167 時間) です。

アプリケーションでは、SysEvent_ResumeEvent を呼び出すことによって、更新の保留を早期に終了できます。 アプリケーションまたは OS の更新の場合、SysEvent_ResumeEvent が正常に呼び出されると、通知プロセスが再開され、新しい SysEvent_Status_Pending 通知が送信されます。 アプリでは、このような通知が受信されるまで、SysEvent_DeferEvent を再び呼び出すことはできません。

アプリケーションは、 SysEvent_Status_Final 通知を受信すると、Azure Sphere OS から SIGTERM シグナルを受信するように準備する必要があります。 SIGTERM シグナルを受信すると、アプリは最終的なクリーンアップを実行して終了する必要があります。 SIGTERM を受信する前にアプリケーションを終了しないでください。それ以外の場合は、SIGTERM が送信される前に再開される可能性があります。 OS の更新の場合、アプリケーションでは、デバイスが再起動される前に必要なクリーンアップを実行する必要があります。 アプリケーションの更新の場合、高度なアプリケーションでは、そのアプリケーションまたはデバイス上の他のアプリケーションが再起動される前に、必要な処理をすべて行う必要があります。 現在、どのアプリケーションが更新されているかはアプリケーション通知で示されません。

通知が不要になったら、アプリで SysEvent_UnregisterForEventNotifications を呼び出してから EventLoop_Close を呼び出して、イベント ループ オブジェクトに割り当てられたメモリを解放する必要があります。 すべてのイベント通知の登録が解除されると、アプリでは新しい EventLoop オブジェクトを使用できることに注意してください。