Main Content

コードの再利用のための共有定数パラメーター

次のいずれかの条件に該当する場合には、モデル間で定数パラメーターとして生成されたコードを共有できます。

  • モデル参照階層で定数パラメーターが共有されている。

  • モデル コンフィギュレーション パラメーター共有コードの配置[共有場所] に設定されている。

共有定数を生成せずにモデル コンフィギュレーション パラメーター [共有コードの配置][共有場所] に設定されている場合、パラメーター GenerateSharedConstantsoff に設定します。たとえば、現在のモデルに対する共有定数をオフにするには、コマンド ウィンドウで以下のように入力します。

set_param(gcs,'GenerateSharedConstants','off');
モデル コンフィギュレーション パラメーター GenerateSharedConstantsoff に設定されている場合、コード ジェネレーターは、slprj/target/_sharedutils フォルダー内の const_params.c ファイル以外の共有場所にモデル参照階層モデル化で共有される定数パラメーターを生成します。コード ジェネレーターは、再利用可能ライブラリ サブシステム ファイルで個々の定数パラメーターを個別に定義します。

モデル コンフィギュレーション パラメーター GenerateSharedConstantson に設定されている場合、コード ジェネレーターは共有定数パラメーターを個別に生成し、それらをファイル const_params.c に配置します。コード ジェネレーターはそのファイルを共有ユーティリティ フォルダー slprj/target/_sharedutils に配置します。

たとえば、ある定数がモデル参照階層内部の複数の場所で使用されており、最上位モデルの名前が topmod であるとすると、共有定数のコードは次のようになります。

  • 共有ユーティリティ フォルダー slprj/grt/_sharedutils には、定数パラメーターが const_params.c に定義され、rtCP_pooled_ の末尾に一意のチェックサムが追加された名前が付けられます。

    extern const real_T rtCP_pooled_lfcjjmohiecj[7];
    const real_T rtCP_pooled_lfcjjmohiecj[7] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0 };
    
    extern const real_T rtCP_pooled_ppphohdbfcba[7];
    const real_T rtCP_pooled_ppphohdbfcba[7] = { 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0 };

  • top_model_private.h または参照モデルref_model_private.h の中では、可読性が向上するように、定数の名前は次のように変更されています。

    extern const real_T rtCP_pooled_lfcjjmohiecj[7];
    extern const real_T rtCP_pooled_ppphohdbfcba[7];
    
    #define rtCP_Constant_Value   rtCP_pooled_lfcjjmohiecj  /* Expression: [1 2 3 4 5 6 7]
                                                             * Referenced by: '<Root>/Constant'*/
    #define rtCP_Gain_Gain        rtCP_pooled_ppphohdbfcba  /* Expression: [7 6 5 4 3 2 1]
                                                             * Referenced by: '<Root>/Gain' */

  • topmod.c または refmod.c では、呼び出しサイトは次のように記述されます。

    for (i = 0; i < 7; i++) {
       topmod_Y.Out1[i] = (topmod_U.In1 + rtCP_Constant_Value[i]) * rtCP_Gain_Gain[i];
    }

コード ジェネレーターは、定数を個別の定数として共有ユーティリティ フォルダーの const_params.c ファイルに生成しようと試みます。モデルにコード ジェネレーターが直接インライン化できないパラメーター (たとえば、配列パラメーター) が含まれている場合、コードはデータを表す構造体型を定義します。この構造体は const ストレージ型修飾子を使用するため、一部のツールチェーンはアセンブリ コードをさらに最適化できます。

構造体の宣言 ConstParam_model は、次のように model.h に配置されます。

生成コードでの共有定数の抑制

コード ジェネレーターが共有定数および共有関数を作成するかどうかを選択できます。コードとデータをサブシステム間で分離できるようにしておく場合や、コードの生成中に定数の共有によりメモリ不足が発生する場合があります。

この設定を、set_paramget_param でパラメーター GenerateSharedConstants を使用してプログラムで変更できます。

次の例では、GenerateSharedConstantson に設定すると、コード ジェネレーターは定数値を _sharedutils フォルダーの const_params.c ファイルで定義します。GenerateSharedConstantsoff に設定すると、コード ジェネレーターは定数値を model_ert_rtw フォルダーの model_data.c ファイルにある非共有領域で定義します。

