ドキュメンテーション センター

  • 評価版
  • 製品アップデート

目次

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

生成されたコードの最適化

ROM の消費またはモデル実行時間の低減

ヒント

ROM を減らす

モデルの実行時間を短縮する

データ型の語長の制限

はい

はい

固定小数点スケーリングとバイアスの併用の回避

はい

はい

無限大方向またはシンプルに丸める

はい

はい

カスタム ストレージ クラスの使用の制限

はい

いいえ

等間隔ではないルックアップ テーブルの使用の制限

はい

はい

類似した固定小数点ユーティリティ関数を最小限に抑える

はい

いいえ

正味勾配補正の処理

モデルの設定、コンパイラ、およびターゲット ハードウェアによって異なります

モデルの設定、コンパイラ、およびターゲット ハードウェアによって異なります

指定された最小値および最大値を使用した生成コードの最適化

はい

はい

データ型の語長の制限

可能であれば、モデルのデータ型の語長をターゲット マイクロコントローラーの整数サイズ以下になるように制限します。これにより、マイクロコントローラーの数学的命令が少なくなり、ROM とモデルの実行時間が低減されます。

これは、グローバル RAM を消費するグローバル変数への適用を強く推奨します。たとえば、Unit Delay ブロックには離散状態があり、語長がそれぞれの入出力信号と同じです。これらの離散状態はグローバル RAM を消費するグローバル変数で、多くの組み込みシステムではめったにないリソースです。

CPU レジスタまたはスタックの位置を短時間使用するだけの一時変数では、long が消費する容量はあまり重要ではありません。ただし、処理によっては、算数演算に long 変数を使用すると計算量が多くなることがあります。長い整数の加算と減算では、一般に標準サイズの整数の加算と減算の場合と同様の性能が必要なため、処理に問題はありません。これに対して、長い整数の乗算と減算ではサイズがはるかに大きく速度が遅いコードが必要になります。

固定小数点スケーリングとバイアスの併用の回避

可能な限り、固定小数点とバイアスを併用しないようにします。場合によっては、バイアスを注意深く選択すると、ROM と実行時間の大幅な増加を回避することができます。バイアスが組み込まれているハードウェア デバイスと連動する場合など、必要に応じて適切なバイアスを選択する方法については、「算術とスケーリングの推奨事項」を参照してください。ただし、通常は固定小数点とバイアスを併用しないようにすると安全です。

ルックアップ テーブルへの入力はこの推奨の重要な例外になります。ルックアップ テーブルの入力および関連する入力データが同じバイアスを使用すると、この処理の非ゼロ バイアスにペナルティを関連付けることはできません。

無限大方向またはシンプルに丸める

ほとんどの固定小数点と整数の演算について、Simulink® ソフトウェアにはオーバーフローの処理方法と計算を丸める方法に関するオプションがあります。従来の手書きコード、特に制御アプリケーション用コードでは、必ずと言ってよいほど "努力のいらない" 丸めが使用されています。たとえば、変数の精度を低くするには、変数を右にシフトします。符号なしの整数と 2 の補数の符号付き整数の場合、右にシフトすることは負の無限大方向に丸めることと等価です。従来の手書きコードに匹敵するかそれを上回る結果を得るには、通常無限大方向に丸めます。

このルールの主な例外は、符号付き整数除算の丸め動作です。C 言語ではこの丸め動作が未指定のままですが、大半の製品ターゲットにとって "努力のいらない" 丸めモードはゼロに丸めることを意味します。符号なし除算ではあらゆるものが非負なので、負の無限大方向に丸めることとゼロに丸めることは等価です。

[モデル コンフィギュレーション パラメーター]、[ハードウェア実行]、[製品ハードウェア]、[符号付き整数の除算の丸め] パラメーターの値を設定することによりコード効率を向上させて、量産ターゲットで符号付き整数の除算の丸めをどう扱うかを記述することができます。除算のみを行う Product ブロックの場合、[整数丸めモード] パラメーターを製品ターゲットの丸めモードに設定すると、最適な結果が得られます。また、利用可能な場合、ブロックに [シンプルな丸め] モードを使用することもできます。詳細については、「丸めモード: [シンプルな丸め]」を参照してください。

