Main Content

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

NaN を整数 0 にマッピングするコードの削除

以下の例は、NaN を整数ゼロにマッピングするコードの削除方法を示します。飽和が伴う浮動小数点から整数への変換に対して、Simulink はシミュレーション中に NaN を整数ゼロに変換します。モデルに NaN の入力値が含まれる場合、コード ジェネレーターで NaN をゼロにマッピングするコードを生成するように指定できます。このコードを使用しない場合、標準 C では NaN を伴うすべての条件は false と評価されるため、シミュレーションとコード生成結果の間に不一致が生じます。

アプリケーションに NaN の入力値が存在しない場合、NaN を整数ゼロにマッピングするコードを削除できます。このコードを削除すると、生成されたコードのサイズが縮小し、処理が高速化します。

モデル例

このモデルでは、Data Type Conversion ブロックは入力信号を double から uint8 に変換します。この例では、モデルの名前は conversion_ex です。

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

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

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

  4. [整数オーバーフローで飽和] を選択します。このパラメーターを選択すると、範囲外の信号値がデータ型で表現できる最小値または最大値のいずれかと等しくなることを指定します。

  5. Data Type Conversion ブロックに接続されている信号の場合、[信号プロパティ] ダイアログ ボックスを開きます。名前 U を入力します。コード マッピング エディターの [信号] で、[ストレージ クラス] を [ImportedExtern] に設定します。

  6. Data Type Conversion ブロックから出ていく信号に対して [信号プロパティ] ダイアログ ボックスを開きます。名前 Y を入力します。コード マッピング エディターの [信号] で、[ストレージ クラス] を [ImportedExtern] に設定します。

コード生成

  1. [コンフィギュレーション パラメーター][ソルバー][ソルバー オプション][タイプ] パラメーターを [固定ステップ] に設定します。

  2. [コンフィギュレーション パラメーター][最適化][詳細設定パラメーター][NaN を 0 にマッピングする飽和で浮動小数点から整数に変換するコードを削除] パラメーターを無効にします。

  3. [コンフィギュレーション パラメーター][コード生成][レポート][コード生成レポートを作成] パラメーターと [レポートを自動的に開く] パラメーターを有効にします。

  4. [コンフィギュレーション パラメーター][コード生成][ビルド プロセス][コード生成のみ] パラメーターを有効にします。モデル ウィンドウで Ctrl+B を押します。コードの生成が完了すると、HTML コード生成レポートが開きます。

  5. コード生成レポートで nan_int_ex.c ファイルを選択し、モデルのステップ関数を表示します。NaN の入力値の場合、NaN が整数ゼロにマッピングされるため、生成されたコードとシミュレーションは一致します。

/* Model step function */
void nan_int_ex_step(void)
{
  /* DataTypeConversion: '<Root>/Data Type Conversion' incorporates:
   *  Inport: '<Root>/In1'
   */
  if (U < 256.0) {
    if (U >= 0.0) {
      Y = (uint8_T)U;
    } else {
      Y = 0U;
    }
  } else if (U >= 256.0) {
    Y = MAX_uint8_T;
  } else {
    Y = 0U;
  }

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

  1. [コンフィギュレーション パラメーター][最適化][コード生成][整数と固定小数点][範囲外の値をラップする浮動小数点から整数への変換コードを削除] パラメーターを有効にします。コードを生成します。

  2. コード生成レポートで nan_int_ex.c セクションを選択し、モデルのステップ関数を表示します。生成されたコードは NaN を 255 にマッピングし、整数ゼロにはマッピングしません。生成されたコードは、NaN を整数ゼロにマッピングする追加のコードを使用しない方が効率的ですが、生成されたコードを実行しても NaN 値に対するシミュレーションと同じ結果は得られません。

/* Model step function */
void nan_int_ex_step(void)
{
  /* DataTypeConversion: '<Root>/Data Type Conversion' incorporates:
   *  Inport: '<Root>/In1'
   */
  if (U < 256.0) {
    if (U >= 0.0) {
      Y = (uint8_T)U;
    } else {
      Y = 0U;
    }
  } else {
    Y = MAX_uint8_T;
  }
 
  /* End of DataTypeConversion: '<Root>/Data Type Conversion' */

参考

関連するトピック