直接フィードスルーを持たないように設定した CMEX S-Function への入力ポートがあります。ただし、mdlUpdate
関数呼び出しで入力ポートからの信号を使用しようとすると、セグメンテーション違反でクラッシュし、最も可能性の高い原因は入力ポートの直接フィードスルー ステータスの設定が正しくないことであることが通知されます。
mdlUpdate ALSO での入力信号の使用は直接フィードスルーとしてカウントされますか?
直接フィードスルーを持たないように設定した CMEX S-Function への入力ポートがあります。ただし、mdlUpdate
関数呼び出しで入力ポートからの信号を使用しようとすると、セグメンテーション違反でクラッシュし、最も可能性の高い原因は入力ポートの直接フィードスルー ステータスの設定が正しくないことであることが通知されます。
mdlUpdate ALSO での入力信号の使用は直接フィードスルーとしてカウントされますか?
将来この質問を検討する可能性がある人のために、答えを見つけました。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
また、はメジャー タイム ステップでのみ呼び出されることに注意してください。