Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched.
Close
CoDeSys erlaubt die Benutzung von mehreren Tasks, wobei höher priorisierte Tasks andere unterbrechen können. Ich frage mich daher, wie der Zugriff auf gemeinsame Daten geschützt werden kann und welche Datentypen garantiert von Codesys atomar gelesen und geschrieben werden können.
Gibt es dazu irgendwelche Dokumentationen?
Vielen Dank für Informationen!
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Auch wenn das tadellos funktioniert wenn mann's richtig macht, würde ich doch versuchen diesen Fall ganz zu vermeiden.
Gruß Erik
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2013-10-01
Originally created by: 5x3sp
Hallo Erik
Ich bin mit Mutexen und Monitoren bestens Vertraut - ich komme eher von der Java/C# Programmierung, wo solche Konzepte ja z.T. direkt in die Sprache integriert sind.
Ich wollte eigenltich wissen, wie das in Codesys umgesetzt wird. Ein Sprachkonstrukt habe ich nicht gefunden. Auch in Bibliotheken wurden ich nur spärlich fündig. Ich dachte mir eigentlich, dass die Sprachdesigner von Codesys ja eigentlich so einen Konstrukt vorgesehen haben müssten, wenn sie mehrere Tasks zulassen.
Das ganz zu Vermeiden ist natürlich eine Lösung, man verschenkt dann aber den Nutzen von verschiedenen priorisierten Tasks.
Gruss
Stefan
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Spezielle Konstrukte in CoDeSys kenne ich nicht. Das muss 'von Hand' gemacht werden.
Da reicht ja aber im Normalfall ein Semaphore Flag.
Zitat:
man verschenkt dann aber den Nutzen von verschiedenen priorisierten Tasks
Nur weil man seine Daten nicht Task übergreifend benutzt heisst das ja nicht dass nicht mehrere Tasks benutzt werden,
bzw. nicht mehr sinnvoll sind.
Wir benutzen generell verschiedene Tasks mit verschiedenen Prioritäten und Zykluszeiten, versuchen aber eben nicht gleichzeitig,
bzw. überhaupt nicht, aus verschiedenen Tasks auf die selben Daten zuzugreifen.
Gruß Erik
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2013-10-03
Originally created by: 5x3sp
Hallo Eric
Ich sehe schon, wir reden von verschiedenen Standpunkten aus , ich versuch mal das Problem an einem (konkreten) Beispiel zu erläutern. Das mit Semaphore-Flag ist leider nicht in jedem Fall ausreichend, weil man keine Task damit unterbrechen kann.
Ausgangspunkt:
- Task H: Hohe Priorität, kleiner Aufrufintervall z.B. 5ms
- Task L: Kleine Priorität, kleiner Aufrufintervall z.B. 100ms
Task H ist zuständig um IO-spezifische Sachen zu erledigen, Task L für Nebenaufgaben, z.B. Kommunikation.
Problem:
Task H protokolliert IO-Signal, schreibt diese in eine Queue/Fifo, von wo sie dann in der Task L Blockweise auf Anfrage gesendet werden sollen - ähnlich einen Producer/Consumer-Muster also. Da die Queue eine geteilte Resource ist, muss der Zugriff darauf synckronisiert werden. Mit einem Sempahore-Flag kann ich nur prüfen, ob schon jemand die Queue belegt hat, aber man kann nicht warten bis diese Frei wird, dass ist aber für die Task H notwendig, da sie sonst ihre Signale nicht schreiben kann und diese damit verloren gehen.
Toll wäre es, wenn die Task H z.B. in solch einen Fall schlafengelegt werden kann, bis Task L fertig ist (typischer Mutex/Semaphore/Critical Sectioin...).
Damit keine Priority-Inversion auftreten kann, wäre es noch schön - aber nicht zwingend notwendig - wenn der gerade belegte Task automatisch höher priorisiert wird.
Natürlich ist es notwendig, dass der Code-Teil, der die Resource exklusiv belegt möglichst kurz ist, da sonst der Jitter bei der Task H zu gross werden kann.
Naja, ich habe auf jeden Fall schon keine Hoffnung mehr, das so etwas mit Codesys überhaupt geht.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Originally created by: 5x3sp
CoDeSys erlaubt die Benutzung von mehreren Tasks, wobei höher priorisierte Tasks andere unterbrechen können. Ich frage mich daher, wie der Zugriff auf gemeinsame Daten geschützt werden kann und welche Datentypen garantiert von Codesys atomar gelesen und geschrieben werden können.
Gibt es dazu irgendwelche Dokumentationen?
Vielen Dank für Informationen!
Moin
Lies mal diesen Artikel:
http://de.wikipedia.org/wiki/Mutex#Semaphor_oder_Monitor
Speziell den Abschnitt über Semaphore.
Auch wenn das tadellos funktioniert wenn mann's richtig macht, würde ich doch versuchen diesen Fall ganz zu vermeiden.
Gruß Erik
Originally created by: 5x3sp
Hallo Erik
Ich bin mit Mutexen und Monitoren bestens Vertraut - ich komme eher von der Java/C# Programmierung, wo solche Konzepte ja z.T. direkt in die Sprache integriert sind.
Ich wollte eigenltich wissen, wie das in Codesys umgesetzt wird. Ein Sprachkonstrukt habe ich nicht gefunden. Auch in Bibliotheken wurden ich nur spärlich fündig. Ich dachte mir eigentlich, dass die Sprachdesigner von Codesys ja eigentlich so einen Konstrukt vorgesehen haben müssten, wenn sie mehrere Tasks zulassen.
Das ganz zu Vermeiden ist natürlich eine Lösung, man verschenkt dann aber den Nutzen von verschiedenen priorisierten Tasks.
Gruss
Stefan
Moin
Spezielle Konstrukte in CoDeSys kenne ich nicht. Das muss 'von Hand' gemacht werden.
Da reicht ja aber im Normalfall ein Semaphore Flag.
Nur weil man seine Daten nicht Task übergreifend benutzt heisst das ja nicht dass nicht mehrere Tasks benutzt werden,
bzw. nicht mehr sinnvoll sind.
Wir benutzen generell verschiedene Tasks mit verschiedenen Prioritäten und Zykluszeiten, versuchen aber eben nicht gleichzeitig,
bzw. überhaupt nicht, aus verschiedenen Tasks auf die selben Daten zuzugreifen.
Gruß Erik
Originally created by: 5x3sp
Hallo Eric
Ich sehe schon, wir reden von verschiedenen Standpunkten aus , ich versuch mal das Problem an einem (konkreten) Beispiel zu erläutern. Das mit Semaphore-Flag ist leider nicht in jedem Fall ausreichend, weil man keine Task damit unterbrechen kann.
Ausgangspunkt:
- Task H: Hohe Priorität, kleiner Aufrufintervall z.B. 5ms
- Task L: Kleine Priorität, kleiner Aufrufintervall z.B. 100ms
Task H ist zuständig um IO-spezifische Sachen zu erledigen, Task L für Nebenaufgaben, z.B. Kommunikation.
Problem:
Task H protokolliert IO-Signal, schreibt diese in eine Queue/Fifo, von wo sie dann in der Task L Blockweise auf Anfrage gesendet werden sollen - ähnlich einen Producer/Consumer-Muster also. Da die Queue eine geteilte Resource ist, muss der Zugriff darauf synckronisiert werden. Mit einem Sempahore-Flag kann ich nur prüfen, ob schon jemand die Queue belegt hat, aber man kann nicht warten bis diese Frei wird, dass ist aber für die Task H notwendig, da sie sonst ihre Signale nicht schreiben kann und diese damit verloren gehen.
Toll wäre es, wenn die Task H z.B. in solch einen Fall schlafengelegt werden kann, bis Task L fertig ist (typischer Mutex/Semaphore/Critical Sectioin...).
Damit keine Priority-Inversion auftreten kann, wäre es noch schön - aber nicht zwingend notwendig - wenn der gerade belegte Task automatisch höher priorisiert wird.
Natürlich ist es notwendig, dass der Code-Teil, der die Resource exklusiv belegt möglichst kurz ist, da sonst der Jitter bei der Task H zu gross werden kann.
Naja, ich habe auf jeden Fall schon keine Hoffnung mehr, das so etwas mit Codesys überhaupt geht.
Moin
Doku der SysLibTasks im Anhang.
Damit kannst du Tasks zur Laufzeit stoppen/starten/pausieren/priorisieren usw...
Gruß Erik
SysLibTasks.pdf [145.08 KiB]