Dela via


Skjuta upp enhetsuppdateringar

Ett program på hög nivå kan tillfälligt skjuta upp uppdateringar av Azure Sphere-operativsystemet och programavbildningar för att förhindra att uppdateringen avbryter kritisk bearbetning. En Azure Sphere-enhet i en köksapparat kan till exempel skjuta upp uppdateringar under användningen. För att få möjlighet att skjuta upp uppdateringar registreras appen för uppdateringsmeddelanden. När operativsystemet har laddat ned uppdateringen meddelas programmet, som kan få information om uppdateringen och skjuta upp begäran.

Exemplet med uppskjuten uppdatering visar hur du använder en händelseloop och systemhändelser för att skjuta upp uppdateringar.

Real-time capable applications (RTApps) cannot receive update notifications or request deferrals. En app på hög nivå ansvarar för att hantera uppskjutande av uppdateringar för RTApps på enheten.

Skjuta upp krav

Program som skjuter upp uppdateringar måste innehålla lämpliga huvudfiler och lägga till inställningarna för uppskjutning i programmanifestet.

Sidhuvudfiler

Ta med rubrikerna för eventloop och sysevent i projektet:

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

Inställningar för programmanifest

För att få meddelanden om programuppdateringshändelser och möjlighet att skjuta upp sådana uppdateringar innehåller ett program två funktioner i programmanifestfilen :

  • SystemEventNotifications
  • SoftwareUpdateDeferral

Ange fältet SystemEventNotifications till true i filen app_manifest.json för att få meddelanden om systemuppdateringshändelser. Programmet måste också registrera sig för händelsemeddelanden enligt beskrivningen i Meddelandemekanismen. Ange SoftwareUpdateDeferral så att true appen kan skjuta upp och återuppta uppdateringar.

Följande visar de app_manifest.json-inställningar som krävs för att aktivera både aviseringar och uppskjutningar:

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

Meddelandemekanism

Azure Sphere har stöd för uppdateringsuppehåll via en mekanism för händelsemeddelande och händelseslinga. Programmet skapar ett EventLoop, som är ett enkeltrådat objekt genom vilket programmet meddelas om väntande händelser.

För att ta emot aviseringar SysEvent_RegisterForEventNotifications en app med följande parametrar:

  • En pekare till händelseslingan
  • Ett eventBitmask som anger de händelser som appen begär avisering för
  • En pekare till en appdefinierad återanropsfunktion
  • En valfri kontextpekare som skickas till återuppringningen

Endast ett EventLoop objekt kan användas med SysEvent_RegisterForEventNotifications per tråd. Ett andra anrop till SysEvent_RegisterForEventNotifications med ett annat EventLoop objekt misslyckas.

Efter registreringen anropar programmet EventLoop_Run, som anropar återanropsfunktionen om en händelse har ändrat status. Återanropsfunktionen får ett SysEvent_Events värde som identifierar typen av händelse. Återanropet ringer i sin tur SysEvent_Info_GetUpdateData för att ta reda på om händelsen är en OS- eller programuppdatering och hur länge uppdateringen kan skjutas upp. Appen kan sedan avgöra hur händelsemeddelandet ska hanteras.

Azure Sphere kan skicka flera statusmeddelanden för varje uppdateringshändelse:

Status Beskrivning
SysEvent_Status_Pending En 10 sekunders varning om att en uppdateringshändelse inträffar, med möjlighet att skjuta upp.
SysEvent_Status_Final En 10 sekunders varning om att en uppdateringshändelse inträffar, utan möjlighet till uppskov.
SysEvent_Status_Deferred Den tidigare väntande händelsen har skjutits upp och inträffar senare.
SysEvent_Status_Complete Programuppdateringsprocessen är klar. Det här händelsemeddelandet skickas endast för programuppdateringar.

En app kan begära uppskov först när den har fått ett SysEvent_Status_Pending meddelande. Om du vill tillåta att uppdateringen sker direkt kan programmet ignorera meddelandet.

Om du vill skjuta upp uppdateringen anropas SysEvent_DeferEvent, vilket går igenom antalet minuter för att skjuta upp uppdateringen. För en OS-uppdatering är det maximala anståndet 1 440 minuter (24 timmar). För en programuppdatering är den maximala uppskovsperioden 10 020 minuter (167 timmar).

Ett program kan avsluta ett uppdateringsuppehåll i förtid genom att ringa SysEvent_ResumeEvent. För ett program eller en OS-uppdatering startar ett anrop för att SysEvent_ResumeEvent om meddelandeprocessen och skickar därför ett nytt SysEvent_Status_Pending meddelande. Appen ska inte ringa SysEvent_DeferEvent igen förrän den har fått ett sådant meddelande.

När programmet får SysEvent_Status_Final-meddelandet bör det förberedas för att ta emot en SIGTERM-signal från Azure Sphere-operativsystemet. När SIGTERM-signalen tas emot ska appen utföra den slutliga rensningen och avsluta. Ansökan bör inte avslutas innan SIGTERM tas emot. annars skulle den kunna startas om innan SIGTERM skickas. För en OS-uppdatering ska programmet göra den rensning som krävs innan enheten startas om. För en programuppdatering ska programmet på hög nivå göra det som är nödvändigt innan det eller något annat program på enheten startas om. Programavisering anger för närvarande inte vilket program som uppdateras.

När meddelandet inte längre krävs ska appen anropa SysEvent_UnregisterForEventNotifications och sedan EventLoop_Close för att frigöra det minne som tilldelats för händelseloopobjektet. Observera att när alla händelsemeddelanden har avregistrerats kan appen använda ett nytt EventLoop objekt.