生成されたコードにおけるローカル ブロック出力の有効化と再利用
以下の例では、ブロック出力をローカル変数として指定する方法を示します。コード ジェネレーターはこれらのローカル変数を生成されたコードで再利用できる可能性があります。ブロック出力をローカル変数として宣言すると、ROM 消費量を節約します。ローカル変数を再利用すると、RAM 消費量を節約し、データ コピーを減らし、実行速度が上がります。
モデル例
Inport ブロック、Outport ブロック、Gain ブロックおよび Switch ブロックを使用して、以下のモデルを作成します。この例では、モデルの名前は
local_variable_ex
です。G2
の場合、Gain ブロック パラメーター ダイアログ ボックスを開きます。2
の値を入力します。G1
に対して、3
の値を入力します。Switch に対して、[ブロック パラメーター] ダイアログ ボックスを開きます。[1 番目の入力が通過する条件] パラメーターで、
[u2 >= しきい値]
を選択します。
最適化を使用しないコードの生成
[モデル コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[ソルバー] ペインを選択します。[タイプ] パラメーターに対し、
[固定ステップ]
を選択します。[コンフィギュレーション パラメーター] 、 [信号ストレージの再利用] チェック ボックスをオフにします。
[コード生成]、[レポート] ペインを選択し、[コード生成レポートを作成] を選択します。
[コード生成] ペインを選択します。[コード生成のみ] を選択してから、モデル ウィンドウで Ctrl+B を押します。コードの生成が完了すると、HTML コード生成レポートが開きます。
コード生成レポートで
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' */
ローカル ブロック出力の有効化とコードの生成
[コンフィギュレーション パラメーター] 、 [信号ストレージの再利用] パラメーターを選択します。[信号ストレージの再利用] は以下の最適化パラメーターを有効にします。
ローカルなブロックの出力を有効にする
ローカル ブロック出力の再利用
余分なローカル変数の削除 (式の畳み込み)
[信号ストレージの再利用] と [余分なローカル変数の削除 (式の畳み込み)] をオフにします。
コードを生成しモデルのステップ関数を表示します。最適化パラメーター [ローカルなブロックの出力を有効にする] を選択したため、モデルのステップ関数には 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;
ローカル ブロック出力の再利用とコードの生成
[コンフィギュレーション パラメーター] 、 [ローカル ブロック出力の再利用] パラメーターを選択します。
コードを生成します。
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
と関連するデータ コピーは生成コードに含まれていません。