オーバーフロー処理のオプションも生成コードの効率性に大きな影響を与えます。オーバーフロー状態を検出して結果を飽和させるには、オーバーフローを単に無視する場合に比べてコードを非常に大きくして速度を遅くする必要があります。符号付き整数と 2 の補数の符号付き整数のオーバーフローを無視する場合、結果は通常剰余 2N に丸められます。N はビット数です。一般に、未処理のオーバーフローが繰り返されることは望ましくありません。

ただし、コード サイズと速度の条件のために、従来の手書きのコードには飽和がほとんどありません。通常、ほとんどの計算でオーバーフローが発生しないように固定小数点スケーリングは慎重に設定されます。このような計算用コードはオーバーフローを安全に無視します。従来の手書きのコードから予期される結果に匹敵するか上回る結果を得るには、[整数オーバーフローで飽和] パラメーターをこれらの計算を行う Simulink ブロックに選択しないでください。

設計では、オーバーフローが発生して飽和保護が必要になる場所がいくつかあります。従来の手書きのコードにはこれらの場所に必要なソフトウェアの飽和が含まれています。同等の生成コードを得るには、[整数オーバーフローで飽和] パラメーターを、これらのリスクのある計算に対応するいくつかの Simulink ブロックに対してのみ選択する必要があります。

オーバーフローの処理と丸めに最も効果的なオプションを使用する 2 つ目の利点は、計算がしばしば、数行の C コードを必要とする複数のステートメントから下流の計算にたたみ込める短い式に縮小されることです。式のたたみ込み表現はコード最適化の手法で、中間計算を一時的なバッファーや変数に格納する必要性を最小にするなどの利点があります。この手法では、スタック サイズを小さくし、CPU レジスタのみを使用して効率よく計算を処理できます。自動コード ジェネレーターは、式のたたみ込み表現をモデルのさまざまな部分に注意深く適用し、表面に現れない最適化をしばしば実現します。この種の自動最適化では、生成コードの効率性が通常の手書きのコードを上回ることがよくあります。

カスタム ストレージ クラスの使用の制限

式のたたみ込み表現の利点を最大限に活用するには、「無限大方向またはシンプルに丸める」で説明されているヒント以外に、[信号プロパティ] ダイアログ ボックスの [ストレージ クラス] フィールドが各信号に対して [Auto] に設定されていることを確認する必要があります。[Auto] 以外の設定を選択した場合、その信号に名前を付ける必要があります。これにより、生成コード内に独立したステートメントが作成されます。したがって、[Auto] 以外の設定を使用するのは、グローバル変数に必要なときのみにしてください。

[信号プロパティ] ダイアログ ボックスにアクセスするには、モデルのブロック間の接続を選択し、Simulink [編集] メニューの [信号プロパティ] を選択します。

等間隔ではないルックアップ テーブルの使用の制限

可能であれば、調整不可能な等間隔に配置された軸でルックアップ テーブルを使用してください。軸が等間隔ではないテーブルでは、入力軸ごとに検索のルーチンとメモリが必要になり、ROM と実行時間が増大します。ただし、等間隔ではないルックアップ テーブルの方が精度は向上する可能性がある点は覚えておいてください。ROM と実行時間の低減、短縮を図るために精度が多少低下しても等間隔のテーブルを使用するかどうかを判断するには、使用するアルゴリズムのニーズを考慮する必要があります。また、この決定は調整不可能な入力軸をもつルックアップ テーブルにのみ該当することに注意してください。調整可能な入力軸をもつテーブルは、軸が等間隔でなくなる可能性が常にあるからです。

類似した固定小数点ユーティリティ関数を最小限に抑える

Embedded Coder® 製品では、特定の状況を効率的に処理することを意図した固定小数点ユーティリティ関数が生成されます。Simulink Coder™ 製品では特定モデルの要件に応じて、このような最適化されたユーティリティ関数の複数のバージョンを生成する場合があります。たとえば、long 整数の除算では理論的には、出力と 2 つの入力と符号付き/符号なしを組み合わせた 8 個の変数が必要になります。これらの組み合わせすべてを使用するモデルは、すべての組み合わせに対するユーティリティ関数を生成する可能性があります。

