Main Content

ランタイム環境オプションの構成

Simulink® ソフトウェアを使用したモデルの作成と実行およびコード ジェネレーターによる C または C++ コード生成を行う場合、最大で次の 3 つのランタイム環境の構成を考えることができます。

  • アプリケーションの開発時に MathWorks® ソフトウェアを実行する MATLAB® 開発用コンピューター ランタイム環境。

  • 量産時にアプリケーションを展開する製品ハードウェア ランタイム環境。

  • 展開前に開発中のアプリケーションをテストするテスト ハードウェア ランタイム環境。

1 つのランタイム環境で複数の役割を果たすことは可能ですが、ランタイム環境は概念的には異なります。MATLAB 開発用コンピューターがテスト ハードウェアも兼ねていることはよくあります。一般的に、製品ハードウェアは、MATLAB 開発またはテスト ハードウェアとは異なり、それほど強力ではありません。多くの種類の製品ハードウェアは、ダウンロードした実行可能ファイルを実行する以上の操作はほとんどできません。

次の場合に、製品ハードウェア ボードおよび一緒に使用するコンパイラに関する情報を指定します。

  • Simulink ソフトウェアを使用して後からコードを生成するモデルをシミュレーションする

  • コード ジェネレーターを使用して、"製品" ハードウェアに展開するコードを生成する

ソフトウェアはボードとコンパイラの情報を使用して、シミュレーションおよび製品ハードウェア用に生成されたコードで実行される整数演算と固定小数点演算の結果において、ビットトゥルーが一致するようにします。コード ジェネレーターはこの情報を使用して、最大効率で実行されるコードを作成します。

"テスト" ハードウェアでテストするコードを生成する際は、テスト ハードウェア ボードおよび使用するコンパイラに関する情報も指定してください。コード ジェネレーターはこの情報を使用して、次の結果間でビットトゥルーを一致させるコードを作成します。

  • シミュレーションで実行される整数演算と固定小数点演算

  • 製品ハードウェアで実行される生成されたコード

  • テスト ハードウェアで実行される生成されたコード

製品ハードウェアとテスト ハードウェアが異なる場合でも、結果のビットトゥルーを一致させることができます。C 規格で動作が完全に定義されない場合、2 種類のハードウェアのコンパイラは異なる既定値を使用できます。

製品ハードウェアとテスト ハードウェアの構成

特定のハードウェア ボードとそのデバイス タイプに対して、モデルのシミュレーションまたはコード生成を指定できます。たとえば、データ サイズ、バイト順、整数丸めなどのコンパイラの動作を設定できます。以下を構成できます。

[コンフィギュレーション パラメーター][ハードウェア実行] を選択して製品ハードウェアを構成します。既定で [ハードウェア実行] ペインに表示されるパラメーター フィールドは、[ハードウェア ボード][デバイス ベンダー] および [デバイス タイプ] のみです。ハードウェア サポート パッケージをインストールしない限り、[ハードウェア ボード] には、値 [なし] または [[コード生成] システム ターゲット ファイルで決定] および [ハードウェア サポート パッケージの入手] が表示されます。ハードウェア サポート パッケージをインストールすると、対応するハードウェア ボード名もリストに表示されます。ハードウェア ボード名を選択すると、そのボードのパラメーターが表示されます。データ サイズやバイト順などのデバイスの詳細を設定するには、[デバイスの詳細] をクリックします。

[コンフィギュレーション パラメーター][ハードウェア実行][詳細設定パラメーター] ペインでテスト ハードウェアを構成します。テスト ハードウェアの詳細を構成するためにパラメーターを有効にするには、[コンフィギュレーション パラメーター][ハードウェア実行][詳細設定パラメーター][テスト ハードウェアを製品ハードウェアと同じにする]パラメーターを無効にします。テスト ハードウェア用に生成されたコードは、テスト ハードウェア パラメーターで指定された環境で実行されます。コードは、製品ハードウェアに対して指定された環境で実行されているように動作します。詳細については、ハードウェア テストの考慮事項を参照してください。

