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
WhatOS: http://www.sticlete.com/whatos/index.html protothreads: http://www.sics.se/~adam/pt/ COMATOS: http://www.nbb.cornell.edu/neurobio/land/STUDENTPROJ/1999to2000/greenblatt/index.html
Hallo, schau mal bei mir nach - vielleicht hilft der Ansatz http://www.ibweinmann.de/html/echtzeit_auf_muc_.html Gruß Wolfgang
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.