gpt4 book ai didi

c - Simulink:如何在 2 级 s 函数中使用局部变量?

转载 作者:太空宇宙 更新时间:2023-11-04 08:38:48 25 4
gpt4 key购买 nike

我用 C 编写了一个 Simulink S-Function(级别 2)。生成的模块有一个输出和一个参数。此参数存储在一个变量中,该变量在设置 block 后立即在文件范围内定义:

#define NUM_PARAMS 1
#define NUM_INPORTS 0
#define NUM_OUTPORTS 1

unsigned short int MASK_INDEX;

我在 mdlInitializeSizes 中分配它,并对它的值进行一些操作:

static void mdlInitializeSizes(SimStruct *S) {  
// Check Parameters
ssSetNumSFcnParams(S, NUM_PARAMS);
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
return;
}

MASK_INDEX = *mxGetPr(ssGetSFcnParam(S, 0));

(...) operations
}

我的问题是,变量 MASK_INDEX 似乎是全局的,并且在所有相同类型的 block 之间共享。因此,它对所有 block 都具有相同的值。

作为一种解决方法,我每次都重新加载它,并重新进行操作,例如:

static void mdlOutputs(SimStruct *S, int_T tid) {
MASK_INDEX = *mxGetPr(ssGetSFcnParam(S, 0));

(...) operations
}

我怎样才能得到一个真正的“局部变量”,这样我就不必每次都重复这一切?

最佳答案

您没有提到您声明 MASK_INDEX 的位置,但从您的描述来看,它听起来像是在文件范围内。如果是这样,那么是的,这个变量将在所有实例之间共享。这在任何方面都与 S-Functions 无关,这是大多数(如果不是全部)平台上的共享库的行为方式。共享库的单个实例将由应用程序加载,在本例中为 MATLAB;因此只有一个全局变量副本。

最简单的选择是每次要访问参数时都使用ssGetSFcnParam。如果您深入研究那些 S-Function 宏,它们只是访问 SimStruct 的字段,因此重复访问不太可能导致性能下降。我什至看到宏被用来包装常见的用例,例如您的用例。

如果你真的想缓存对话框参数,最简单的方法可能是使用 ssSetUserData .声明一个包含 MASK_INDEX 成员的 struct(您没有使用 struct 但这种方法更可扩展)。在 mdlStart 中使用 mxMalloc 动态分配实例,并将其分配给 block 的用户数据。确保设置 SS_OPTION_CALL_TERMINATE_ON_EXITssSetOptions 中调用 mdlInitializeSizes。然后定义 mdlTerminate 函数,您将在其中使用 ssGetUserDatamxFree 访问分配的 struct。现在您可以使用 ssGetUserData 访问 mdlOutputs 中的 struct 成员。

还有其他更高级的选项,例如 work vectors , 可能是 PWork vector .

另一个选项,如果您的参数是可调的,则使用 runtime parameters ,它允许您缓存并可选择转换 block 的对话框参数。

在你的情况下,我只是坚持每次在 mdlOutputs 中使用 ssGetSFcnParam

关于c - Simulink:如何在 2 级 s 函数中使用局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24822336/

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