Real-Time Workshop User's Guide | ![]() ![]() |
データタイプの使用法
ほとんどのプロセッサで、整数データタイプの利用は、データストレージの使用量を大きく削減させ、操作の速度を大幅に増加させます。(アキュムレータのような)実際に整数計算であるブロック線図の部分を識別し、それらを整数データタイプで実現することにより、ほとんどのプロセッサ上で性能を大きく向上させることが可能です。
浮動小数点DSPターゲットは、この規則に対する明らかな例外です。
前の例題のアキュムレータは、デフォルトで、64ビット浮動小数点計算を使いました。図 8-9のブロック線図は、16ビット整数演算を使ってアキュムレータを実現します。
図 8-10: 16ビット整数により実現されたアキュムレータ
SumブロックのSaturate on integer overflowオプションがオフの場合、整数処理から生成されたコードは、浮動小数点ブロック線図から生成されたコードと同じように見えます。しかし、Sum_sythesized_accumulator は内部的に整数計算を行っているので、アキュムレータはより効率的に実行されます。
デフォルトでは、Saturate on integer overflowオプションはonです。このオプションは、以下の例のように、整数処理の余分なエラーチェックコードを生成します。
void MdlOutputs(int_T tid) { /* UnadornAccum Block: <Root>/Sum_sythesized_accumulator */ { int16_T tmpVar = rtB.Sum_sythesized_accumulator; rtB.Sum_sythesized_accumulator = tmpVar + (1); if ((tmpVar >= 0) && ((1) >= 0) && (rtB.Sum_sythesized_accumulator < 0)) { rtB.Sum_sythesized_accumulator = MAX_int16_T; } else if ((tmpVar < 0) && ((1) < 0) && (rtB.Sum_sythesized_accumulator >= 0)) { rtB.Sum_sythesized_accumulator = MIN_int16_T; } } /* Outport Block: <Root>/Out1 */ rtY.Out1 = rtB.Sum_sythesized_accumulator; }
浮動小数点処理は、整数のみに適用する飽和エラーチェックを生成しません。整数データタイプを利用するとき、飽和チェックコードを生成する必要があるかどうかを考慮してください。
図 8-11は、アキュムレータにリセット機能を追加する効率的な方法を示しています。resetSig
がSwitchブロックの閾値以上である場合は、Switchブロックはリセット値(0)をアキュムレータに戻します。
図 8-11: 外部入力によるリセットをもつ整数Accumulator
生成したコードサイズは、最小になります。コードは、浮動小数点演算を使いません。
/* Compute block outputs */ void MdlOutputs(int_T tid) { /* local block i/o variables */ int16_T rtb_temp3; /* UnitDelay Block: <Root>/accumState */ rtb_temp3 = rtDWork.accumState_DSTATE; /* Sum Block: <Root>/Sum */ { int16_T tmpVar1 = 0; int16_T tmpVar2; /* port 0 */ tmpVar1 = rtC_Increment; /* port 1 */ tmpVar2 = tmpVar1 + rtb_temp3; if ((tmpVar1 >= 0) && (rtb_temp3 >= 0) && (tmpVar2 < 0)) { tmpVar2 = MAX_int16_T; } else if ((tmpVar1 < 0) && (rtb_temp3 < 0) && (tmpVar2 >= 0)) { tmpVar2 = MIN_int16_T; } rtb_temp3 = tmpVar2; } /* Outport Block: <Root>/accumVal */ rtY.accumVal = rtb_temp3; /* Switch Block: <Root>/Switch */ if (rtU.resetSig) { rtB.Switch = rtC_ResetValue; } else { rtB.Switch = rtb_temp3; } } /* Perform model update */ void MdlUpdate(int_T tid) { /* UnitDelay Block: <Root>/accumState */ rtDWork.accumState_DSTATE = rtB.Switch; }
この例題では、システム入力を定数ではなくリセット値として使った方が簡単です。
純粋な整数コードの生成
組み込みリアルタイム(ERT)ターゲットは、生成コードが浮動小数点データまたは演算を含まないことを保証するInteger code only オプションを提供します。このオプションが選択されると、非整数データまたは表現がモデルのコンパイル中に生じる場合はエラーが発生します。エラーメッセージは、違反するブロックおよびパラメータを表示します。
純粋な整数コードの生成が設計において重要である場合は、ERTターゲット(またはERTターゲットに基づくユーザ独自のターゲット)の利用を考えます。
Integer code only オプションを使うには、Real-Time WorkshopページのCategoryメニューからERT code generation optionsを選択します。下記のようにInteger code onlyオプションが利用可能になります。
ERTターゲットは、多くのその他の最適化を提供します。詳細は、第9章「組み込みリアルタイムターゲット」を参照してください。
Fixed-Point BlocksetおよびStateflowを
使ったデータタイプの最適化
Fixed-Point Blockset(別プロダクト)は、浮動小数点ハードウェアをもたないプロセッサ上での非整数アルゴリズムに対して最高レベルの性能を与えるために設計されています。Real-Time WorkshopでのFixed-Point Blocksetのコード生成は、プロセッサの整数演算を用いた計算を実現します。コード生成方法は、整数値を期待される実世界値の範囲に割り当てて、高性能を得ます。
有限状態機械またはフローチャート構成は、決定ロジック(またはモードロジック)を効率的に表現することが可能です。Stateflow(別プロダクト)は、これらの機能を提供します。Simulinkと完全に統合されるStateflowは、整数データタイプのコード生成をサポートします。
![]() | アキュムレータ | Stateflowの最適化 | ![]() |