モデルを少し調整することで必要なユーティリティ関数の種類を減らすことができる場合もあります。たとえば、モデルのほとんどの箇所では符号付きデータ型を使用するが、局所的に符号なしデータ型を使用すると決定されたとします。モデルのそのような箇所で符号付きデータ型を使用するよう変更できる場合、生成されるユーティリティ関数の全体的な種類を削減できる可能性があります。

このような変更が可能かどうかを判断するための最善の方法は、生成コードを調べることです。生成コードに現れるユーティリティ関数ごとに呼び出しサイトをすべて検索することができます。関数の呼び出しが比較的少ない場合、呼び出しサイトから Simulink モデルまでたどります。Simulink モデル内のこのような箇所を変更することにより、ほとんど使用されないユーティリティ関数を必要とする例外的なケースを排除できます。

正味勾配補正の処理

Fixed-Point Designer™ ソフトウェアには最適化パラメーター [固定小数点の勾配設定が整数の逆数の場合は整数の除算を使用] が用意されており、正味勾配補正の処理方法を制御することができます。この最適化を有効にする方法の詳細は、「整数除算を使用した正味勾配補正の処理」を参照してください。

固定小数点勾配の変更が 2 のべき乗でない場合、正味勾配補正が必要です。通常、正味勾配補正を行うには、整数を乗算してからシフトします。状況によっては、整数を定数で除算するだけで済むこともあります。このような状況の一例として、正味勾配をある整数の逆数として正確に表現できる場合があります。この場合、除算を行うと数値的な動作がより正確になります。使用しているコンパイラと組み込みハードウェアによっては、乗算とシフトを行うより除算を行う方が効果的な場合もあります。除算を行う生成コードでは、必要な ROM の低減やモデル実行時間の短縮につながる可能性があります。

整数の除算で正味勾配補正を処理すべき状況

この最適化は以下の場合に効果的です。

  • 正味勾配が整数の逆数である。

  • ターゲット ハードウェア上で乗算してシフトするより除算を実行する方が効率的である。

      メモ:   Fixed-Point Designer ソフトウェアではターゲット ハードウェアは認識されません。このオプションを選択する前に、ターゲット ハードウェア上で乗算してシフトするより除算を実行する方が効率的であることを確認してください。

整数の除算で正味勾配補正を処理すべきでない状況

この最適化は以下の場合には適していません。

  • ソフトウェアで製品ターゲットの long データ型を使用して除算できないため、マルチワード処理を使用しなければならない。

    マルチワード除算を使用しても、組み込みターゲットに適したコードは生成されません。したがって、マルチワード処理を使用するモデルでは整数の除算で正味勾配補正を処理しないでください。モデルにマルチワード処理を使用するブロックがある場合、これらブロックの語長を変更してこのような処理を回避してください。

  • 正味勾配が 2 のべき乗である。

    2 進小数点専用のスケーリングでは正味勾配が 2 のべき乗で、固定小数点ワード内での 2 進小数点の移動が行われます。このスケーリング モードにより、プロセッサの算術演算の回数が既に最小になっています。

整数除算を使用した正味勾配補正の処理

この最適化を有効にするには、以下の手順に従います。

  1. [最適化][固定小数点の勾配設定が整数の逆数の場合は整数の除算を使用] のコンフィギュレーション パラメーターを選択します。

    詳細は、「固定小数点の勾配設定が整数の逆数の場合は整数の除算を使用する」を参照してください。

  2. [ハードウェア実行][製品ハードウェア] ペインで、ターゲット ハードウェアに応じて [符号付き整数の除算の丸め] コンフィギュレーション パラメーターを [Floor] または [Zero] に設定します。[符号付き整数の除算の丸め] パラメーターが [Undefined] に設定されている場合、最適化は行われません。

      メモ:   このパラメーターをターゲット ハードウェアに適した値に設定してください。そうしないと、[ハードウェア実行] ペインの指定には一致していても、ターゲット ハードウェアには適さない除算になる可能性があります。

  3. 正味勾配補正が必要なブロック (Product、Gain、Data Type Conversion など) の [整数丸めモード][シンプルな丸め] に設定するか、またはターゲット ハードウェアの丸めモードを一致させます。

整数除算を使用した正味勾配の処理によるシミュレーション結果の数値精度の向上

