Apparaatupdates uitstellen
Een toepassing op hoog niveau kan updates voor het Azure Sphere-besturingssysteem en toepassingsinstallatiekopieën tijdelijk uitstellen om te voorkomen dat de update kritieke verwerking onderbreekt. Een Azure Sphere-apparaat in een keukenapparaat kan bijvoorbeeld updates uitstellen tijdens het gebruik. Als u de mogelijkheid wilt hebben om updates uit te stellen, registreert de app zich voor updatemeldingen. Nadat het besturingssysteem de update heeft gedownload, wordt de toepassing gewaarschuwd. Deze kan details over de update ophalen en uitstel aanvragen.
In het voorbeeld van de uitgestelde update ziet u hoe u een gebeurtenislus en systeemgebeurtenissen gebruikt om updates uit te stellen.
Realtime compatibele toepassingen (RTApps) kunnen geen updatemeldingen of uitstel van aanvragen ontvangen. Een app op hoog niveau is verantwoordelijk voor het beheren van uitstel van updates namens RTApps op het apparaat.
Uitstelvereisten
Toepassingen die updates uitstellen, moeten de juiste headerbestanden bevatten en instellingen voor uitstel toevoegen aan het toepassingsmanifest.
Koptekstbestanden
Neem de eventloop- en sysevent-headers op in uw project:
#include <applibs/eventloop.h>
#include <applibs/sysevent.h>
Toepassingsmanifestinstellingen
Om op de hoogte te worden gesteld van software-update-gebeurtenissen en om dergelijke updates uit te stellen, bevat een toepassing twee mogelijkheden in het manifestbestand van de toepassing:
- SystemEventNotifications
- SoftwareUpdateDeferral
Stel het veld SystemEventNotifications in op true
in het bestand app_manifest.json om meldingen van systeemupdates te ontvangen. De toepassing moet zich ook registreren voor gebeurtenismeldingen, zoals beschreven in Meldingsmechanisme. Stel SoftwareUpdateDeferral in op true
om de app in staat te stellen updates uit te stellen en te hervatten.
Hieronder ziet u de app_manifest.json-instellingen die vereist zijn om zowel meldingen als uitstel in te schakelen:
"Capabilities": {
"SystemEventNotifications" : true,
"SoftwareUpdateDeferral" : true
}
Meldingsmechanisme
Azure Sphere biedt ondersteuning voor uitstel van updates via een mechanisme voor gebeurtenismeldingen en een gebeurtenislus. De toepassing maakt een EventLoop
. Dit is een object met één thread waarmee de toepassing op de hoogte wordt gesteld van gebeurtenissen die in behandeling zijn.
Als u meldingen wilt ontvangen, roept een app SysEvent_RegisterForEventNotifications aan, waarbij deze parameters worden doorgegeven:
- Een aanwijzer naar de gebeurtenislus
- Een
eventBitmask
die de gebeurtenissen opgeeft waarvoor de app een melding aanvraagt - Een aanwijzer naar een door de app gedefinieerde callback-functie
- Een optionele contextaanwijzer die wordt doorgegeven aan de callback
Er kan slechts één EventLoop
object worden gebruikt met SysEvent_RegisterForEventNotifications per thread. Een tweede aanroep naar SysEvent_RegisterForEventNotifications met een ander EventLoop
object mislukt.
Na de registratie roept de toepassing EventLoop_Run aan, die de callback-functie aanroept als de status van een gebeurtenis is gewijzigd. De callback-functie ontvangt een SysEvent_Events-waarde , waarmee het type gebeurtenis wordt geïdentificeerd. Op zijn beurt roept de callback SysEvent_Info_GetUpdateData aan om erachter te komen of de gebeurtenis een update van het besturingssysteem of een toepassing is en hoe lang de update kan worden uitgesteld. De app kan vervolgens bepalen hoe de gebeurtenismelding moet worden verwerkt.
Azure Sphere kan verschillende statusmeldingen verzenden voor elke update-gebeurtenis:
Status | Beschrijving |
---|---|
SysEvent_Status_Pending | Een waarschuwing van 10 seconden dat er een updategebeurtenis plaatsvindt, met de mogelijkheid om uit te stellen. |
SysEvent_Status_Final | Een waarschuwing van 10 seconden dat er een updategebeurtenis plaatsvindt, zonder de mogelijkheid tot uitstel. |
SysEvent_Status_Deferred | De gebeurtenis die eerder in behandeling was, is uitgesteld en vindt later plaats. |
SysEvent_Status_Complete | Het software-updateproces is voltooid. Deze gebeurtenismelding wordt alleen verzonden voor toepassingsupdates. |
Een app kan pas uitstel aanvragen nadat deze een SysEvent_Status_Pending-melding heeft ontvangen. Als u wilt toestaan dat de update onmiddellijk wordt uitgevoerd, kan de toepassing de melding negeren.
Als u de update wilt uitstellen, roept de toepassing SysEvent_DeferEvent aan, waarbij het aantal minuten wordt doorgegeven om de update uit te stellen. Voor een update van het besturingssysteem is de maximale uitstel 1440 minuten (24 uur). Voor een toepassingsupdate is de maximale uitstelperiode 10.020 minuten (167 uur).
Een toepassing kan een uitstel van een update voortijdig beëindigen door SysEvent_ResumeEvent aan te roepen. Voor een toepassings- of besturingssysteemupdate wordt bij een geslaagde aanroep naar SysEvent_ResumeEvent het meldingsproces opnieuw gestart en wordt er een nieuwe SysEvent_Status_Pending melding verzonden. De app mag SysEvent_DeferEvent niet opnieuw aanroepen totdat deze een dergelijke melding heeft ontvangen.
Wanneer de toepassing de melding SysEvent_Status_Final ontvangt, moet deze zich voorbereiden op het ontvangen van een SIGTERM-signaal van het Azure Sphere-besturingssysteem. Wanneer het SIGTERM-signaal wordt ontvangen, moet de app definitief worden opgeruimd en afgesloten. De toepassing mag niet worden afgesloten voordat de SIGTERM is ontvangen; Anders kan deze opnieuw worden gestart voordat de SIGTERM wordt verzonden. Voor een update van het besturingssysteem moet de toepassing de vereiste opschoning uitvoeren voordat het apparaat opnieuw wordt opgestart. Voor een toepassingsupdate moet de toepassing op hoog niveau alles doen wat nodig is voordat deze of een andere toepassing op het apparaat opnieuw wordt opgestart. In de toepassingsmelding wordt momenteel niet opgegeven welke toepassing wordt bijgewerkt.
Wanneer de melding niet meer vereist is, moet de app SysEvent_UnregisterForEventNotifications aanroepen en vervolgens EventLoop_Close om het geheugen vrij te geven dat is toegewezen voor het gebeurtenislusobject. Houd er rekening mee dat nadat alle gebeurtenismeldingen zijn uitgeschakeld, de app een nieuw EventLoop
object kan gebruiken.