Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

関数 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 19.714s

最適化を行わない生成コードを表示します。以下のコード行は 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' */
  }
}

最適化の有効化

  1. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。

  2. [コンフィギュレーション パラメーター] ダイアログ ボックスで [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 14.037s

最適化を行った生成コードを表示します。以下のコード行は 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' */
  }
}

参考

関連するトピック