この例では、[固定小数点の勾配設定が整数の逆数の場合は整数の除算を使用] 最適化パラメーターを選択することにより数値精度がどのように向上するのかを示します。ここでは以下のモデルを使用します。

このモデルの Product ブロックでは以下の式が成り立ちます。

これらの値は「スケーリング: 」で説明している一般的な [勾配 バイアス] エンコード方式で表現されます。

入力にも出力にもバイアスはないので、以下のようになります。

または

ここで、正味勾配は以下のとおりです。

Product ブロックの正味勾配は 1/1000 です。正味勾配は整数の逆数なので、モデルとハードウェア設定に適していれば、[固定小数点の勾配設定が整数の逆数の場合は整数の除算を使用] 最適化パラメーターを使用できます。詳細は、「整数の除算で正味勾配補正を処理すべき状況」を参照してください。

モデルを設定してシミュレーションを実行するには、以下の手順に従います。

  1. 2 つの Constant ブロックに対して [出力のデータ型] を [fixdt(1, 16, 1/1000, 0)] に設定します。

  2. Product ブロックに対して [出力のデータ型] を [fixdt(1, 16, 1/1000, 0)] に設定します。[整数丸めモード][シンプルな丸め] に設定します。

  3. [ハードウェア実行][製品ハードウェア][符号付き整数の除算の丸め] コンフィギュレーション パラメーターを [Zero] に設定します。

  4. コンフィギュレーション パラメーターの [最適化][固定小数点の勾配設定が整数の逆数の場合は整数の除算を使用] の選択を解除します。

  5. Simulink モデル ウィンドウで、[シミュレーション][実行] を選択します。

    シミュレーションでは乗算の後にシフトが行われて正味勾配補正が処理されるので、正味勾配の桁落ちが発生します。この桁落ちの結果、数値が不正確になります。計算して得られる積は予想どおり 4 ではなく 3.999 になります。

      メモ:   固定小数点定数で桁落ちが発生したら警告するように Fixed-Point Designer ソフトウェアを設定することができます。詳細は、「正味勾配と正味バイアスの精度」を参照してください。

  6. [最適化][固定小数点の勾配設定が整数の逆数の場合は整数の除算を使用] コンフィギュレーション パラメーターを選択し、モデルを保存して再度シミュレーションします。

    このソフトウェアでは、乗算してシフトするのではなく、除算を使用して正味勾配補正を行います。計算して得られる積は予想どおり 4 になります。

    このモデルで最適化が適切に機能するのは、以下の理由によります。

    • 正味勾配が整数の逆数である。

    • [ハードウェア実行][製品ハードウェア][符号付き整数の除算の丸め] コンフィギュレーション パラメーターが [Zero] に設定されている。

        メモ:   この設定はターゲット ハードウェアの丸めモードに一致していなければなりません。

    • モデルの Product ブロックの [整数丸めモード][シンプルな丸め] に設定されている。

    • このモデルはマルチワード処理を使用しない。

整数の除算を使った正味勾配の処理による生成コードの効率性の向上

この例では、[固定小数点の勾配設定が整数の逆数の場合は整数の除算を使用] 最適化パラメーターを選択することにより生成コードの効率性がどのように向上するのかを示します。

    メモ:   生成コードの効率性が高まるのは、ターゲット ハードウェアで乗算してシフトするより除算する方が効率性が高い場合のみです。

この例では、以下のモデルを使用します。

このモデルの Product ブロックでは以下の式が成り立ちます。

これらの値は「スケーリング: 」で説明している一般的な [勾配 バイアス] エンコード方式で表現されます。

入力にも出力にもバイアスはないので、以下のようになります。

または

ここで、正味勾配は以下のとおりです。

Product ブロックの正味勾配は 1/1000 です。

同様に、このモデルの Data Type Conversion ブロックでは、以下のとおりです。

バイアスはありません。したがって、正味勾配は になります。このブロックの正味勾配も 1/1000 です。

正味勾配は整数の逆数なので、モデルとハードウェア設定に適していれば、[固定小数点の勾配設定が整数の逆数の場合は整数の除算を使用] 最適化パラメーターを使用できます。詳細は、「整数の除算で正味勾配補正を処理すべき状況」を参照してください。

