Main Content

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

チャート データの整数オーバーフローの処理

整数オーバーフローが発生する場合

一部の算術演算では、プロセッサは n ビットの固定小数点の値を受け入れ、m ビットに格納しなければならないことがあります。ここで、mn です。m < n の場合、値の範囲が小さくなるため算術演算でオーバーフローが発生することがあります。一部のプロセッサではこのオーバーフローは Inf または NaN として捉えられます。他のプロセッサ、特にデジタル信号プロセッサ (DSP) では、値を飽和またはラップしてオーバーフローが処理されます。

整数オーバーフローの飽和とラップの詳細については、飽和とラップ (Fixed-Point Designer)を参照してください。

チャートでの整数オーバーフロー処理のサポート

Simulink® モデルの Stateflow® チャートでは、整数オーバーフローで飽和が発生するかどうかを制御できます。オーバーフローの処理をコントロールするには、チャートの [整数オーバーフローで飽和] プロパティを使用します。

チェック ボックスこの設定を使用する場合オーバーフローの処理結果の例
選択チャートのデータでオーバーフローが発生する可能性があるので、生成されたコードに飽和保護を明示的に組み込むことをお勧めします。オーバーフローは、データ型が表現できる最小値または最大値のいずれかに飽和します。符号付き 8 ビット整数に関連付けられたオーバーフローは、生成コードで -128 または 127 に飽和します。
クリア生成されたコードの効率を最適化することをお勧めします。オーバーフローの処理は、生成コードに使用する C コンパイラによって異なります。数値 130 は符号付き 8 ビット整数 1 つに収まりきらないので、生成コードで -126 にラップされます。

飽和保護を有効にできる算術演算は次のとおりです。

  • 単項マイナス: –a

  • 二項演算: a + b, ab, a * b, a / b, a ^ b

  • 代入演算: a += b, a=b, a *= b, a /= b

  • C チャートの場合、インクリメント演算およびデクリメント演算: ++--

[整数オーバーフローで飽和] を選択する場合は、次の点に注意してください。

  • 飽和は出力や最終結果だけでなく、すべての中間演算にも適用されます。

  • コード ジェネレーターは、オーバーフローの可能性がない場合のケースをいくつか検出することがあります。この場合、生成コードに飽和保護は含まれません。

[整数オーバーフローで飽和] チェック ボックスをオフにしても安全かどうかを判断するには、ロジックを慎重に解析します (必要であればシミュレーションも含めて)。ロジックの一部のセクションのみで飽和が必要な場合は、そのロジックを Atomic サブチャートまたは MATLAB 関数にカプセル化して、これらのユニットに対し異なるセットの飽和設定を定義します。

整数の上位変換規則が飽和に与える影響

チャートでは ANSI® C ルールを使用して整数の上位変換が行われます。

  • すべての算術演算では、ターゲット ワード サイズと同じ語長のデータ型が使用されます。このため、チェーン状の算術演算の中間データ型は、オペランドや最終結果のデータ型とは異なる場合があります。

  • ターゲット ワード サイズよりも小さい整数型のオペランドでは、ターゲット サイズと同じ語長をもつより大きなタイプへの上位変換が行われます。この暗黙的なキャストは、すべての算術演算の前に実行されます。

    たとえば、ターゲット ワード サイズが 32 ビットの場合は、タイプが uint8uint16int8、または int16 のオペランドに対し、算術演算が行われる前に int32 への暗黙的なキャストが実行されます。

次の式があるとします。ここで yu1u2、および u3 のタイプは uint8 です。

y = (u1 + u2) - u3;

整数の上位変換の規則に基づくと、この式は次のステートメントと等価になります。

uint8_T u1, u2, u3, y;
int32_T tmp, result;
tmp = (int32_T) u1 + (int32_T) u2;
result = tmp - (int32_T) u3;
y = (uint8_T) result;

各計算に対し、次のデータ型と飽和制限が適用されます。

計算データ型飽和制限
tmpint32(MIN_INT32, MAX_INT32)
resultint32(MIN_INT32, MAX_INT32)
yuint8(MIN_UINT8, MAX_UINT8)

u1u2 および u3 は 200 と等しいとします。飽和制限はオペランドのタイプではなく、中間のデータ型に依存しているため、次の値が得られます。

  • tmp は 400。

  • result は 200。

  • y は 200。

飽和がエラーのチェックに与える影響

[モデル コンフィギュレーション パラメーター] ダイアログ ボックスで、[診断]、[データ有効性] ペインの [オーバーフロー時にラップ][エラー] または [警告] に設定したとします。[整数オーバーフローで飽和] を選択すると、シミュレーション中に Stateflow によって整数オーバーフローにフラグが立てられることはありません。ただし、次のような場合は引き続き Stateflow でフラグが立てられます。

  • 最小値と最大値の範囲のチェックでデータ範囲外違反が検出された場合

  • ゼロ除算演算