Main Content

基本的な演算に対するデータ型の選択

データ型の語長の制限

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

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

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

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

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

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

ラップして負方向または最も簡潔に丸める

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

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

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

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

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

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

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

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

式の畳み込みの利点を最大限に活用するには、ラップして負方向または最も簡潔に丸めるで説明されているヒント以外に、[ストレージ クラス] がモデル内の信号に対して [Auto] に設定されていることも確認しなければなりません。[Auto] 以外の設定を選択した場合、その信号に名前を付ける必要があります。これにより、生成コード内に独立したステートメントが作成されます。したがって、[Auto] 以外の設定を使用するのは、グローバル変数に必要なときのみにしてください。

信号の [ストレージ クラス] の設定の詳細については、C コード生成のための信号データの構成を参照してください。