既定値とプロパティは、次の場合に [ハードウェア実行] ペインの初期値として表示されます。

  • [コード生成] ペインで [システム ターゲット ファイル] を指定した場合。

  • システム ターゲット ファイルは、既定のマイクロプロセッサとそのハードウェア プロパティを指定します。

使用可能な値が 1 つしかないパラメーターは変更できません。使用可能な値が 1 つを超えるパラメーターでは有効な値のリストが表示されます。[ハードウェア実行] ペインでハードウェアのプロパティを手動で指定する場合、これらの値はシステム ターゲット ファイルと一致しているか確認します。一致しない場合、生成されたコードはコンパイルまたは実行できなかったり、実行できても、正しくない結果になる場合があります。

ハードウェア実行パラメーターでは、ハードウェアやコンパイラのプロパティを MATLAB ソフトウェアに対して記述します。コード ジェネレーターはこれらの情報を使用して、ランタイム環境で、できるかぎり効率的に実行されるコードを生成します。生成されたコードは、シミュレーション、量産コードおよびテスト コードで整数演算および固定小数点演算の結果のビットトゥルーを一致させます。

特定のパラメーターの詳細については、[ハードウェア実行] ペインを参照してください。[ハードウェア実行] ペイン機能の例を確認するには、モデル例 TargetSettings を開きます。

openExample("TargetSettings");

ハードウェア実行の構成に関する詳細については、以下を参照してください。

ハードウェア ボードの指定

モデル用に生成されたコードを実行するハードウェア ボードを指定します。[コンフィギュレーション パラメーター][ハードウェア実行][ハードウェア ボード] の値を選択します。

[ハードウェア実行] ペインで、[コンフィギュレーション パラメーター][コード生成] で選択したシステム ターゲット ファイルを特定します。

テスト ハードウェアを構成するには、[コンフィギュレーション パラメーター][ハードウェア実行][詳細設定パラメーター]ペインを使用します。

テスト ハードウェアの詳細を構成するパラメーターを有効にするには、ProdEqTargetoff に設定します。

ハードウェア ボードの指定方法

以下の場合選択

使用するハードウェア ボード名がメニューに "含まれている"

そのハードウェア ボードの名前。

ハードウェア ボード名を選択すると、そのボードのパラメーターが表示されます。

使用するハードウェア ボード名がメニューに "含まれていない"

[ハードウェア サポート パッケージの入手]

この値でサポート パッケージ インストーラーが開きます。必要なサポート パッケージをインストールします。サポート パッケージをインストールすると、関連するハードウェア ボード名がメニューに含まれるようになります。

モデル コンフィギュレーションで、システム ターゲット ファイル ert.tlcrealtime.tlc または autosar.tlc を "使用" する。

[なし]

ハードウェア実行に指定されたハードウェア ボードはありません。

モデル コンフィギュレーションで、システム ターゲット ファイル ert.tlcrealtime.tlc または autosar.tlc を "使用しない"

[[コード生成] システム ターゲット ファイルで決定]

コード ジェネレーターは指定されたシステム ターゲット ファイルを使用して、ハードウェア実行を決定します。

デバイス ベンダーの指定

ハードウェア デバイスのマイクロプロセッサのベンダーを指定するには、[デバイス ベンダー] パラメーターを使用します。選択内容によって、[デバイス タイプ] メニューで利用可能なマイクロプロセッサが決まります。ベンダー名が表示されない場合、[Custom Processor] を選択します。次に、[デバイス タイプ] パラメーターを使用して、マイクロプロセッサを指定します。

デバイス タイプの指定

[デバイス ベンダー] の選択でリストされているサポート対象デバイスからマイクロプロセッサ名を指定するには、[デバイス タイプ] パラメーターを使用します。マイクロプロセッサがメニューに表示されない場合は、[デバイス ベンダー][Custom Processor] に変更します。次に、カスタム デバイスのデバイスの詳細を指定します。

システム ターゲット ファイルによって既定のハードウェア プロパティが指定されるデバイス タイプを選択した場合、プロパティは初期値として表示されます。選択可能な値が 1 つしかないパラメーターの値は変更できません。使用可能な値が 1 つを超えるパラメーターではメニューが表示されます。使用するハードウェアに対する値を選択します。

