Forum: Mikrocontroller und Digitale Elektronik Prozesse - Rechenzeit verteilen


von Procedure (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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
von J. V. (janvi)


Lesenswert?

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 ....

von Martin V. (oldmax)


Lesenswert?

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

von W.S. (Gast)


Lesenswert?

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.

von Ralph (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

Siehe Multitasking

von Peter D. (peda)


Lesenswert?

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.

von снегурочка (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.