.

运算符‘_COMPARE_AND_SWAP’

.
.

该多核运算符是IEC 61131-3标准的扩展。

该运算符可用于实现信号量,例如,以保证对不同任务写入的变量的独占访问。

__COMPARE_AND_SWAP获取指向数据类型的指针__XWORD变量,一个旧值和一个新值作为其输入(例如: bMutex := __COMPARE_AND_SWAP(ADR(dwSynch), dwOld, dwNew);)。新旧值也可以是数据类型__XWORD变量。将引用的__XWORD变量与旧值进行比较,如果两者相等,则写入新值。当可以写入新值时,函数的结果为TRUE

 

编译器会自动将数据类型__XWORD替换为32位系统上的DWORD和64位系统上的LWORD

这个操作是atomic的,因此即使在多核平台上也不能被其他任务中断。

.

.例如

以下示例显示了典型用法。应该实现对类型为STRING的变量的独占访问,该变量通过pstrOutput指针寻址。

对字符串的访问不是原子性的。如果多个任务同时写入同一字符串,则内容可能不一致。

使用此功能,现在可以在不同任务中写入相同的STRING变量。

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);  
(* 与0比较并将1写为原子性操作 *)
IF bMutex THEN                         // 如果可以完成写入,则bMutex为TRUE
    pstrOutput^ := strToWrite;         // 现在你可以安全地在字符串上写
    dwSynch := 0;                      // 这个__XWORD变量一定会被复位。
    ExclusiveStringWrite := TRUE;         // 写入成功
ELSE
    ExclusiveStringWrite := FALSE;     // 没有写入成功
END_IF