メインコンテンツ

生成されたコードにおけるローカル ブロック出力の有効化と再利用

R2026b

以下の例では、ブロック出力をローカル変数として指定する方法を示します。コード ジェネレーターはこれらのローカル変数を生成されたコードで再利用できる可能性があります。ブロック出力をローカル変数として宣言すると、ROM 消費量を節約します。ローカル変数を再利用すると、RAM 消費量を節約し、データ コピーを減らし、実行速度が上がります。

モデル例

  1. Inport ブロック、Outport ブロック、Gain ブロックおよび Switch ブロックを使用して、以下のモデルを作成します。この例では、モデルの名前は local_variable_ex です。

    Model containing one input that feeds three signals. The first signal feeds Gain block G2, which is the first input to a Switch. The second signal from the input is the control signal for the Switch. The third signal feeds a Gain block G1, which is the second input to the Switch. The Switch feeds the output Out1.

  2. G2 の場合、Gain ブロック パラメーター ダイアログ ボックスを開きます。2 の値を入力します。

  3. G1 に対して、3 の値を入力します。

  4. Switch に対して、[ブロック パラメーター] ダイアログ ボックスを開きます。[1 番目の入力が通過する条件] パラメーターで、[u2 >= しきい値] を選択します。

最適化を使用しないコードの生成

  1. [モデル コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[ソルバー] ペインを選択します。[タイプ] パラメーターに対し、[固定ステップ] を選択します。

  2. [コンフィギュレーション パラメーター] 、 [信号ストレージの再利用] チェック ボックスをオフにします。

  3. [コード生成]、[レポート] ペインを選択し、[コード生成レポートを作成] を選択します。

  4. [コード生成] ペインを選択します。[コード生成のみ] を選択してから、モデル ウィンドウで Ctrl+B を押します。コードの生成が完了すると、HTML コード生成レポートが開きます。

  5. コード生成レポートで local_variable_ex.c セクションを選択し、モデルのステップ関数を表示します。Gain ブロック出力は、グローバル変数 local_variable_ex_B.G2 と local_variable_ex_B.G1 です。

/* Model step function */
void local_variable_ex_step(void)
{
  /* Switch: '<Root>/Switch' incorporates:
   *  Inport: '<Root>/In1'
   */
  if (local_variable_ex_U.In1 >= 0.0) {
    /* Gain: '<Root>/G2' */
    local_variable_ex_B.G2 = 2.0 * local_variable_ex_U.In1;

    /* Outport: '<Root>/Out1' */
    local_variable_ex_Y.Out1 = local_variable_ex_B.G2;
  } else {
    /* Gain: '<Root>/G1' */
    local_variable_ex_B.G1 = 3.0 * local_variable_ex_U.In1;

    /* Outport: '<Root>/Out1' */
    local_variable_ex_Y.Out1 = local_variable_ex_B.G1;
  }

  /* End of Switch: '<Root>/Switch' */

ローカル ブロック出力の有効化とコードの生成

  1. [コンフィギュレーション パラメーター] 、 [信号ストレージの再利用] パラメーターを選択します。[信号ストレージの再利用] は以下の最適化パラメーターを有効にします。

    • ローカルなブロックの出力を有効にする

    • ローカル ブロック出力の再利用

    • 余分なローカル変数の削除 (式の畳み込み)

  2. [信号ストレージの再利用] と [余分なローカル変数の削除 (式の畳み込み)] をオフにします。

  3. コードを生成しモデルのステップ関数を表示します。最適化パラメーター [ローカルなブロックの出力を有効にする] を選択したため、モデルのステップ関数には 3 つのローカル変数があります。ローカル変数 rtb_G2 と rtb_G1 は Gain ブロックの出力を保持します。ローカル変数 rtb_Switch は Switch ブロックの出力を保持します。

/* Model step function */
void local_variable_ex_step(void)
{
  real_T rtb_Switch;
  real_T rtb_G2;
  real_T rtb_G1;

  /* Switch: '<Root>/Switch' incorporates:
   *  Inport: '<Root>/In1'
   */
  if (local_variable_ex_U.In1 >= 0.0) {
    /* Gain: '<Root>/G2' */
    rtb_G2 = 2.0 * local_variable_ex_U.In1;
    rtb_Switch = rtb_G2;
  } else {
    /* Gain: '<Root>/G1' */
    rtb_G1 = 3.0 * local_variable_ex_U.In1;
    rtb_Switch = rtb_G1;
  }

  /* End of Switch: '<Root>/Switch' */

  /* Outport: '<Root>/Out1' */
  local_variable_ex_Y.Out1 = rtb_Switch;

ローカル ブロック出力の再利用とコードの生成

  1. [コンフィギュレーション パラメーター] 、 [ローカル ブロック出力の再利用] パラメーターを選択します。

  2. コードを生成します。local_variable_ex.c セクションで、モデルのステップ関数を表示します。コード ジェネレーターが 3 回使用するローカル変数 rtb_G2 が 1 つあります。

/* Model step function */
void local_variable_ex_step(void)
{
  real_T rtb_G2;

  /* Switch: '<Root>/Switch' incorporates:
   *  Inport: '<Root>/In1'
   */
  if (local_variable_ex_U.In1 >= 0.0) {
    /* Gain: '<Root>/G2' */
    rtb_G2 = 2.0 * local_variable_ex_U.In1;
  } else {
    /* Gain: '<Root>/G1' */
    rtb_G2 = 3.0 * local_variable_ex_U.In1;
  }

  /* End of Switch: '<Root>/Switch' */

  /* Outport: '<Root>/Out1' */
  local_variable_ex_Y.Out1 = rtb_G2;

余分な一時変数 rtb_Switch と関連するデータ コピーは生成コードに含まれていません。

参考

トピック