Main Content

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

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

モデル例

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

  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.G2local_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_G2rtb_G1Gain ブロックの出力を保持します。ローカル変数 rtb_SwitchSwitch ブロックの出力を保持します。

/* 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 と関連するデータ コピーは生成コードに含まれていません。

参考

関連するトピック