生成されたコードにおけるローカル ブロック出力の有効化と再利用
以下の例では、ブロック出力をローカル変数として指定する方法を示します。コード ジェネレーターはこれらのローカル変数を生成されたコードで再利用できる可能性があります。ブロック出力をローカル変数として宣言すると、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 と関連するデータ コピーは生成コードに含まれていません。