我的 CMEX S-Function 有一个输入端口,我将其设置为没有直接馈通。但是,当我尝试在mdlUpdate
函数调用中使用来自输入端口的信号时,它会因分段违规而崩溃,并通知我最可能的原因是输入端口的直接馈通状态设置不正确。
在 mdlUpdate 中使用输入信号是否也算作直接馈通?
我的 CMEX S-Function 有一个输入端口,我将其设置为没有直接馈通。但是,当我尝试在mdlUpdate
函数调用中使用来自输入端口的信号时,它会因分段违规而崩溃,并通知我最可能的原因是输入端口的直接馈通状态设置不正确。
在 mdlUpdate 中使用输入信号是否也算作直接馈通?
对于那些将来可能会研究这个问题的人,我找到了答案。mdlUpdate
不算作直接馈通。但是,如果您尝试在第一个时间步访问输入端口信号,则会导致分段冲突(Mathworks 文档表明该错误可能因不同计算机而异)。
诀窍是用来ssIsFirstInitCond(S)
获取编译器是否在第一步,并避免在第一步中进行任何赋值。
我的代码如下所示:
#define MDL_UPDATE
#if defined(MDL_UPDATE)
static void mdlUpdate(SimStruct *S)
{UNUSED_ARG(tid);
if(!ssIsFirstInitCond(S))
{
real_T *u1 = (real_T *) ssGetInputPortSignal(S)[0];
double *P1 = (double *) ssGetPWork(S)[0];
// assign values here
}
}
#endif
另外,请注意mdlUpdate
仅在主要时间步骤中调用