Operatore: __COMPARE_AND_SWAP
L'operatore multicore è un'estensione della norma IEC 61131-3.
L'operatore può essere utilizzato per implementare un semaforo, ad esempio per garantire l'accesso esclusivo a una variabile scritta da diversi task.
__COMPARE_AND_SWAP
ottiene un puntatore a un tipo di dati __XWORD
variabile, un vecchio valore e un nuovo valore come input (esempio: bMutex := __COMPARE_AND_SWAP(ADR(dwSynch), dwOld, dwNew);
). I vecchi e i nuovi valori possono anche essere tipo di dati __XWORD
variabili. Il referenziato __XWORD
la variabile viene confrontata con il vecchio valore e se entrambi sono uguali, viene scritto il nuovo valore. Il risultato della funzione è TRUE
quando è possibile scrivere il nuovo valore.
Suggerimento
Il compilatore sostituisce automaticamente il tipo di dati __XWORD
con DWORD
su sistemi a 32 bit e LWORD
su sistemi a 64 bit.
Questa operazione è atomica, quindi non può essere interrotta da un'altra attività, anche su piattaforme multicore.
L'esempio seguente mostra un utilizzo tipico. Accesso esclusivo a un tipo STRING
variabile, che viene indirizzata tramite il pstrOutput
puntatore, dovrebbe essere implementato.
L'accesso a una stringa non è atomico. Se più attività scrivono contemporaneamente sulla stessa stringa, il contenuto potrebbe essere incoerente.
Con questa funzione è ora possibile scrivere la stessa variabile STRING in task diversi.
FUNCTION ExclusiveStringWrite : BOOL VAR_INPUT strToWrite : STRING; pstrOutput : POINTER TO STRING; END_VAR VAR_STAT dwSynch : __XWORD; END_VAR VAR bMutex: BOOL; END_VAR bMutex:= __COMPARE_AND_SWAP(ADR(dwSynch), 0, 1); (* compare with 0 and write 1 as atomic operation *) IF bMutex THEN // bMutex is TRUE if write could be done pstrOutput^ := strToWrite; // Now you can write safely on the string dwSynch := 0; // The __XWORD variable must be reset. ExclusiveStringWrite := TRUE; // Writing was successful ELSE ExclusiveStringWrite := FALSE; // Writing was not successful END_IF