このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
関数 memset
を使用した生成コードの最適化
この例では、関数 memset
を使用して内部ストレージをクリアすることで生成コードを最適化する方法を示します。モデル コンフィギュレーション パラメーター [float と double を 0.0 に初期化するために memset を使用] を選択すると、関数 memset
は内部ストレージを整数ビット パターン 0
(全ビット オフ) にクリアします。
コンパイラとターゲットの CPU のどちらも整数ビット パターン 0
によって浮動小数点ゼロを表している場合、実行および ROM の効率性を向上させるため、このパラメーターを設定することを検討します。
メモ: コマンド ラインの値は、設定値の逆です。コマンド ラインの 'on' は設定のクリアに対応します。コマンド ラインの 'off'
は設定の選択に対応します。
最適化により、以下が実現されます。
ROM の消費を低減する。
実行速度が向上する。
モデル例
モデル MemsetOptimization
について見ていきます。
model = 'MemsetOptimization';
open_system(model);
コードの生成
コード ジェネレーターはループを使用して Constant
ブロックの値を初期化します。モデルをビルドします。
slbuild(model)
### Starting build procedure for: MemsetOptimization ### Successful completion of build procedure for: MemsetOptimization Build Summary Top model targets built: Model Action Rebuild Reason ==================================================================================================== MemsetOptimization Code generated and compiled. Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 12.18s
最適化を行わない生成コードを表示します。以下のコード行は MemsetOptimization.c
にあります。
cfile = fullfile('MemsetOptimization_grt_rtw','MemsetOptimization.c'); coder.example.extractLines(cfile,'/* Model initialize function */',... '/* Model terminate function */',1,0);
/* Model initialize function */ void MemsetOptimization_initialize(void) { /* Registration code */ /* initialize error status */ rtmSetErrorStatus(MemsetOptimization_M, (NULL)); /* external outputs */ { int32_T i; for (i = 0; i < 50; i++) { MemsetOptimization_Y.Out1[i] = 0.0; } } { int32_T i; /* ConstCode for Outport: '<Root>/Out1' */ for (i = 0; i < 50; i++) { MemsetOptimization_Y.Out1[i] = 56.0; } /* End of ConstCode for Outport: '<Root>/Out1' */ } }
最適化の有効化
[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。
[コンフィギュレーション パラメーター] ダイアログ ボックスで [float と double を 0.0 に初期化するために memset を使用] パラメーターを選択します。代わりに、コマンド ライン API を使用して最適化を有効にできます。
set_param(model,'InitFltsAndDblsToZero','off');
最適化を使用したコードの生成
コード ジェネレーターは関数 memset
を使用して、Constant
ブロックの値を初期化します。
モデルを作成します。
slbuild(model)
### Starting build procedure for: MemsetOptimization ### Successful completion of build procedure for: MemsetOptimization Build Summary Top model targets built: Model Action Rebuild Reason =================================================================================== MemsetOptimization Code generated and compiled. Generated code was out of date. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 9.6767s
最適化を行った生成コードを表示します。以下のコード行は MemsetOptimization.c
にあります。
coder.example.extractLines(cfile,'/* Model initialize function */',... '/* Model terminate function */',1,0);
/* Model initialize function */ void MemsetOptimization_initialize(void) { /* Registration code */ /* initialize error status */ rtmSetErrorStatus(MemsetOptimization_M, (NULL)); /* external outputs */ (void)memset(&MemsetOptimization_Y, 0, sizeof(ExtY_MemsetOptimization_T)); { int32_T i; /* ConstCode for Outport: '<Root>/Out1' */ for (i = 0; i < 50; i++) { MemsetOptimization_Y.Out1[i] = 56.0; } /* End of ConstCode for Outport: '<Root>/Out1' */ } }
参考
float と double を 0.0 に初期化するために memset を使用