Dela via


Skjuta upp enhetsuppdateringar

Viktigt!

Det här är dokumentationen om Azure Sphere (Legacy). Azure Sphere (Legacy) upphör den 27 september 2027 och användarna måste migrera till Azure Sphere (integrerad) vid den här tiden. Använd versionsväljaren ovanför TOC för att visa dokumentationen om Azure Sphere (integrerad).

Ett högnivåprogram kan tillfälligt skjuta upp uppdateringar av Azure Sphere OS 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 kunna skjuta upp uppdateringar registreras appen för uppdateringsmeddelanden. När operativsystemet har laddat ned uppdateringen meddelar det programmet, som kan få information om uppdaterings- och begärandeuppskjutningen.

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

Realtidskompatibla program (RTApps) kan inte ta emot uppdateringsmeddelanden eller uppskjutningar av begäranden. En högnivåapp ansvarar för att hantera uppdateringsuppsägningar på uppdrag av RTApps på enheten.

Uppskjutningskrav

Program som skjuter upp uppdateringar måste innehålla lämpliga huvudfiler och lägga till deferralinställningar i programmanifestet.

Rubrikfiler

Inkludera eventloop- och sysevent-rubrikerna i projektet:

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

Inställningar för programmanifest

För att meddelas om programuppdateringshändelser och för att kunna 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 ta emot meddelanden om systemuppdateringshändelser. Programmet måste också registrera sig för händelsemeddelanden enligt beskrivningen i Meddelandemekanism. Ställ in 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 meddelande och uppskjutning:

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

Meddelandemekanism

Azure Sphere stöder uppdateringsuppskjutning via en mekanism för händelsemeddelanden och händelseloopar. Programmet skapar ett EventLoop, som är ett enkeltrådat objekt genom vilket programmet meddelas om väntande händelser.

För att ta emot meddelanden anropar en app SysEvent_RegisterForEventNotifications och skickar följande parametrar:

  • En pekare till händelseloopen
  • En 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 motringningen

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 tar emot ett SysEvent_Events värde som identifierar typen av händelse. Återanropet anropar 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 omedelbart kan programmet ignorera meddelandet.

För att skjuta upp uppdateringen anropar programmet SysEvent_DeferEvent och skickar antalet minuter för att skjuta upp uppdateringen. För en OS-uppdatering är den maximala uppskjutningen 1 440 minuter (24 timmar). För en programuppdatering är den maximala uppskjutningsperioden 10 020 minuter (167 timmar).

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

När programmet tar emot 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 slutlig rensning och avsluta. Programmet bör inte avslutas innan SIGTERM tas emot. Annars kan den startas om innan SIGTERM skickas. För en os-uppdatering bör programmet göra den rensning som krävs innan enheten startas om. För en programuppdatering bör högnivåprogrammet göra vad som krävs innan det eller något annat program på enheten startas om. Programmeddelandet 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 allokerats för händelseloopobjektet. Observera att när alla händelsemeddelanden har avregistrerats kan appen använda ett nytt EventLoop objekt.