デバイスのデータ型のビット長の設定

[ビット数] パラメーターは、マイクロプロセッサの [ネイティブ ワード サイズ]、ならびに charshortint および long データのビット長を規定します。コード生成を成功させるには、次の点に注意してください。

  • ビット長は char <= short <= int <= long でなければなりません。

  • ビット長は 8 の倍数で、最大値が 32 でなければなりません。

  • long データのビット長は 32 未満であってはいけません。

rtwtypes.h ファイルで、整数型の名前を定義します。指定する値は、コンパイラの limits.h ヘッダー ファイルで定義されるワード サイズと一致していなければなりません。コード ジェネレーターは、その整数型の名前を対応する Simulink の整数型の名前にマッピングします。

ANSI® C データ型で一致するワード サイズがなく、大きい ANSI C データ型が使用可能な場合、コード ジェネレーターは大きいデータ型を int8_Tuint8_Tint16_Tuint16_Tint32_T および uint32_T に使用します。コード ジェネレーターで大きいデータ型を使用すると、結果のログ値 (MAT ファイルのログなど) には、シミュレーションに使用されたログ値とは異なるデータ型が含まれる可能性があります。

アプリケーションでは、1 (符号なし) または 2 (符号付き) ビットから最大 32 ビットまでの長さの整数データを使用できます。整数の長さが使用可能なデータ型の長さに一致する場合、コード ジェネレーターはそのデータ型を使用します。一致するデータ型がない場合、コード ジェネレーターはデータを保持できる最も小さいデータ型を使用し、不要に高次ビットを使用しないコードを生成します。たとえば、8 ビット、16 ビット、32 ビットの整数をサポートするハードウェアで、24 ビットとして指定された信号に対して、コード ジェネレーターはデータを int32_T または uint32_T として実装します。

エミュレートされた整数データを使用するコードは、効率性が最大ではありません。このコードは、アプリケーション開発時に製品ハードウェアでのみ使用可能な整数長をエミュレートする際に便利です。エミュレーションによって実行結果が左右されることはありません。

コード生成中に、ソフトウェアはモデルのデータ型と製品ハードウェアに指定されているデータ型の互換性をチェックします。

  • 製品ハードウェアの整数に指定した長さがいずれも 32 ビットではない場合、ソフトウェアはエラーを生成します。

  • モデルで使用されるデータ型の長さが、使用可能な製品ハードウェアの整数の長さより短い場合にソフトウェアは警告を生成します。

コード ジェネレーターから Simulink への整数型のマッピング

コード ジェネレーターの整数型Simulink 整数データ型
boolean_Tboolean
int8_Tint8
uint8_Tuint8
int16_Tint16
uint16_Tuint16
int32_Tint32
uint32_Tuint32

デバイスのバイト順の設定

[バイト順] パラメーターは、ハードウェアが [ビッグ エンディアン] (最上位バイトが最初) のバイト順を使用するか [リトル エンディアン] (最下位バイトが最初) のバイト順を使用するかを指定します。[指定なし] のままにすると、コード ジェネレーターはハードウェアのエンディアンを特定するコードを生成します。この設定は最も非効率です。

符号付き整数の除算結果の丸め動作の設定

ANSI C では、コンパイラで符号付き整数を別の整数で除算する際に使用される商の丸め手法を完全に定めていません。そのため、動作はその実行方法によって変わります。整数が両方とも正の場合、または両方とも負の場合は、商を丸めなければなりません。いずれかの整数が正でもう一方が負の場合は、商を丸めることも切り上げることもあり得ます。

[符号付き整数の除算の丸め] パラメーターはコード ジェネレーターに、符号付き整数の除算をコンパイラがどのように丸めるかについて指示します。この情報を指定してもコンパイラの動作は変化しません。この情報は、コード ジェネレーターの動作を規定するだけです。コード ジェネレーターはこの情報を使用して、符号付き整数の除算で生成されるコードを最適化します。パラメーターの値は以下のとおりです。

  • [ゼロ方向] — 商が 2 つの整数の間にある場合、コンパイラはゼロに近い方の整数を結果に選択します。

  • [負方向] — 商が 2 つの整数の間にある場合、コンパイラは負の無限値に近い方の整数を結果に選択します。

  • [未定義][ゼロ方向] または [負方向] でコンパイラの動作を定めない場合またはその動作が不明な場合に、この値を選択します。

