Skip to main content

运算符:__COMPARE_AND_SWAP

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

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

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

提示

编译器自动替换数据类型 __XWORDDWORD 在 32 位系统和 LWORD 在 64 位系统上。

这个操作是原子的,所以它不能被另一个任务中断,即使在多核平台上也是如此。

155. 例子

下面的例子展示了一个典型的用法。对类型的独占访问权 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);
(* 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