Hinweise zur Verwendung der Funktion „SemaphoreMutualExclusion“

Einschränkungen bei der Verwendung

HINWEIS: eine nicht sachgemäße Anwendung kann dazu führen, dass die Ausführung einer/mehrer Tasks dauerhaft gestoppt wird! Es können Zykluszeitüberschreitungen und schwere Zykluszeitüberschreitungen auftreten!

Beachten Sie bitte die nachstehenden Hinweise.

Die von der Funktionsgruppe SemaphoreMutalExclusion bereitgestellten Semaphore dürfen nur in einfachen Fällen eines „gegenseitigen Ausschlusses“ (gegenseitiger Zugriffsausschluss) verwendet werden, um kurze Abschnitte kritischen Codes zu decken (im Folgenden kurz als kritische Bereiche bezeichnet).

Die Funktionen dürfen nur von technischem Personal verwendet werden, das mit den Gefahren von Semaphoren und Multitasking vertraut ist.

Kein Halten von Semaphoren über das Ende eines Taskzyklus hinaus:

Die Funktionen sind nur für Fälle geeignet, in denen Take() und Give() im gleichen Zyklus ausgeführt werden. Es ist nicht erlaubt, eine Semaphore über das Ende eines Zyklus hinaus zu halten (über Take()).

Die Funktionen dürfen nur genutzt werden in Fällen, die folgendermaßen strukturiert sind:

// Code, which is not critical
   Take();
   // Do something critical. Should not take to long
   Give(); // No IF, ELSE or other conditions! Always execute Give()
// Code, which is not critical

Die Ausführungszeit für kritische Bereiche zwischen Take() und Give() muss so kurz wie möglich gehalten werden.

Der verschachtelte Zugriff auf Semaphore ist aus folgenden Gründen verboten:

Der verschachtelte Zugriff Task1: Take(A), Take(B); Task2: Take(B), Take(A) auf mehr als eine Semaphore kann zu einer permanenten Blockierung (Deadlock) von 2 oder mehr Tasks führen, wenn die Semaphore nicht immer in derselben Reihenfolge reserviert werden.

Die verschachtelte Nutzung von Semaphoren, in Kombination mit der Option SEM_INVER­SION_SAFE, führt dazu, dass eine Task eine höhere Priorität (die Priorität der Task mit der höchsten Priorität, die an einer ihrer Semaphoren wartet) solange beibehält, bis sie die letzte von ihr gehaltene Semaphore freigibt.

Nutzung von Systemfunktionen oder anderen Funktionen innerhalb von kritischen Bereichen:

Es ist einer Task nicht gestattet, innerhalb eines kritischen Bereichs Systemfunktionen aufzurufen. Die Systemfunktionen könnten ihrerseits wiederum Semaphore nutzen, was schlussendlich dazu führen könnte, dass die Task bis zur Freigabe ihrer letzten Semaphore eine extrem hohe Priorität besitzt (siehe verschachtelte Nutzung weiter oben). Der Aufruf anderer Funktionen sollte ebenfalls vermieden werden, da nicht garantiert werden kann, dass die Funktionen nicht intern Semaphore verwenden. Das gilt auch für die Parameter von Objekten in der SPS-Konfiguration.