[未定義] は選択しないでください。コード ジェネレーターがコンパイラの符号付き整数の除算の丸め動作を判別できない場合、モデルのビルドで追加のコードを生成します。

コンパイラの商の丸め動作は、これらの値に従って変化します。

コンパイラのドキュメンテーションでコンパイラの符号付き整数の除算の丸め方法を確認できます。ドキュメンテーションがない場合は実験してこの動作を確認することができます。

[ゼロ方向]、[負方向] および [未定義] の商の丸めの例

ND理想の N/Dゼロ方向負方向未定義

33

4

8.25

8

8

8

-33

4

-8.25

-8

-9

-8 または -9

33

-4

-8.25

-8

-9

-8 または -9

-33

-4

8.25

8

8

8 または 9

符号付き整数での右シフト演算の動作の設定

ANSI C では、コンパイラの負の整数における右シフトの動作を定めていません。そのため、動作はその実行方法によって変わります。[算術シフトとして符号付き整数を右にシフト] オプションは、コード ジェネレーターに負の整数でコンパイラが右シフトをどのように実行するかについて指示します。この情報を指定してもコンパイラの動作は変化しません。この情報は、コード ジェネレーターの動作を規定するだけです。コード ジェネレーターはこの情報を使用して、算術右シフトで生成されるコードを最適化します。

C コンパイラが符号付き整数の右シフトを算術右シフトとして実行する場合は、このオプションを選択します。それ以外の場合は、オプションをオフにします。算術右シフトは、右シフトによって空いたビットを最上位ビットの値で埋めます。これは 2 の補数表現で数値の符号を示します。既定の設定ではこのオプションが選択されています。コンパイラが算術シフトとして右シフトを扱っている場合は、この設定を推奨します。

  • このオプションを選択すると、Simulink モデルが符号付き整数で算術シフトを実行するときはいつでも、コード ジェネレーターは効率的なコードを生成する。

  • このオプションをクリアすると、コード ジェネレーターは完全に移植可能で、かつあまり効率的でないコードを生成して、右算術シフトを実行する。

コンパイラのドキュメンテーションでコンパイラの算術右シフト方法を確認できます。ドキュメンテーションがない場合は実験してこの動作を確認することができます。

Release 14 のハードウェア構成の更新

モデルを Release 14 より前に作成し、それ以降更新していない場合は、[現在の実行ハードウェア デバイスの設定] パラメーター (TargetUnknown) の値は既定で 'on' になります。

モデルを更新するには、[コンフィギュレーション パラメーター][ハードウェア実行][詳細設定パラメーター][テスト ハードウェア][テスト ハードウェアの構成] のボックスをオフにします。または、コマンド ウィンドウで、以下を入力します。

cs = getActiveConfigSet('your_model_name');
set_param(cs,'TargetUnknown','off');

これによって、モデルが次のように更新されます。

  • [テスト ハードウェアを製品ハードウェアと同じにする] パラメーター (ProdEqTarget) を 'on' に設定して有効にする。

  • [製品デバイス ベンダーとタイプ] パラメーター (ProdHWDeviceType) の値を [テスト デバイス ベンダーとタイプ] パラメーター (TargetHWDeviceType) にコピーする。

更新を完了するには、次を行います。

  1. [コンフィギュレーション パラメーター][ハードウェア実行][詳細設定パラメーター][テスト ハードウェア][テスト ハードウェアを製品ハードウェアと同じにする]のボックスをオフにします。この手順は、製品ハードウェアまたはテスト ハードウェアが異なる場合にのみ適用します。

  2. [コンフィギュレーション パラメーター][ハードウェア実行][詳細設定パラメーター] のパラメーターを製品システムとテスト システムで一致するように設定します。

  3. モデルを保存します。

製品ハードウェアの考慮事項

