Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

範囲外の値をラップする浮動小数点から整数への変換コードを削除

この例では、範囲外の浮動小数点から整数への変換のコードを削除する方法を示します。このコードを使用しない場合、シミュレーションとコード生成の結果の間に不一致が生じる可能性があります。標準 C は範囲外の浮動小数点から整数への変換の動作を定義しませんが、これらの変換はシミュレーション中に適切に定義されます。標準 C およびシミュレーション中は、浮動小数点から整数への変換は、出力型の範囲内での入力値に対して適切に定義されます。

アプリケーションにおける入力値が出力型の範囲にある場合、範囲外の浮動小数点から整数への変換コードを削除します。このコードを削除すると、生成されたコードのサイズが縮小し、処理が高速化します。

モデル例

このモデルでは、Data Type Conversion ブロックは入力信号を double から uint8 に変換します。uint8 は 0 から 255 までの値をサポートできます。入力信号にこの範囲外の値がある場合、範囲外の変換が行われます。この例では、モデルの名前は conversion_ex です。

  1. Inport ブロック、Outport ブロックおよび Data Type Conversion ブロックを使用して、モデル例を作成します。

  2. Inport ブロック パラメーター ダイアログ ボックスを開き、[信号属性] タブを選択します。[データ型] パラメーターに対し、[double] を選択します。

  3. [データ型の変換] ダイアログ ボックスを開きます。[出力データ型] パラメーターに対し、[uint8] を選択します。

  4. Simulink Coder アプリを開きます。Embedded Coder のライセンスがある場合は、Embedded Coder アプリを開きます。

  5. [コード インターフェイス][個々の要素コードのマッピング] を選択します。

  6. [コード マッピング - C][入力端子] タブで、ストレージ クラスを ImportedExtern に設定します。

  7. プロパティ インスペクターの [コード] セクションで、[Identifier]Inport などの名前を割り当てます。

  8. [コード マッピング - C][出力端子] タブで、ストレージ クラスを ImportedExtern に設定します。

  9. プロパティ インスペクターの [コード] セクションで、[Identifier]Outport などの名前を割り当てます。

最適化を使用しないコードの生成

  1. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[ソルバー] ペインで、[タイプ] パラメーターに対して [固定ステップ] を選択します。

  2. [コード生成]、[レポート] ペインで、[コード生成レポートを作成][レポートを自動的に開く] を選択します。

  3. [コード生成] ペインで、[コード生成のみ] を選択してから、モデル ウィンドウで Ctrl+B を押します。コードの生成が完了すると、HTML コード生成レポートが開きます。

  4. コード生成レポートで conversion_ex.c ファイルを選択し、モデルのステップ関数を表示します。コード ジェネレーターは、範囲外の結果を処理するために、関数 fmod を適用します。

void conversion_ex_step(void)
{
  real_T tmp;

  /* DataTypeConversion: '<Root>/Data Type Conversion' incorporates:
   *  Inport: '<Root>/Input'
   */
  tmp = floor(Inport);
  if (rtIsNaN(tmp) || rtIsInf(tmp)) {
    tmp = 0.0;
  } else {
    tmp = fmod(tmp, 256.0);
  }

  /* Outport: '<Root>/Out1' incorporates:
   *  DataTypeConversion: '<Root>/Data Type Conversion'
   */
  Outport = (uint8_T)(tmp < 0.0 ? (int32_T)(uint8_T)-(int8_T)(uint8_T)-tmp :
                      (int32_T)(uint8_T)tmp);
}

最適化を使用したコードの生成

  1. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[最適化] ペインで、[範囲外の値をラップする浮動小数点から整数への変換コードを削除] を選択します。コードを生成します。

  2. コード生成レポートで conversion_ex.c ファイルを選択し、モデルのステップ関数を表示します。生成されたコードには範囲外の値を防止するコードは含まれません。

    void conversion_ex_step(void)
    {
      /* Outport: '<Root>/Out1' incorporates:
       *  DataTypeConversion: '<Root>/Data Type Conversion'
       *  Inport: '<Root>/Input'
       */
      Outport = (uint8_T)Inport;
    }

生成されたコードはこの保護コードを使用しない方が効率的ですが、生成されたコードを実行しても 0 から 255 の範囲にない値に対するシミュレーションと同じ結果が得られない可能性があります。

参考

関連するトピック