延遲裝置更新
重要
這是 Azure Sphere (舊版) 檔。 Azure Sphere(舊版)將於 2027 年 9 月 27 日淘汰,且使用者此時必須移轉至 Azure Sphere(整合式)。 使用位於 TOC 上方的版本選取器來檢視 Azure Sphere (整合式) 檔。
高階應用程式可以暫時延遲 Azure Sphere OS 和應用程式映射的更新,以防止更新中斷重大處理。 例如,廚房設備中的 Azure Sphere 裝置可能會在使用期間延遲更新。 若要有機會延遲更新,應用程式會註冊更新通知。 操作系統下載更新之後,它會通知應用程式,以取得更新和要求延遲的詳細數據。
延遲更新範例示範如何使用事件循環和系統事件來延遲更新。
即時可用的應用程式 (RTApps) 無法接收更新通知或要求延遲。 高階應用程式負責代表裝置上的 RTApps 管理更新延遲。
延遲需求
延遲更新的應用程式必須包含適當的頭檔,並將延遲設定新增至 應用程式指令清單。
標頭檔
在您的項目中包含 eventloop 和 sysevent 標頭:
#include <applibs/eventloop.h>
#include <applibs/sysevent.h>
應用程式指令清單設定
若要收到軟體更新事件的相關通知,並有機會延遲這類更新,應用程式會在應用程式指令清單檔案中包含兩項功能:
- SystemEventNotifications
- SoftwareUpdateDeferral
將 [SystemEventNotifications ] 字段設定為 true
app_manifest.json 檔案中的 ,以接收系統更新事件的通知。 應用程式也必須註冊事件通知,如通知機制中所述。 將SoftwareUpdateDeferral 設定為 true
,讓應用程式能夠延遲和繼續更新。
下列顯示啟用通知和延遲所需的app_manifest.json設定:
"Capabilities": {
"SystemEventNotifications" : true,
"SoftwareUpdateDeferral" : true
}
通知機制
Azure Sphere 支援透過事件通知和事件循環機制更新延遲。 應用程式會 EventLoop
建立 ,這是一個單個線程物件,應用程式會透過此物件收到擱置事件通知。
若要接收通知,應用程式會呼叫 SysEvent_RegisterForEventNotifications,並傳遞下列參數:
- 事件迴圈的指標
eventBitmask
,指定應用程式要求通知的事件- 應用程式定義回呼函式的指標
- 傳遞至回呼的選擇性內容指標
每個線程只能搭配SysEvent_RegisterForEventNotifications使用一個EventLoop
物件。 使用不同EventLoop
物件對SysEvent_RegisterForEventNotifications的第二次呼叫將會失敗。
註冊之後,應用程式會呼叫 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
物件。