製品ハードウェアを構成する場合は、次の点を考慮してください。

  • 製品ハードウェアでは、MATLAB 開発用コンピューターと異なるワード サイズおよびその他のハードウェア特性をもつことができます。製品ハードウェアまたは MATLAB 開発用コンピューターと異なるコードをハードウェアでプロトタイプできます。コードを生成するときに、コード ジェネレーターはこれらの違いを考慮します。

  • Simulink 製品は製品ハードウェア構成で一部の情報を使用します。この情報により、コード生成なしのシミュレーションが有効になり、生成されたコードの実行と同じ結果が得られるようになります。たとえば、この結果から、製品ハードウェアで発生する可能性のあるハードウェア オーバーフローなどのエラー条件を検出できます。

  • コード ジェネレーターは整数演算および固定小数点演算の Simulink の結果とビットトゥルーを一致させるコードを生成します。使用不可能なデータ長をエミュレートする生成コードの方がエミュレートしないコードよりも非効率的に実行されます。エミュレーションによって整数演算と固定小数点演算の結果の Simulink とのビットトゥルー一致が影響を受けることはありません。

  • アプリケーション開発中にランタイム環境を変更した場合は、コードの生成または再生成を行う前に、新しいランタイム環境のハードウェア実行パラメーターを再構成します。コードが生成されていないハードウェアでコードを実行した場合には、シミュレーション、量産コード、テスト コードの整数演算および固定小数点演算の結果のビットトゥルーが常に一致するとは限りません。

  • モデルから生成されるコードをコンパイルするには、モデルのブロックで [整数丸めモード] パラメーターを使用して、コンパイルに使用する C コンパイラの丸め動作をシミュレートします。この設定は、Product, Matrix Multiply ブロックや n-D Lookup Table ブロックなど、符号付き整数演算を実行できるブロックのパラメーター ダイアログ ボックスの [信号属性] ペインに表示されます。

  • ほとんどのブロックでは、[整数丸めモード] の値によって丸め動作が完全に定義されます。固定小数点データと Simplest 丸めモードをサポートするブロックでは、[符号付き整数の除算の丸め] の値も丸め動作に影響を及ぼします。詳細については、精度 (Fixed-Point Designer)を参照してください。

  • モデルに Model ブロックが含まれる場合は、参照するモデルが同じハードウェア設定を使用するように構成します。

ハードウェア テストの考慮事項

既定では、テスト ハードウェア構成は製品ハードウェアの構成と同じです。生成コードは、製品環境と同じ環境でテストを行う場合に使用できます。

テスト環境と製品環境が異なる場合、製品ハードウェアで動作しているかのようにテスト ハードウェアで動作するコードを次のように生成できます。

  1. テスト ハードウェア パラメーターを有効にするには、[コンフィギュレーション パラメーター][ハードウェア実行][詳細設定パラメーター][テスト ハードウェア][テスト ハードウェアを製品ハードウェアと同じにする] のボックスをオフにします。または、コマンド ウィンドウで次を入力します。

    cs = getActiveConfigSet('your_model_name');
    set_param(cs,'ProdEqTarget','off');
  2. テスト ハードウェア (Target*) パラメーターを介してデバイス タイプの詳細を指定します。

既定のマイクロプロセッサおよびそのハードウェア プロパティを指定するシステム ターゲット ファイルを選択すると、これらの既定値とプロパティが初期値として表示されます。

使用可能な値が 1 つしかないパラメーターは変更できません。ハードウェア プロパティを変更する場合は、それらの値とシステム ターゲット ファイルが一致するように確認してください。一致しない場合、生成されたコードはコンパイルまたは実行できなかったり、実行できても、正しくない結果になる場合があります。

ノーマル モード シミュレーションに影響する製品ハードウェアの設定の例

