Hallo, ich habe hier ein Programm, welches zwei Prozesse bearbeiten soll. Einen sehr schnell wiederholt in periodischer Abfolge und einen sporadisch, der jedoch länger dauert als die eine Periode des kurzen Prozesses. Die Bearbeitung des langsamen Prozesses dauert länger als die zulässige Periode, in welcher der schnelle Prozess ablaufen muss, d.h. der schnelle Prozess wird innerhalb des langsamen Prozesses mehr als 1 mal aufgerufen. Nun meine Problemlösung: Möglichkeit 1: Ich packe den kurzen Prozess vollständig in die Timer-ISR und den langsamen Prozess in die Main-while(1)-Schleife, was zur Folge hat, dass die Bearbeitung des langsamen Prozesses garantiert nur solange unterbrochen wird, wie der kurze Prozess dauert. Doof an der Lösung ist allerdings, dass dies eine Erweiterung des Programms wohl schwierig bis unmöglich macht. Spätestens, wenn in Zukunft ein dritter Prozess dazu kommt, stehe ich vor der Frage wie ich nun sinnvolle Rechenpausen in die Bearbeitung der einzelnen Tasks einfüge. Es wäre daher wohl besser, alle Prozessschritte in die main-while(1) zu verlagern und dort irgendwie sicherzustellen, dass die kurzen Prozesse komplett in einem Stück bearbeitet werden und die langsameren Prozesse eben gleichverteilt die restliche Rechenzeit aufteilen dürfen... Nun steh ich aber vor der Frage, wie ich eine derartige sequenzielle Abarbeitung eines Prozesses realisieren könnte... Ich werde ja irgendwo in einem {...Prozessschritt...} stecken und möchte diesen dort unterbrechen, aber genau an dieser Stelle wieder weiter machen, sobald die wichtigere Aufgabe abgearbeitet ist... Hat jemand eine konstruktive Idee oder einen Tip?
Wenn die wichtigere, kürzere Aufgabe keinen Aufschub duldet, dann kommt sie in die Timer-ISR. Für den Rest: teil den langsamen Prozess in mehrere Teile (Phasen) auf, dasselbe auch mit allen anderen Prozessen die im Laufe der Zeit da noch dazu kommen werden und dann bau dir eine State-Maschine über diese Phasen - für jeden Prozess einen. Und diese State-Maschinen rufst du im Wechsel auf. Die dürfen dann jeweils den nächsten Berechnungsabschnitt erledigen und geben die Kontrolle wieder ab. Woraufhin die nächste State-Maschine ihre nächste Phase abarbeitet. Immer reihum.
:
Bearbeitet durch User
was ist "lang" und was ist "schnell". Grundsätzlich solltest du dir mal das Thema Zustandsprogrammierung angucken sobald du etwas mit Echtzeit machen möchtest. Hierbei gilt: Sobald irgendetwas "lang" dauert, ist da ein Zustand. D.h. der Programmteil für den Zustand ist so aufgebaut, daß es z. Bsp. nachschaut ob eine Bedingung erfüllt ist (etwa ein Schalter) und dann irgendetwas "schnelles" tut. Ist die Bedingung nicht erfüllt, so gibt es die Rechenzeit mit return ab. Dauert irgendetwas "lang", so führst du einen oder mehrere Zustände ein und schon kommt jeder andere wieder "schnell" dran. Damit hast du ein kooperatives Multitasking und kannst die Rechenzeit bzw. Abfragegeschwindigkeit jederzeit in der Hauptschleife auch ohne HW Timer leicht beeinflussen. Hast du das Programm aber so geschrieben, daß irgend eine Aufgabe "lang" dauert, so gibt es ein Problem. Das kannst du entweders mit Zustandsprogrammierung lösen oder aber ein Betriebssystem mit präemptivem Multitasking verwenden. D.h. der "lange" Programmteil kriegt irgendwann einen Interrupt vom Taskwechsel reingebraten und dann kommt der kurze Programmteil zwangsweise dran. Wenn du kein fertiges Multitask verwenden willst, kannst du den Aufruf des kurzen Teils natürlich auch selbst mit einem HW Timer aufrufen. Solange es bei einem Teil bleibt ist das noch übersichtlich, aber auch hier gilt im Prinzip alles was auch für Multitask gilt. D.h. Zugriff auf gemeinsame Resoourcen (wie. z. bsp. eine Schnittstelle) muß über Semaphore verriegelt werden u.v.m. Wenn du das mal selbst geschrieben hast, wird dir alles klar und wenn du die Zustandsprogrammierung verstanden hast, weist du, warum du kein Multitasking Betriebssystem mehr brauchst ....
Hi Ich weiß ja nicht, welche Sprache, aber wenn es um Prozesse geht, die in einem bestimmten Abstand abgearbeitet werden sollen/ müssen dann setze ich in der Timer-ISR Time-Flags. Im Hauptprogramm wird geprüft, ob eines gesetzt ist, wenn ja, die entsprechende Bearbeitung aufrufen und das Time-Flag löschen. So werden die Programme nur aktiv, wenn sie im Zeitintervall liegen. Die Zeitintervalle sind entsprechend beliebig aufzuarbeiten. Gruß oldmax
Karl Heinz schrieb: > Wenn die wichtigere, kürzere Aufgabe keinen Aufschub duldet, dann kommt > sie in die Timer-ISR. Naja.. mein Lieber. Sowas gehört in eine separate Interrupt-Service-Routine, die entsprechend hoch priorisiert ist - wenn es wirklich so eilig sein sollte. Ansonsten macht der TO mal wieder (!!!) den üblichen prozeduralen Fehler: Ich hab hier ne laaange Routine und ne kurze Routine und vielleicht ne andere auch laaaaaaaaange Routine demnächst, wie soll ich das bloß unter einen Hut bekommen? Sowas gehört umgestrickt auf ereignisorientiert und nichtblockierende Programmierweise. Dann bleibt nur noch die schiere Prozessorleistung als begrenzendes Element übrig und fertig isses. W.S.
Das ist das klassische Beispiel für ein RTOS. Für die 2 Prozesse wird sich der Aufwand nicht lohnen, da macht die Timer ISR mehr Sinn. Willst du aber erweiterbar bleiben wird das RTOS mit jedem zusätzlichen Prozess lohnender.
Procedure schrieb: > Die Bearbeitung des langsamen Prozesses dauert länger als die zulässige > Periode, in welcher der schnelle Prozess ablaufen muss, Im einfachsten Fall schreibt man die lange Task als Statemaschine und immer wenn sie auf etwas wartet, geht sie zurück zu Main. Dann müssen nur die einzelnen States schnell genug sein, damit die anderen Tasks auch an die Reihe kommen.
Abhaengig davon was die Antwortzeit des schnellen Prozesses sein muss, kann man den langsamen Prozess in schnelle Abschnitte umformen. Man kann zB eine Binaer zu BCD Wandlung so umformen, das pro Durchlauf nur ein Digit gerechnet wird.
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.