gpt4 book ai didi

c - 如何在 Codesys v3 中创建指向函数的指针

转载 作者:行者123 更新时间:2023-11-30 18:15:00 33 4
gpt4 key购买 nike

您能给我一个示例,说明如何在我的库中声明函数指针吗?如何将函数指针传递给外部库?

最佳答案

TL;DR:CoDeSys v3 中的手提包成为可能,而且非常简单。

在 CoDeSys 中,“函数”实际上是存储在函数表中的函数指针。

在 CodeSys v2 中,要获取函数的地址,您必须使用 INDEXOF(F_MyFunction) ,这提供了函数指针在函数表中的索引。获取表的地址,呃,对读者来说是一项练习(可以通过一些体操来检索它)。

在 CoDeSys v3 中,ADR代替 INDEXOF 工作,因此 ADR(F_MyFunction)给出指向 F_MyFunction 的函数指针的地址的代码!

猜猜看:您可以设置该函数指针,并且 F_MyFunction(...)只是通过该函数指针进行调用。

就这么简单。

因此,要进行间接函数调用,您所需要做的就是声明一个虚拟“函数”,它实际上就像一个可设置的函数指针!

假设我们有两个要间接调用的目标函数:

FUNCTION F_Add1: INT
VAR_INPUT
param : INT;
END_VAR
F_Add1:= param + 1;
END_FUNCTION

FUNCTION F_Add2: INT
VAR_INPUT
param : INT;
END_VAR
F_Add2:= param + 2;
END_FUNCTION

然后我们定义一个“函数指针”,它必须与间接调用的函数具有相同的签名:

FUNCTION FPTR_Add : INT
VAR_INPUT
param : INT;
END_VAR
END_FUNCTION

我们还可以有一个分配给函数指针的助手:

F_FPTR_Assign
VAR_INPUT
dst : POINTER TO PVOID;
src : POINTER TO PVOID;
END_VAR
dst^ := src^;
END_FUNCTION

最后,让我们进行一些间接调用:

// should return 3 if indirect calls work
FUNCTION F_Test : INT
VAR
val : INT;
END_VAR

F_FPTR_Assign(ADR(FPTR_Add), ADR(F_Add1));

// FPTR_Add points to F_Add1
val := FPTR_Add(val);
// here val has value 1

F_FPTR_Assign(ADR(FPTR_Add), ADR(F_Add2));

// FPTR_Add points to F_Add2
val := FPTR_Add(val);
// here val has value 3

F_Test := val;

END_FUNCTION

此方法的唯一缺点是调试器不会检查函数指针的动态值,因此步入的行为类似于跳过。解决方法是在目标函数中设置断点,然后 step intostep over 都会停在那里。

还有其他方法可以实现此效果,例如通过直接操作堆栈帧,因此即使这种方法由于 CoDeSys 中的某些更改而停止工作,也有其他方法可以实现。

关于c - 如何在 Codesys v3 中创建指向函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43139073/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com