Operador: TEST_AND_SET
El operador multinúcleo es una extensión del estándar IEC 61131-3.
El operador se puede utilizar para implementar un semáforo, por ejemplo, para garantizar el acceso exclusivo a una variable escrita por diferentes tareas.
TEST_AND_SET
obtiene una variable de tipo como entrada DWORD
. El acceso de escritura debe ser posible para esta variable. La variable estará encendida 1
se establece y el valor anterior se devuelve como resultado.
La operación es atómica, lo que significa que no puede ser interrumpida por otra tarea. Esto también se aplica a las plataformas multinúcleo.
La llamada en el programa es por ejemplo dwOldValue := TEST_AND_SET(dw);
, donde las variables dwOldValue
y dw
del tipo de datos DWORD
tiene que ser.
El siguiente ejemplo muestra un uso típico. Debe haber acceso exclusivo a una variable de tipo STRING
implementado a través del puntero pstrOutput
está dirigido. Acceder a una cadena no es atómico. Si varias tareas escriben en la misma cadena al mismo tiempo, el contenido puede ser inconsistente. con la función TEST_AND_SET
ahora es posible usar el mismo en diferentes tareas STRING
-Escribir variables.
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