S-Function 用の行優先のコードの生成
S-Function を含むモデル用の行優先コードを生成できます。既定では、コード ジェネレーターは列優先のコードを生成します。行優先のコード生成の詳細については、行列および配列のコード生成を参照してください。
S-Function を含む既存のモデルで、コンフィギュレーション パラメーターArray layoutを [Row-major
] に設定する場合、コンフィギュレーション パラメーターExternal functions compatibility for row-major code generationが有効になり、既定で [error
] に設定されます。既存のモデルをビルドしようとしても、S-Function が行優先のコード生成で既定で有効になっていないため、エラーが表示されます。[行優先コード生成の外部関数互換性] コンフィギュレーション パラメーターを使用して、行優先のコード生成用の S-Function の互換性をテストできます。
このワークフローは、モデルの C Caller ブロックにも適用可能です。
例
1. モデル例 ex_sfcn_rowmajor_unset
を開きます。モデルには、次の追加ファイルが必要です。
S-Function:
ex_sfcn_rowmajor.c
TLC:
ex_sfcn_rowmajor.tlc
これらのファイルをローカル フォルダーに保存します。
open_system('ex_sfcn_rowmajor_unset');
2. このモデルでは、[配列のレイアウト] が [Column-major
] に設定されています。行優先のコード生成を有効にするには、[配列のレイアウト] を [Row-major
] に設定します。
3. モデルをビルドすると、コード ジェネレーターはビルドを停止し、次のエラー メッセージが表示されます。
4. 続行するには、次のいずれかを行います。
モデルの行優先のコードを含む既存の S-Function をテストする場合、コンフィギュレーション パラメーター [行優先コード生成の外部関数互換性] の設定を [
warning
] または [none
] に設定します。コード ジェネレーターは、S-Function 用の行優先のコードを生成せずにビルドを完了します。行優先の配列レイアウトと互換性があるように S-Function を更新する場合、S-Function API を使用して行優先のコード生成用の S-Function を有効化します。
配列レイアウトが指定されていない S-Function 用のモデルをテストするために、モデルでモデル アドバイザー チェックを実行することもできます。[配列のレイアウトが未設定の TLC S-Function を特定] チェックをオンにして、[このチェックを実行] ボタンをクリックします。モデルに配列レイアウトが指定されていない S-Function が含まれている場合、次のような警告が表示されます。
ユーザー定義の S-Function の配列レイアウトを指定するために、SimStruct API の関数ssSetArrayLayoutForCodeGenを使用します。列挙型 SSArrayLayout
を以下に設定できます。
SS_UNSET
– この設定は、ブロックを行優先のコード生成について無効にする既定の設定です。SS_COLUMN_MAJOR
– ブロックを列優先のコード生成についてのみ指定します。SS_ROW_MAJOR
– ブロックを行優先のコード生成についてのみ指定します。SS_ALL – ブロックを配列レイアウトに関係なくコード生成できるとして指定します。
5. mdlInitializeSizes
メソッドに ssSetArrayLayoutForCodeGen
を追加して ex_sfcn_rowmajor.c
ファイルを更新します。
static void mdlInitializeSizes(SimStruct *S) { /* Specify array layout of the S-function */ ssSetArrayLayoutForCodeGen(S, SS_ROW_MAJOR); . . . }
S-Function が配列レイアウトの影響を受けない場合、SSArrayLayout
を SS_ALL
に設定します。
6. MATLAB® コマンド ウィンドウで、次のコマンドを使用して S-Function をコンパイルします。
mex ex_sfcn_rowmajor.c
Building with 'gcc'. MEX completed successfully.
7. モデルをビルドしてコードを生成するには、Ctrl+B を押します。
S-Function Builder を使用して S-Function を生成する場合、S-Function の優先方向を指定にはパラメーター [配列のレイアウト] を使用します。詳細については、Build S-Functions Automatically Using S-Function Builderを参照してください。レガシ コード ツールを使用した C 関数の統合では、legacy_code
の convertNDArrayToRowMajor
オプションを使用します。S-Function Builder およびレガシ コード ツールは、ノーマル モードでのシミュレーション中に S-Function が行優先の配列レイアウトに設定される場合、それに先立って転置を適用します。