mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR Multithreading / Statemachines


Autor: Stefan Noll (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

schau mal bei mir nach - vielleicht hilft der Ansatz

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

Gruß

Wolfgang

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielleicht hilft Dir das:
www.freertos.org

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.