Frage:
Wie kann man mit Hilfe von
Semaphoren die Dateninkonsistenz von 32-Bit Variablen vermeiden?
Antwort:
In dem Augenblick, in dem z. B. in einem niederprioren Task einer globalen 32-Bit Variablen ein Wert zugewiesen wird, kann ein höherpriorer Task den Niederprioren unterbrechen. Greift die höherpriore Task auf diese globale Variable zu, dann ist das Ergebnis aufgrund des, in der niederprioren Task unterbrochenen Schreibzugriffs nicht korrekt (Dateninkonsistenz).
Nur bei Variablen mit Datentypen größer 16-Bit (z. B. DWORD, REAL, Strukturen,...) kann der Schreib- bzw. Lese-Zugriff durch einen höheren Task unterbrochen werden, wodurch das Problem der Dateninkonsistenz auftreten kann.
Das Problem der Dateninkonsistenz kann dadurch gelöst werden, indem der Lese- bzw. Schreibzugriff verhindert wird, solange in einem anderen Task diese globale Variable beschrieben wird. Die folgende SPS-Logik (in strukturiertem Text) zeigt exemplarisch diese Funktion:
Variable
g_bSema ist als eine globale, boolesche Variable deklariert.
Variable
g_dnVar ist als globale 32-Bit Variable deklariert.
Task 1 (niederpriorer Task):
g_bSema:=TRUE; (*Aktiviere Semaphore *)
g_dnVar:=11111; (*Schreibzugriff auf globale 32-Bit Variable*)
g_bSema:=FALSE; (*Deaktiviere Semaphore *)
Task 2 (höherpriore Task):
(*Lesezugriff auf globale Variable ist nur erlaubt, wenn die*)
(*Semaphore nicht aktiv ist, ansonsten bleibt der alte Wert *)
(*erhalten. *)
IF (g_bSema = FALSE) THEN
dnVarLocal:=g_dnVar;
END_IF