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