このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
関数 memset
を使用した生成コードの最適化
この例では、関数 memset
を使用して内部ストレージをクリアすることで生成コードを最適化する方法を示します。モデル コンフィギュレーション パラメーター [float と double を 0.0 に初期化するために memset を使用] を選択すると、関数 memset
は内部ストレージを整数ビット パターン 0
(全ビット オフ) にクリアします。
コンパイラとターゲットの CPU のどちらも整数ビット パターン 0
によって浮動小数点ゼロを表している場合、実行および ROM の効率性を向上させるため、このパラメーターを設定することを検討します。
メモ: コマンド ラインの値は、設定値の逆です。コマンド ラインの 'on' は設定のクリアに対応します。コマンド ラインの 'off'
は設定の選択に対応します。
最適化により、以下が実現されます。
ROM の消費を低減する。
実行速度が向上する。
モデル例
モデル MemsetOptimization
について見ていきます。
model = 'MemsetOptimization';
open_system(model);
コードの生成
コード ジェネレーターはループを使用して Constant
ブロックの値を初期化します。モデルをビルドします。
slbuild(model)
### Searching for referenced models in model 'MemsetOptimization'. ### Total of 1 models to build. ### Starting build procedure for: MemsetOptimization ### Successful completion of build procedure for: MemsetOptimization Build Summary Top model targets: Model Build Reason Status Build Duration ===================================================================================================================== MemsetOptimization Information cache folder or artifacts were missing. Code generated and compiled. 0h 0m 9.3043s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 9.7417s
最適化を行わない生成コードを表示します。以下のコード行は 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)
### Searching for referenced models in model 'MemsetOptimization'. ### Total of 1 models to build. ### Starting build procedure for: MemsetOptimization ### Successful completion of build procedure for: MemsetOptimization Build Summary Top model targets: Model Build Reason Status Build Duration ================================================================================================= MemsetOptimization Generated code was out of date. Code generated and compiled. 0h 0m 5.2148s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 5.6371s
最適化を行った生成コードを表示します。以下のコード行は 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 を使用