モデルを設定してコードを生成するには、以下の手順に従います。

  1. 2 つの Inport ブロック UV に対して [データ型] を [int16] に設定します。

  2. Data Type Conversion ブロックに対して [整数丸めモード][シンプルな丸め] に設定します。[出力データ型] を [fixdt(1, 16, 1000, 0)] に設定します。

  3. Product ブロックに対して [整数丸めモード][シンプルな丸め] に設定します。[出力データ型] を [fixdt(1, 16, 1000, 0)] に設定します。

  4. [ハードウェア実行][製品ハードウェア][符号付き整数の除算の丸め] コンフィギュレーション パラメーターを [Zero] に設定します。

  5. コンフィギュレーション パラメーターの [最適化][固定小数点の勾配設定が整数の逆数の場合は整数の除算を使用] の選択を解除します。

  6. Simulink モデル メニューから [コード][C/C++ コード][モデルのビルド] を選択します。

    概念上は、正味勾配補正は 1/1000 または 0.001 になります。

    Yc = 0.001 * U;
    Ym = 0.001 * U * V;

    以下の生成コードでは乗算とシフトが使用されます。

    % For the conversion
    Yc = (int16_T)U * 16777 >> 24;
    % For the multiplication
    Ym = (int16_T)((int16_T)(U * V >> 10) * 16777 >> 14);
    

    正味勾配補正の理想値は 0.001 です。生成コードでは、正味勾配補正の近似値は 16777L >> 24 = 16777/2^24 = 0.000999987125396729 です。この近似により、数値が不正確になります。たとえば、定数入力をもつ同じモデルを使用すると、以下の結果が得られます。

  7. [最適化][固定小数点の勾配設定が整数の逆数の場合は整数の除算を使用] 最適化パラメーターを選択し、ブロック線図を更新してコードを再度生成します。

    これで、生成コードで乗算してシフトするのではなく整数除算が使用されるようになりました。

    % For the conversion
    Yc = (int16_T)(U / 1000);
    % For the multiplication
    Ym = (int16_T)(U * V / 1000);
  8. 生成コードでは、正味勾配の補正値は理想値の 0.001 になりました。除算を使用するので、結果は数値的に正確です。

    このモデルで最適化が適切に機能するのは、以下の理由によります。

    • 正味勾配が整数の逆数である。

    • [ハードウェア実行][製品ハードウェア][符号付き整数の除算の丸め] コンフィギュレーション パラメーターが [Zero] に設定されている。

        メモ:   この設定はターゲット ハードウェアの丸めモードに一致していなければなりません。

    • モデルの Product ブロックと Data Type Conversion ブロックに対して [整数丸めモード][シンプルな丸め] に設定されている。

    • このモデルはマルチワード処理を使用しない。

指定された最小値および最大値を使用した生成コードの最適化

Fixed-Point Designer ソフトウェアでは、表現可能な最小値と最大値および定数値を使用して、生成コードを最適化できるかどうかを判断します。最適化とは、たとえば生成コードから不要なユーティリティ関数や飽和コードを排除することです。

この最適化により、以下のことを実現できます。

  • ROM と RAM の消費量の低減

  • 実行速度の向上

[指定した最小値と最大値を使用した最適化] コンフィギュレーション パラメーターを選択すると、"設計の最小値と最大値" とも呼ばれる入力範囲情報が考慮されます。この情報はモデルの信号とパラメーターに対してユーザーが指定します。これらの最小値と最大値を使用してモデルのダウンストリーム信号の範囲情報が得られ、可能であれば常にこの範囲情報を使用して、生成コード内の数学演算が簡略化されます。

必要条件

[指定した最小値と最大値を使用した最適化] パラメーターは、ERT ベースのターゲットのみに表示され、コード生成時には Embedded Coder ライセンスを必要とします。

モデルの設定方法

