运算符:__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 位系统上。
这个操作是原子的,所以它不能被另一个任务中断,即使在多核平台上也是如此。
例 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