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

Syncronisationsmechanismen für Inter-Taskkommunikation

Anonymous
2013-09-23
2013-10-04
  • Anonymous - 2013-09-23

    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!

     
  • Erik Böhm - 2013-09-24

    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

     
  • 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

     
  • Erik Böhm - 2013-10-01

    Moin

    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

     
  • 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.

     
  • Erik Böhm - 2013-10-04

    Moin

    Doku der SysLibTasks im Anhang.
    Damit kannst du Tasks zur Laufzeit stoppen/starten/pausieren/priorisieren usw...

    Gruß Erik

    SysLibTasks.pdf [145.08 KiB]

     

Log in to post a comment.