Main Content

効率的なコード生成に向けてモデルを最適化する設計手法

モデル アドバイザーを使用したモデルの最適化

モデル アドバイザーを使うと、コード生成に向けてモデルを解析して、量産展開の妨げやコード効率の制限となるモデルの問題点を検出できます。モデルの現在のコンフィギュレーションに対して実行する検査の集合から選択できます。モデル アドバイザーはモデルを解析して、検査結果と共に各領域の改善提案を生成します。モデル アドバイザーの診断のほとんどは、モデルがコンパイルされた状態になっていることを要求しませんが、必要な場合はその旨ただし書きがあります。

モデル アドバイザーを実行する前に、コード生成で指定する予定のターゲットを選択します。モデル アドバイザーは ERT および ERT ベースのシステム ターゲット ファイルで最も効果的に動作します。

モデル アドバイザーの使用方法の詳細については、モデル アドバイザー チェックの実行を参照してください。チェックの詳細については、モデル アドバイザー チェックを参照してください。

コード生成用にモデルを最適化する設計手法

コード生成用にモデルを最適化するために次の手法を適用できます。

  • Embedded Coder® ユーザーの場合、アプリケーションで整数演算のみ使用する場合、[インターフェイス] ペインの [ソフトウェア環境] セクションで [サポート: 浮動小数点数] パラメーターをオフにして、生成コードに浮動小数点データまたは演算が含まれないようにします。このパラメーターがオフの場合、コード生成中に非整数データまたは式が発生すると、エラーが生じます。エラー メッセージには問題のブロックおよびパラメーターが示されます。

  • [コンフィギュレーション パラメーター][コード生成][インターフェイス][詳細設定パラメーター][MAT ファイルのログ] パラメーターを無効にします。このパラメーターをオフにすると、ログ変数の初期化、更新、およびクリーン アップに必要な追加のコードおよびメモリ使用量が除外されます。さらに、MAT ファイルのログをサポートするために生成されたコードは malloc を呼び出します。これは、アプリケーションに望ましくない可能性があります。

  • アップグレード アドバイザーを使用して、現在の機能を使用するために古いモデルをアップグレード (以前のバージョンまたは現在のバージョンで保存) します。詳細については、モデルのアップグレードを参照してください。

  • ビルドの前に、コンパイラに最適化フラグ (たとえば、-O2gcc に、-OtMicrosoft® Visual C++® コンパイラに) を設定します。

  • S-Function の TLC ファイルを書いて、C/C++ S-Function を生成されたコードに直接インライン化します。詳細については、モデルまたはサブシステムの S-Function ターゲットの使用およびC MEX S-Function のインライン化を参照してください。

  • 可能な限り double 以外の Simulink® データ型を使用します。使用可能なデータ型は、Boolean、符号付きと符号なしの 8、16、32 ビット整数、および 32、64 ビット浮動小数点数です (double は 64 ビット浮動小数点数)。詳細については、Simulink におけるデータ型についてを参照してください。ブロックごとの要約の表示には、showblockdatatypetable をクリックするか、そのコマンドをコマンド ウィンドウに入力してください。

  • 生成されたコード内のメモリに保存するように設定した調整可能なブロック パラメーターの場合、パラメーターのデータ型と信号データ型を一致させることで、不要な型変換と C シフトを排除できます。可能な限り、パラメーター値は小さな整数データ型に保存してください。生成されたコードにおけるパラメーターのデータ型を参照してください。

  • ルックアップ テーブル データで繰り返されている値を削除します。

  • Merge ブロックを使って、可能な限り信号の出力をマージします。Stateflow® チャートで Function-Call Subsystem の実行を制御する必要があるとき、このブロックは特に役に立ちます。次のモデルは Merge ブロックをどう使用するかの例を示します。

    Merge ブロックに接続された 1 つを超える信号が Auto 以外のストレージ クラスをもつ場合、そのブロックに接続されたすべての Auto 以外の信号は、同じ名前同じストレージ クラスをもたなければなりません。Merge ブロック同士が直接接続される場合、そのグループの Merge ブロックに接続される信号にこれらのルールが適用されます。

コード生成に向けて Stateflow オブジェクトを最適化する設計手法

グラフィカル関数のインライン オプションを明示する

Stateflow チャートでグラフィカル関数を使用する場合は、[関数インライン オプション] プロパティとして [インライン] または [関数] を選択します。そうしないと、グラフィカル関数に対して生成されたコードが希望とおりに表示されない場合があります。詳細については、グラフィカル関数のプロパティの指定 (Stateflow)を参照してください。

Stateflow チャートで複数のエッジトリガー イベントを使用しない

1 つ以上のトリガーを使用する場合は、立ち上がりエッジまたは立ち下がりエッジの検出を処理する複数のコード ステートメントを生成します。複数のトリガーが必要な場合は、代わりに関数呼び出しイベントを使用します。詳細については、入力イベントの送信による Stateflow チャートのアクティブ化 (Stateflow)を参照してください。

チャートの入力信号を単一のバス オブジェクトに統合する

バス オブジェクトを使用する場合は、生成される関数のパラメーター リストに含まれるパラメーターを減らします。このガイドラインは、チャートの出力信号にも適用されます。詳細については、Stateflow 構造体の定義 (Stateflow)を参照してください。

離散サンプル時間によるチャートの使用

Triggered Subsystem または Enabled Subsystem 内にない離散チャート用に生成されたコードでは、Simulink が提供する時間ではなく、整数カウンターを使用して時間を追跡します。これにより、オーバーヘッドおよびメモリの観点からより効率的なコード生成が可能になるほか、ソフトウェアインザループ (SIL) およびプロセッサインザループ (PIL) のシミュレーションでこのコードが使用可能になります。

関連するトピック