# Allegemeine Fragen zum Arbteiten mit mehrern Tasks



## illi (11 Juli 2010)

Moin,

bin neu bei der Programmierung des Wago 841ers und mache mir so meine Gedanken zum Arbeiten mit mehreren Tasks.

Komme eigentlich mehr aus der Computer-Ecke, habe aber das SPS-Konzept des never-ending-loops und der Programmierung mit nicht blockierenden Schleifen, etc. verstanden.

*Wie ist die Unterbrechung/Wechsel von einem Task zum nächsten **bei Codesys/Wago **geregelt ? 
*
Kann der Task-Wechsel an beliebiger Stelle passieren oder nur an Struktur-Grenzen, wie Funktionsaufrufen, Befehlen, etc. Wenn, nein welche Befehle sind atomar und können nicht unterbrochen werden? Konkret geht es um die Frage, welche Programmteile müssen über Semaphoren abgesichert werden?

Wenn ich eine Variable (z. B. ein DWord) in beiden Tasks verwende, muss ich dann damit rechnen, dass ein Zugriff nach einem Byte/Word unterbrochen wird und dann der andere Tasks darauf zugreift und zu einem falschen Ergebnis kommt?

*Wann werden Prozessabbild und Variablen gesetzt?*

Ich gehe mal davon aus, dass für jeden Task ein eigenes Prozessabbild generiert wird. Wann ändern Variablen ihren Wert? Was passiert mit gemeinsamen Variablen zweier Prozesse?

*Praktische Frage: Was ist beim Speichern im Filesystem zu beachten?

*Ich möchte Messdaten speichern. Diese werden in einem schnellen hoch priorisierten Prozess erzeugt und in einen Buffer geschrieben. Anschließend werden sie durch einen nieder prioren Task in eine Datei im Filesystem geschrieben.

Irgendwie muss ich berücksichtgen, dass in der Zeit, in der der Buffer ins Filesystem geschrieben wird, keine neuen Daten in den Buffer gefüllt werden können. Muss ich mit 2 Buffern arbeiten, die ich immer abwechselnd fülle.


Ich würde mich freuen, wenn der eine oder andere seine Erfahrungen zum Handlen mehrerer Tasks zum Besten gibt.


----------



## Werner29 (14 Juli 2010)

Hallo illi,

gute Fragen. Hängt alles ein bisschen von der tatsächlichen Hardware ab.
Typischerweise ist es auf Echtzeitsystemen so, dass eine höherpriore Task nicht von einer niederprioren Task unterbrochen wird. Umgekehrt aber natürlich schon, und das zu jedem beliebigen Zeitpunkt. Atomar sind nur Befehle die in eine einzige Prozessorinstruktion übersetzt werden können.
d.h das Lesen und Schreiben einer einzelnen Variable bis 32 Bit muss nicht synchronisiert werden.
Alles was darüberhinausgeht muss synchronisiert werden (Strings. LREALS, Strukturen oder einfach mehrere Variablen, die konsistent zueinander sein müssen). 
Zum Prozessabbild: Die Inputs und Outputs werden tatsächlich taskbezogen upgedatet. Vor einem Taskzyklus werden die Inputs gelesen und nach einem Taskzyklus die Outputs geschrieben.
Beachten sollte man, dass nicht dieselben Outputs von mehreren Tasks geschrieben werden. Das kann CoDeSys aber checken und als Fehler melden (in den Übersetzungsoptionen "Konkurrierender Zugriff" anwählen). 

Speichern ins Filesystem: 2 Buffer sind vernünftig. Während des Kopierens muss synchronisiert werden und der Buffer darf natürlich nicht überlaufen.

Bernhard


----------