モデル rtwdemo_throttlecntrl を開きます。

モデル コンフィギュレーション パラメーター共有コードの配置[共有場所] に設定されていることを確認します。パラメーターが [自動] に設定されると、コード ジェネレーターは設定 GenerateSharedConstants を無視します。パラメーターの値を設定しようとすると、エラー メッセージが表示されます。既定では、値 GenerateSharedConstants が選択されます。

コマンド ウィンドウで、GenerateSharedConstantson に設定します。

>> set_param('rtwdemo_throttlecntrl','GenerateSharedConstants','on')

共有定数の定義をフォルダー slprj/grt/_sharedutils のファイル const_params.c で確認します。

extern const real_T rtCP_pooled_H4eTKtECwveN[9];
const real_T rtCP_pooled_H4eTKtECwveN[9] = { 1.0, 0.75, 0.6, 0.0, 0.0, 0.0, 0.6,
  0.75, 1.0 } ;

extern const real_T rtCP_pooled_SghuHxKVKGHD[9];
const real_T rtCP_pooled_SghuHxKVKGHD[9] = { -1.0, -0.5, -0.25, -0.05, 0.0, 0.05,
  0.25, 0.5, 1.0 } ;

extern const real_T rtCP_pooled_WqWb2t17NA2R[7];
const real_T rtCP_pooled_WqWb2t17NA2R[7] = { -1.0, -0.25, -0.01, 0.0, 0.01, 0.25,
  1.0 } ;

extern const real_T rtCP_pooled_Ygnal0wM3c14[7];
const real_T rtCP_pooled_Ygnal0wM3c14[7] = { 1.0, 0.25, 0.0, 0.0, 0.0, 0.25, 1.0
} ;

コマンド ウィンドウで、GenerateSharedConstantsoff に設定します。

>> set_param('rtwdemo_throttlecntrl','GenerateSharedConstants','off')

共有されない定数をフォルダー rtwdemo_throttlecntrl_grt_rtw のファイル rtwdemo_throttlecntrl_data.c で確認できます。

/* Constant parameters (auto storage) */
const ConstP_rtwdemo_throttlecntrl_T rtwdemo_throttlecntrl_ConstP = {
  /* Pooled Parameter (Expression: P_OutMap)
   * Referenced by:
   *   '<S2>/Proportional  Gain Shape'
   *   '<S3>/Proportional  Gain Shape'
   */
  { 1.0, 0.25, 0.0, 0.0, 0.0, 0.25, 1.0 },

  /* Pooled Parameter (Expression: P_InErrMap)
   * Referenced by:
   *   '<S2>/Proportional  Gain Shape'
   *   '<S3>/Proportional  Gain Shape'
   */
  { -1.0, -0.25, -0.01, 0.0, 0.01, 0.25, 1.0 },

  /* Pooled Parameter (Expression: I_OutMap)
   * Referenced by:
   *   '<S2>/Integral  Gain Shape'
   *   '<S3>/Integral  Gain Shape'
   */
  { 1.0, 0.75, 0.6, 0.0, 0.0, 0.0, 0.6, 0.75, 1.0 },

  /* Pooled Parameter (Expression: I_InErrMap)
   * Referenced by:
   *   '<S2>/Integral  Gain Shape'
   *   '<S3>/Integral  Gain Shape'
   */
  { -1.0, -0.5, -0.25, -0.05, 0.0, 0.05, 0.25, 0.5, 1.0 }
};

共有定数パラメーターの制限

次の場合、コード ジェネレーターはモデルに対して共有定数を生成しません。

  • モデルには、データ整列に指定されたコード置換ライブラリ (CRL) があります。

  • 定数の [メモリ セクション][MemVolatile] または [MemConstVolatile] である。

  • GenerateSharedConstants パラメーターは off に設定されます。

次の場合には、個別の定数は共有されません。

  • 定数がインラインでない S-Function によって参照されている。

  • 定数の型がユーザー定義型で、[データ スコープ][エクスポート] に設定されていない。

関連するトピック