Door Timon Bestebreur (Software Team)

De satelliet moet veel taken uitvoeren, maar hoe beslist hij welke taak hij uitvoert? We doen dit met behulp van een niet preventieve wachtrij op meerder niveaus (multi-level), met een aparte wachtrij voor taken met hoge prioriteit die eenmalig moeten worden uitgevoerd (eenmalige taken). Hoe dit allemaal werkt wordt hieronder in meer detail uitgelegd!

De taakplanner bestaat uit een multi-level profiel (zes gestapelde lijsten) dat taken bevat met een executable (een functie en zijn argumenten, indien aanwezig), een interval (hoe vaak de taak moet worden uitgevoerd) en een watchdog limiet (de totale tijd die de taak mag lopen voordat hij wordt gestopt). Taken krijgen een prioriteit toegewezen op basis van het niveau in de lijst waarin ze zijn geplaatst. Dit wordt gevisualiseerd in het onderstaande figuur.

 

Naast terugkerende taken ondersteunt de planner ook eenmalige taken. Dit zijn taken met een hoge prioriteit die maar één keer hoeven te worden uitgevoerd, en niet meerdere keren op terugkerende intervallen. De eenmalige taken kunnen met of zonder vertraging worden ingepland en staan in een eenmalige takenlijst.

Om bij te houden welke taken uitgevoerd moeten worden bevat de planner een executielijst. Dit is een FIFO wachtrij die taken bevat die uitgevoerd moeten worden. Taken moeten worden uitgevoerd als de tijd tussen nu en de laatste keer dat ze zijn uitgevoerd langer is dan hun interval. Het taakinterval is dus geen deadline maar een minimale wachttijd tussen twee uitvoeringen van de taak.

Het plannen van een taak gebeurt door de taak van het multi-level profiel naar de executielijst te kopiëren. Het profiel wordt gescand op taken die uitgevoerd moeten worden in volgorde van afnemend prioriteitsniveau. Concreet: als twee taken klaar zijn voor uitvoering en één is van niveau 1 en één van niveau 3, dan wordt de taak van niveau 1 toegevoegd aan de lijst van uit te voeren taken vóór de taak van niveau 3. Zodra de taken op de uitvoeringslijst staan, worden de prioriteiten genegeerd, omdat de uitvoeringslijst een FIFO-wachtrij is.

Elke keer dat de terugkerende taken worden gescand voor taken die moeten worden uitgevoerd, worden de eenmalige taken ook gescand. Als ze moeten worden uitgevoerd, worden de eenmalige taken toegevoegd aan de lijst van uit te voeren taken en verwijderd van de lijst van eenmalige taken om meervoudige uitvoering te voorkomen.

De planner is “passief” in die zin dat hij niet actief periodiek taken verplaatst van het profiel naar de uitvoeringslijst. In plaats daarvan bevat de planner een methode die waar of onwaar teruggeeft op basis van de vraag of er taken beschikbaar zijn voor uitvoering. Telkens als deze methode wordt aangeroepen, scant de planner zijn interne profiel voor terugkerende en eenmalige taken die uitgevoerd moeten worden en, als die er zijn, voegt hij ze toe aan de lijst van uit te voeren taken. Daarna geeft de methode terug of de lijst met uit te voeren taken al dan niet taken bevat. Op deze manier kan de gebruiker van de planner beslissen wanneer hij taken wil uitvoeren of iets anders doen op basis van of er taken beschikbaar zijn, en het stelt de planner in staat om te functioneren zonder een achtergrondroutine.

Het mooie van dit ontwerp is dat het het selecteren en uitvoeren van taken heel eenvoudig maakt. Dit kan gedaan worden met een paar regels code:

Vertaald met www.DeepL.com/Translator (gratis versie)

Dat is het! Heel netjes, toch?

Dus, dit is taak planning theorie toegepast in de context van onze echte-wereld. We hopen dat je tijdens het lezen van deze blogpost iets geleerd hebt.
Nog een prettige dag!

-Het Software Team