Opérateur : TEST_AND_SET
L'opérateur multicœur est une extension de la norme CEI 61131-3.
L'opérateur peut être utilisé pour implémenter un sémaphore, par exemple pour garantir un accès exclusif à une variable écrite par différentes tâches.
TEST_AND_SET
obtient un type DWORD
variable comme entrée. L'accès en écriture à cette variable doit être possible. La variable est définie sur 1
et la valeur précédente est renvoyée comme résultat.
L'opération est atomique, ce qui signifie qu'elle ne peut pas être interrompue par une autre tâche. Cela s'applique également aux plates-formes multicœurs.
Par exemple, l'appel dans le programme est dwOldValue := TEST_AND_SET(dw);
, dans laquelle les variables dwOldValue
et dw
doit être du type de données DWORD
.
L'exemple suivant montre une utilisation typique. Accès exclusif à un type STRING
variable, qui est adressée via la pstrOutput
pointeur, doit être implémenté. L'accès à une chaîne n'est pas atomique. Si plusieurs tâches écrivent dans la même chaîne en même temps, le contenu peut être incohérent. Avec le TEST_AND_SET
fonction, il est maintenant possible d'écrire la même STRING
variable dans différentes tâches.
FUNCTION ExclusiveStringWrite : BOOL VAR_INPUT strToWrite : STRING; pstrOutput : POINTER TO STRING; END_VAR VAR_STAT dwSynch : DWORD; END_VAR VAR dwOldValue: DWORD; END_VAR dwOldValue := TEST_AND_SET(dwSynch); // Write the 1 and read the old value at the same time IF dwOldValue = 0 THEN // 0 means: no other task is currently writing pstrOutput^ := strToWrite; // Now you can write safely on the string dwSynch := 0; // The DWORD must be reset ExclusiveStringWrite := TRUE; // Writing was successful ELSE ExclusiveStringWrite := FALSE; // Writing was not successful END_IF