Forum: Mikrocontroller und Digitale Elektronik AVR Multithreading / Statemachines


von Stefan Noll (Gast)


Lesenswert?

Hallo!

Welche Möglichkeiten würde es geben, im AVR Multithreading oder so was
ähnliches zu betreiben? Es soll überhaupt nicht präemptiv sein, sondern
ich suche eine Möglichkeit die Kontextwechsel (beispielsweise aus einer
Funktion für die Displayansteuerung in eine Funktion für die
Ansteuerung einer Schnittstelle).
Das ganze könnte man vielleicht automatisch machen wenn der AVR wie bei
den interrupts routinen kennen würde den stack zu sichern und den
ausführungszeiger zu verschieben,
oder einfach manuell in dem man einen Programmierstil mit
StateMaschines erstellt, die nacheinander alle aus der Hauptfunktion
aufgerufen werden und nach jedem Schleifendurchgang einen
Zustandswechsel bekommen. Habt ihr dazu schon analoge Projekte erstellt
/ gefunden wie man das ganze formal aufbauen könnte?

Viele Grüße,
Stefan Noll

von A.K. (Gast)


Lesenswert?


von Wolfgang (Gast)


Lesenswert?

Hallo,

schau mal bei mir nach - vielleicht hilft der Ansatz

http://www.ibweinmann.de/html/echtzeit_auf_muc_.html

Gruß

Wolfgang

von ... (Gast)


Lesenswert?

vielleicht hilft Dir das:
www.freertos.org

von Markus (Gast)


Lesenswert?

@Stefan:
Ohne gleich ein OS zu nehmen kannst Du ja einfach einen Timer laufen
lassen und bei dessen Interrupt ein volatile byte abfragen und dann
zyklisch durchschalten ;)
Also wenn Wert des volatile Flags 0 = rufe Funktion Display auf und
inkrementiere das Flag, ist Flag 1 = rufe Funktion Schnittstelle auf
usw.
Paßt in ein einfaches case und Du kannst sogar Echtzeit garantieren ;)
Oder wenn Du aus den Funktionen heraus den Kontext wechseln willst
kannst Du in der Funktion ja einen IRQ auslösen nachdem Du das
Adressflag der Funktionsaufrufe auf den Wert geändert hast, der der
Funktion entspricht.
Wie sich das allerdings auf Deine Variablen Werte in den Funktionen
auswirkt kann ich nicht sagen, ist nur eine spontane Idee ;)
Bye,
Markus

von Martin K. (mkohler)


Lesenswert?

Ich habe ein ähnliches Problem auf zwei Arten schon mal gemacht.

1: in C mit einer Funktios-Liste, jeder dazukommende "Thread" war
eine separate Funktion. Beim Starten wird die Funktion in die Liste
eingetragen als Pointer auf die Funktion.

Das "OS" geht dann periodisch die Liste mit den auszuführenden
"Threads" durch und startet die entsprechende Funktion.

Die einzelnen Funktionen waren als State-Machine aufgebaut, mit static
Variablen v.A. für den State, so dass beim nächsten Durchlauf/Start der
Funktion der richtige Zustand wieder verwendet wurde.

2: Die zweite Variante war noch einfacher: einfach mehrere
State-Machines hintereinander im main angeordnet. Zeitverzögerungen
ausschliesslich über Timer-Abfragen.

So ist auch eine Art "Multithreading" möglich, pro Main-Loop
Durchlauf kommt jede Statemachine einmal dran.

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.