Hallo In einem normalen Programm für Mikrocontroller werden Funktionen wie Anzeige aktualisieren, Daten speichern, COM-Ports abfragen ja in der Hauptschleife nacheinander abgearbeitet. Man kann die Abarbeitung auch noch von z.B. zeitlichen Kreterien abhängig machen (Anzeige all 100ms aktualisieren). So kommt jede Funktion bei einem Hauptschleifendurchlauf zwar zur Ausführung, aber die HS wird entsprechnd lang, und eine Anzeig mit 10 Hz ist z.B. nicht möglich). Ich möchte ein Manager erstellen der diese einzellnen Funktionen (Tasks) aufruft. Dabei sollen Tasks entsprechned ihres Zustandes, eines Mindestzeitintervall oder in Abhängigkeit vom Betriebszustand des Gerätes, entsprechned häufig ausgeführt werden. So muss z.B. eine COM-Abarbeitungsroutine nicht bei jedem HS-Durchlauf aufgerufen werden, wenn keine Daten im Empfangsbuffer sind. Auch brauch eine Anzeige nicht mit 10 Hz aktualisiert werden, wenn im aktuellen Betriebszustand gar keine neuen Messwerte ermittelt werden. Die so gesparrte Zeit soll anderen Tasks zu gute kommen. Ich möchte kein RealTime OS, welches die Tasks mitten in der Abarbeitung anhält und die Prozessorkapazität an andere Tasks übergibt, und den angehaltenen Taks später weiterführt. Eine einmal aufgerufener Taks läuft so lange, bis die Funktion/Teilfunktion abgearbeitet ist. Erst dann kommt der Taskmanager wieder zum Zuge und ruft die nächste oder auch die Gleiche Funktion auf. Gibt es zu dieser Thematik Informationen im Netz? Hat sich damit schon mal jemand beschäftigt? Ich würde ja die Suchfunktionen (Forum, Googel) benutzrn, weiß aber nich nach was ich suchen soll. Dankende Grüße Steffen
> Auch brauch eine Anzeige nicht mit 10 Hz aktualisiert werden, wenn im > aktuellen Betriebszustand gar keine neuen Messwerte ermittelt werden. Interrupt bzw. Bedingung für Aktualisieren? Das ist ein recht schwieriges Thema und wohl nur mit viel Erfahrung und Zeit zu lösen, zumal bei µCs nur sehr wenig Speicher zur Verfügung steht. z.B. http://www.femtoos.org/ Linksammlung Betriebssysteme & Co.
Die von dir empfohlenen Seite beschreibt ein RTOS (Real Time OS) dieses möchte ich aus den genannten Gründen (benötigt viel Speicher) nicht umsetzen. Ich möchte ein System erstellen welches "nur" die anfallenden Lasten gleichmäßig über die Zeit sinnvoll verteilt. Im Gegensatz zum RTOS werden die aufgerufenen Funktion (Tasks) komplett abgearbeitet. So müssen die funktionsinternen Variablen, Rücksprungadressen und all das nicht im Speicher gehalten werden. Bevor ein neuer Task ausgeführt werden kann muss der letzte erst beendet werden.
Danke für den Tip mit der Linksammlung, die hab ich noch garnicht gesehen, hier werde ich vieleicht fündig
Ich habe mich für die Variante aus dem Beitrag "Wartezeiten effektiv (Scheduler)" entschlossen. Da hier aber nur zeitlich zuordbare Task erfasst werden, werde ich das System um eine Liste mit nach Prioritäten geordneten Task erweitern. Um die Hauptschleife nicht zu überlasten, wird aus beiden Listen jeweils nur ein Eintrag pro HS-Durchlauf abgearbeitet. So kann dieser Manager für alle anfallenden Aufgaben in der HS genutz werden. Erzeugt werden die Einträge in den Listen aus Ereignissen. (z.B. wenn ein Zeichen im Empfangspuffer durch die Interruptroutine es Com-Ports eingetragen wird, wird gleichzeitig in Prioritätenliste die COM-Abarbeitungsroutine eingetragen. Wenn dann die HS Zeit hat, werden die Empfangenen Zeichen verarbeit.) Auch können Einträge in beide Listen erfolgen. So wird erreicht, das ein Task so bald wie möglich, aber spätestens nach einer bestimmten Zeit abgearbeitet wird. Das durch die Taskroutine der Eintrag aus der jeweils anderen Liste gelöscht wird versteht sich von selbst. Gruß Steffen
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.