チャート データの整数オーバーフローの処理
整数オーバーフローが発生する場合
一部の算術演算では、プロセッサは n
ビットの固定小数点の値を受け入れ、m
ビットに格納しなければならないことがあります。ここで、m
≠ n
です。m
< n
の場合、値の範囲が小さくなるため算術演算でオーバーフローが発生することがあります。一部のプロセッサではこのオーバーフローは Inf
または NaN
として捉えられます。他のプロセッサ、特にデジタル信号プロセッサ (DSP) では、値を飽和またはラップしてオーバーフローが処理されます。
整数オーバーフローの飽和とラップの詳細については、飽和とラップ (Fixed-Point Designer)を参照してください。
チャートでの整数オーバーフロー処理のサポート
Simulink® モデルの Stateflow® チャートでは、整数オーバーフローで飽和が発生するかどうかを制御できます。オーバーフローの処理をコントロールするには、Stateflow チャートのプロパティの指定の説明に従って、チャートの [整数オーバーフローで飽和] プロパティを設定します。
チャート プロパティの設定 | この設定を使用する場合 | オーバーフローの処理 | 結果の例 |
---|---|---|---|
選択 | チャートのデータでオーバーフローが発生する可能性があるので、生成されたコードに飽和保護を明示的に組み込むことをお勧めします。 | オーバーフローは、データ型が表現できる最小値または最大値のいずれかに飽和します。 | 符号付き 8 ビット整数に関連付けられたオーバーフローは、生成コードで -128 または 127 に飽和します。 |
クリア | 生成されたコードの効率を最適化することをお勧めします。 | オーバーフローの処理は、生成コードに使用する C コンパイラによって異なります。 | 数値 130 は符号付き 8 ビット整数 1 つに収まりきらないので、生成コードで -126 にラップされます。 |
飽和保護を有効にできる算術演算は次のとおりです。
単項マイナス: –
a
二項演算:
a + b
,a
–b
,a * b
,a / b
,a ^ b
代入演算:
a += b
,a
–=b
,a *= b
,a /= b
C チャートの場合、インクリメント演算およびデクリメント演算:
++
、--
[整数オーバーフローで飽和] を選択する場合は、次の点に注意してください。
飽和は出力や最終結果だけでなく、すべての中間演算にも適用されます。
コード ジェネレーターは、オーバーフローの可能性がない場合のケースをいくつか検出することがあります。この場合、生成コードに飽和保護は含まれません。
[整数オーバーフローで飽和] チェック ボックスをオフにしても安全かどうかを判断するには、ロジックを慎重に解析します (必要であればシミュレーションも含めて)。ロジックの一部のセクションのみで飽和が必要な場合は、そのロジックを Atomic サブチャートまたは MATLAB 関数にカプセル化して、これらのユニットに対し異なるセットの飽和設定を定義します。
整数の上位変換規則が飽和に与える影響
チャートでは ANSI® C ルールを使用して整数の上位変換が行われます。
すべての算術演算では、ターゲット ワード サイズと同じ語長のデータ型が使用されます。このため、チェーン状の算術演算の中間データ型は、オペランドや最終結果のデータ型とは異なる場合があります。
ターゲット ワード サイズよりも小さい整数型のオペランドでは、ターゲット サイズと同じ語長をもつより大きなタイプへの上位変換が行われます。この暗黙的なキャストは、すべての算術演算の前に実行されます。
たとえば、ターゲット ワード サイズが 32 ビットの場合は、タイプが
uint8
、uint16
、int8
、またはint16
のオペランドに対し、算術演算が行われる前にint32
への暗黙的なキャストが実行されます。
次の式があるとします。ここで y
、u1
、u2
、および 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;
各計算に対し、次のデータ型と飽和制限が適用されます。
計算 | データ型 | 飽和制限 |
---|---|---|
tmp | int32 | (MIN_INT32, MAX_INT32) |
result | int32 | (MIN_INT32, MAX_INT32) |
y | uint8 | (MIN_UINT8, MAX_UINT8) |
u1
、u2
および u3
は 200 と等しいとします。飽和制限はオペランドのタイプではなく、中間のデータ型に依存しているため、次の値が得られます。
tmp
は 400。result
は 200。y
は 200。
飽和がエラーのチェックに与える影響
チャートのプロパティ [整数オーバーフローで飽和] を有効にし、コンフィギュレーション パラメーター [オーバーフロー時にラップ] を [エラー]
または [警告]
に設定した場合、シミュレーション中に Stateflow チャートによって整数オーバーフローにフラグが立てられることはありません。ただし、ゼロ除算演算および最小値と最大値の範囲のチェックに基づくデータ範囲外違反には引き続きチャートでフラグが立てられます。