该多核运算符是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
.另请参考