运算符:__COMPARE_AND_SWAP
多核运算符是 IEC 61131-3 标准的扩展。
运算符可用于实现信号量,例如保证对不同任务写入的变量的独占访问。
__COMPARE_AND_SWAP 获取指向数据类型的指针 __XWORD 变量、旧值和新值作为其输入(例如: bMutex := __COMPARE_AND_SWAP(ADR(dwSynch), dwOld, dwNew);)。新旧值也可以是数据类型 __XWORD 变量。被引用的 __XWORD 变量与旧值进行比较,如果两者相等,则写入新值。该函数的结果是 TRUE 何时可以写入新值。
提示
编译器自动替换数据类型 __XWORD 和 DWORD 在 32 位系统和 LWORD 在 64 位系统上。
这个操作是原子的,所以它不能被另一个任务中断,即使在多核平台上也是如此。
例 156. 例子
下面的例子展示了一个典型的用法。对类型的独占访问权 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