最適化の実現性を高めるには、以下のようにします。

  • 設計の最小値と最大値の情報をできるだけ多く提供します。以下の項目についてモデルの信号とパラメーターの最小値と最大値を指定します。

    • Inport ブロックと Outport ブロック

    • ブロック出力

    • ブロック入力 (MATLAB Function ブロックや Stateflow Chart ブロックなど)

    • Simulink.Signal オブジェクト

  • コードを生成する前に、信号とパラメーターの最小値と最大値をテストします。そうしないと、最適化の際に数値がシミュレーションと合わなくなる可能性があります。シミュレーション範囲のチェックを有効にした状態で、モデルをシミュレーションできます。エラーまたは警告が発生したら、問題を解決してからコードを生成してください。

     シミュレーション範囲チェック機能を有効にする方法

  • 2 進小数点専用 (2 のべき乗) スケーリングで固定小数点データ型を使用します。

  • 設計の最小値と最大値情報をブロックの上流のブロック入力にできるだけ近い位置で指定します。ブロック出力の最小値と最大値を指定すると、これらの値がすぐ下流のブロック出力に影響を及ぼす可能性が高くなります。詳細は、「指定された最小値と最大値を使用した不要なユーティリティ関数の排除」を参照してください。

最適化を有効にする方法

  1. [コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成][システム ターゲット ファイル] で、Embedded Real-Time (ERT) をターゲットを選択するように設定します (Embedded Coder ライセンスが必要)。

  2. モデルの設定方法」で説明しているヒントに従ってモデルの信号とパラメーターの設計の最小値と最大値を指定します。

  3. [最適化][指定した最小値と最大値を使用した最適化] コンフィギュレーション パラメーターを選択します。

    詳細は、「指定した最小値と最大値を使用した最適化」を参照してください。

制限

  • この最適化は以下の場合には実施されません。

    • マルチワード処理

    • 勾配とバイアス スケーリングが指定されている固定小数点データ型

    • 小数部の長さがゼロでない加算

  • この最適化では以下の場合に最小値と最大値が考慮されません。

    • Merge ブロック入力。この問題を回避するには、Merge ブロック出力で Simulink.Signal オブジェクトを使用してこのオブジェクトの範囲を指定します。

    • バス要素

    • Outport ブロックに直接接続されている、条件付きの実行サブシステム (Triggered Subsystem など) のブロック出力。

      条件付きの実行サブシステムの Outport ブロックには、システムがトリガーされない場合にのみ使用される初期値を指定できます。ただしこの場合は、範囲がブロックの初期値を含まない可能性があるので、最適化でブロック出力の範囲は使用できません。

  • 精度について制限事項がありますが、これは最小値と最大値が double として指定されているからです。最小値または最大値の真の値を double として表現できない場合、真の設計範囲をカバーするように最小値と最大値を正しく丸めていることを確認してください。

  • モデルに再利用可能なサブシステムの複数のインスタンスがあり、各インスタンスはさまざまな最小値と最大値が指定された入力信号を使用する場合、この最適化によってサブシステムごとに異なるコードが生成されて、コードを再利用できなくなる可能性があります。この最適化を行わない場合、Simulink Coder ソフトウェアはサブシステムのコードを一度だけ生成し、そのコードをサブシステムの複数インスタンス間で共有します。

指定された最小値と最大値を使用した不要なユーティリティ関数の排除

この例では、Fixed-Point Designer ソフトウェアが除算の入力範囲を使用して生成コードから不要なユーティリティ関数を排除できるかどうかを判断する方法を示します。ここでは fxpdemo_min_max_optimization モデルを使用します。最初に、指定した最小値と最大値を使用せずにコードを生成して、生成コードにゼロ除算を確実に防止するユーティリティ関数が含まれているかどうかを調べます。次に、最適化を有効にしてからコードを再度生成します。最適化により、生成コードにはそのユーティリティ関数が含まれなくなります。この関数は入力範囲には不要だからです。

最小値および最大値を使用しないコードの生成

