SA0103: Acceso concurrente a datos no atómicos
Detecta si las variables no atómicas (por ejemplo, con tipo de datos) STRING, WSTRING, ARRAY, STRUCT, instancias de FB, tipos de datos de 64 bits) se utilizan en más de una tarea
Justificación: Cuando no hay sincronización durante el acceso, se pueden leer valores inconsistentes al leer en una tarea y escribir en otra tarea al mismo tiempo.
Importancia: Media
Sugerencia
Para algunos tipos de datos, especialmente los enteros de 64 bits, depende de la plataforma si el acceso es atómico o no. El análisis estático informa de un problema solo cuando el controlador no admite el acceso atómico a tipos de datos enteros de 64 bits.
Esta regla no se aplica en los siguientes casos:
Si el sistema de destino tiene una unidad de punto flotante (FPU), entonces el acceso de múltiples tareas a
LREALno se detectan las variablesSi el sistema de destino es un procesador de 64 bits o se establece la configuración de destino correspondiente para el dispositivo de destino, la regla no se aplica a los tipos de datos de 64 bits.
El proyecto contiene ambos programas, PRG1 y PRG2.
El programa PRG1 es llamado por la tarea MainTask_1. El programa PRG2 es llamado por la tarea MainTask_2.
VAR_GLOBAL
lrTest : LREAL; // Since the target system has an FPU, SA0103 does apply.
lint1 : LINT;
sTest : STRING; // SA0103
wsTest : WSTRING; // SA0103
END_VARPROGRAM PRG1
GVL.lrTest := 5.0; GVL.sTest := 'welt'; GVL.wsTest := "welt"; GVL.lint1 := 99;
PROGRAM PRG2
GVL.lrTest := 5.0; GVL.sTest := 'hallo'; GVL.wsTest := "hallo"; GVL.lint1 := 88;
Salida en el Mensajes vista:
SA0103: Acceso simultáneo a datos no atómicos 'sTest'
SA0103: Acceso simultáneo a datos no atómicos 'wsTest'