ProdLongLongModeProdIntDivRoundTo など製品ハードウェア設定の一部を変更すると、ノーマル モード シミュレーションの結果に影響することがあります。次の例では、4 つの入力を伴う加算器をシミュレートします。最初のシミュレーションでは、ProdLongLongMode が無効にされています。2 番目のシミュレーションでは、ProdLongLongMode が有効にされています。シミュレーション出力のプロットで、タイム ステップ範囲 125-175 の出力値間に若干の違いがあることがわかります。

  1. 加算器モデルを作成します。

    model = 'hwSettingEffect';
    new_system(model) 
    open_system(model)
    
    pos = [140   140   200   340];
    add_block('simulink/Math Operations/Add', ...
              [model '/sum_int32'], ...
              'Inputs','++++', ...
              'SaturateOnIntegerOverflow', ...
              'on', ...
              'Position', ...
              pos)
    
    pos = [75   155   105   175];
    add_block('built-in/Inport',[model '/In1'],'Position',pos)
    set_param([model '/In1'], 'OutDataTypeStr', ...
              'int32','PortDimensions','1','SampleTime','1');
    add_line(model, 'In1/1','sum_int32/1')
    
    pos = [75   205   105   225];
    add_block('built-in/Inport',[model '/In2'],'Position',pos)
    set_param([model '/In2'], 'OutDataTypeStr', ...
               'int32','PortDimensions','1','SampleTime','1');
    add_line(model, 'In2/1','sum_int32/2')
    
    pos = [75   255   105   275];
    add_block('built-in/Inport',[model '/In3'],'Position',pos)
    set_param([model '/In3'], 'OutDataTypeStr', ...
              'int32','PortDimensions','1','SampleTime','1');
    add_line(model, 'In3/1','sum_int32/3')
    
    pos = [75   305   105   325];
    add_block('built-in/Inport',[model '/In4'],'Position',pos)
    set_param([model '/In4'], 'OutDataTypeStr', ...
               'int32','PortDimensions','1','SampleTime','1');
    add_line(model, 'In4/1','sum_int32/4')
    
    pos = [275   230   305   250];
    add_block('built-in/Outport',[model '/Out1'],'Position',pos)
    add_line(model, 'sum_int32/1','Out1/1')

  2. 入力データ、シミュレーション時間、およびシミュレーションの出力形式を指定します。

    t = 0:200;
    peakValue = 1.5e9;
    in1 = peakValue * sin(t*2*pi/100);
    in2 = peakValue * cos(t*2*pi/70);
    in3 = -peakValue * sin(t*2*pi/40);
    in4 = -peakValue * cos(t*2*pi/30);
    set = Simulink.SimulationData.Dataset;
    set = set.addElement(1, timeseries(int32(in1),t,'Name','sig1'));
    set = set.addElement(2, timeseries(int32(in2),t,'Name','sig2'));
    set = set.addElement(3, timeseries(int32(in3),t,'Name','sig3'));
    set = set.addElement(4, timeseries(int32(in4),t,'Name','sig4'));
    
    set_param(model, 'LoadExternalInput', 'on');
    set_param(model, 'ExternalInput', 'set');
    
    set_param(model, 'StopTime', '50');
    
    set_param(model, 'ReturnWorkspaceOutputs', 'off');

  3. 製品ハードウェア設定を無効にし、1 つ目のシミュレーションを実行します。

    set_param(model, 'ProdLongLongMode', 'off');
    [~, ~, y1] = sim(model, 200);

  4. 製品ハードウェア設定を有効にし、2 つ目のシミュレーションを実行します。

    set_param(model, 'ProdLongLongMode', 'on');
    [~, ~, y2] = sim(model, 200);

  5. シミュレーションの出力をプロットします。

    plot([y1 y2]);
    figure(gcf);

動作の違いは Sum ブロックのアキュムレータ データ型によるものです。[アキュムレータのデータ型] ブロック パラメーターが [Inherit: Inherit via internal rule] に設定されます。この例では、C long long データ型が有効になっている場合は結果のアキュムレータ データ型が 64 ビット幅になります。それ以外の場合は 32 ビット幅になります。Sum ブロックの入力値によっては、64 ビット アキュムレータが飽和しないときに 32 ビット アキュムレータが飽和することができます。そのため、ノーマル モード動作が ProdLongLongMode 設定に依存することがあります。いずれの場合も、ノーマル モード動作と製品ハードウェア動作はビット単位で一致します。

関連するトピック