最初に最適化を行わないコードを示すため、除算の最初の入力で設計の最小値と最大値を考慮しないでコードを生成します。この場合、2 つの入力の表現可能な範囲が使用されます。これらの入力はいずれも uint16 です。これらの入力範囲で、シフトを使用して指定された精度で除算を行うことはできません。そのため生成コードには除算ユーティリティ関数が含まれます。

  1. fxpdemo_min_max_optimizationfxpdemo_min_max_optimization の例を実行します。

  2. 例のウィンドウで、[View Optimization Configuration] ボタンをダブルクリックします。

    [コンフィギュレーション パラメーター] ダイアログ ボックスの [最適化] ペインが表示されます。

    [指定した最小値と最大値を使用した最適化] パラメーターの選択が解除されていることに注意してください。

  3. [Generate Code] ボタンをダブルクリックします。

    コード生成レポートが表示されます。

  4. モデルで Division with increased fraction length output type ブロックを右クリックします。

    コンテキスト メニューが表示されます。

  5. コンテキスト メニューから [C/C++ コード][C/C++ コードに移動] を選択します。

    コード生成レポートでこのブロック用に生成されたコードが強調表示されます。生成コードにはユーティリティ関数 div_repeat_u32 への呼び出しが含まれます。

    rtY.Out3 = div_repeat_u32((uint32_T)rtU.In5 << 16, 
      (uint32_T)rtU.In6, 1U);
  6. div_repeat_u32 リンクをクリックしてユーティリティ関数を表示します。この関数にはゼロ除算を扱うためのコードが含まれています。

最小値および最大値を使用したコードの生成

次に同じ除算のコードを生成しますが、今度は Product ブロックの最初の入力の設計の最小値と最大値を考慮します。これらの最小値と最大値は Product ブロックのすぐ上流にある Inport ブロックで指定されます。このような入力範囲が指定されているので、シフトを使用するだけで生成コードは除算を行います。除算ユーティリティ関数を生成する必要がないので、メモリ使用量が減り実行時間が短縮されます。

  1. 5 というラベルの Inport ブロックをダブルクリックして、[ブロック パラメーター] ダイアログ ボックスを開きます。

  2. [ブロック パラメーター] ダイアログ ボックスで [信号属性] ペインを選択します。以下のことに注意してください。

    • この信号の [最小] 値は 1 です。

    • この信号の [最大] 値は 100 です。

  3. [OK] をクリックしてダイアログ ボックスを閉じます。

  4. [View Optimization Configuration] ボタンをダブルクリックします。

    [コンフィギュレーション パラメーター] ダイアログ ボックスの [最適化] ペインが表示されます。

  5. このペインで [指定した最小値と最大値を使用した最適化] パラメーターを選択し、[適用] をクリックします。

  6. [コード生成] ボタンをダブルクリックします。

    コード生成レポートが表示されます。

  7. モデルで Division with increased fraction length output type ブロックを右クリックします。

    コンテキスト メニューが表示されます。

  8. コンテキスト メニューから [C/C++ コード][C/C++ コードに移動] を選択します。

    コード生成レポートでこのブロック用に生成されたコードが強調表示されます。今回は、生成コードはシフト演算を使用して除算を行うので、除算ユーティリティ関数はありません。

    tmp = rtU.In6;
    rtY.Out3 = (uint32_T)tmp == 
      (uint32_T)0 ? MAX_uint32_T : ((uint32_T)rtU.In5 << 17) /
        (uint32_T)tmp;

指定された最小値と最大値の変更

最後に、値がシフトされたときにオーバーフローしないことを保証できなくなるほど入力範囲が大きくなるように除算の最初の入力の最小値と最大値を変更します。ここで、16 ビット数を右に 17 ビットだけシフトすると、32 ビット コンテナーから必ずオーバーフローします。最小値と最大値を考慮して、除算のコードを生成します。このような入力範囲が指定されているので、生成コードにはオーバーフローの発生を確実に防止するための除算ユーティリティ関数が含まれます。

  1. 5 というラベルの Inport ブロックをダブルクリックして、[ブロック パラメーター] ダイアログ ボックスを開きます。

  2. [ブロック パラメーター] ダイアログ ボックスで、[信号属性] ペインを選択し [最大値]40000 に設定し [OK] をクリックしてダイアログ ボックスを閉じます。

  3. [コード生成] ボタンをダブルクリックします。

    コード生成レポートが表示されます。

  4. モデルで Division with increased fraction length output type ブロックを右クリックします。

    コンテキスト メニューが表示されます。

  5. コンテキスト メニューから [C/C++ コード][C/C++ コードに移動] を選択します。

    コード生成レポートでこのブロック用に生成されたコードが強調表示されます。生成コードにはユーティリティ関数 div_repeat_32 への呼び出しが含まれます。

    rtY.Out3 = div_repeat_u32((uint32_T)rtU.In5 << 16, 
      (uint32_T)rtU.In6, 1U);
この情報は役に立ちましたか?