メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

バスの効率的なコードの生成

モデル内でバスを使用して、複数の信号を 1 つの信号線にパッケージします。バーチャルまたは非バーチャルのバスを作成できます。生成コード内での表現は次の内容に依存します。

  • バーチャル バスの場合、生成コードではバスが存在しないかのように見えます。

  • 生成された非バーチャル バスのコードでは、バス データを構造体で表します。モデルとコードの対応を追跡する際に、生成されたコードの構造体を使用すると便利です。非バーチャル バスを使用して構造体を生成する方法については、生成されたコードにおける構造体へのデータの整理を参照してください。

バスの一般的な情報については、合成インターフェイスのガイドラインを参照してください。

バスを含むモデルから効率的なコードを生成するためには、モデルを構築するときにベスト プラクティスに従って不必要なデータ コピーを排除します。

バスのコードの効率性

コード生成を行うモデルでバスを使用する場合、次の点に注意します。

  • バス診断コンフィギュレーション パラメーターを設定することで、モデルの開発が容易になる場合があります。

  • バスの実装手法と、非バーチャル バスまたはバーチャル バスの選択が、生成コードの速度、サイズ、明確性に影響する場合があります。

  • 一部の有用なバスの実装手法は、一見明らかではありません。

バスについて作業するときには、これらのガイドラインが結果の改善に役立ちます。ガイドラインでは次の手法について説明しています。

  • モデルのレイアウトの簡略化。

  • 生成コードの効率性の向上。

  • 関数 (サブシステム) インターフェイスのデータ構造体の定義。

  • 外部 C コードの既存のデータ構造体と一致するデータ構造体の定義。

速度、サイズ、明確性の間にはいくつかのトレードオフがあります。たとえば、非バーチャル バスはコード内に構造体として現れるため、非バーチャル バスのコードは読みやすくなりますが、バーチャル バスは信号データのコピーを必要としないため、バーチャル バスのコードはより速くなります。アプリケーション開発プロセスのどの段階にいるかに基づいて、ガイドラインをいくつか適用してください。

バス診断の設定

Simulink® はバス使用の最適化に使用できる診断機能を提供しています。[コンフィギュレーション パラメーター][診断][接続性] ペインで次のコンフィギュレーション パラメーターを使用します。

バーチャル バスと非バーチャル バスの最適化

バーチャル バスは生成コードに影響しない便宜的なグラフィックス表記です。結果としてコード生成エンジンはバス内の信号を十分に最適化できます。効率的なコードを生成するには、非バーチャル バスよりもバーチャル バスを使用します。Signal Conversion ブロックを使用して、バーチャル バスと非バーチャル バスの間で変換できます。必要な場合、Simulink によって自動的にバーチャル バスが非バーチャル バスに変換されることもあります。たとえば、Stateflow® チャートでは、入力バーチャル バスが非バーチャル バスに変換されます。

関数呼び出し信号をまとめるためには、バーチャル バスを使用しなければなりません。

次の場合は非バーチャル バスを使用しなければなりません。

  • 非自動ストレージ クラス

  • バスからの専用の構造体の生成

  • 混在するデータ型をバスがもつ場合の、ルートレベルの Inport ブロックまたは Outport ブロック

非バーチャル バスでの非ローカルな入れ子にされたバスの回避

バスは他のバスを含むことができます。効率的なコードを生成するには、入れ子にされたバスのストレージ クラスを Auto に設定します。ストレージ クラスを Auto に設定すると、次を排除することができます。

  • 入れ子にされたバスと親のバスの冗長なメモリの割り当て

  • 追加のコピー命令 (データを入れ子にされたバスにコピーし、次に入れ子にされたバスから最後のバスにコピーする)

このモデルには非バーチャル バスが含まれています。入れ子にされたバス Sub_Bus_1 および Sub_Bus_2 は、ストレージ クラス Auto を使用します。

生成されたコード アルゴリズムでは、入力信号データをバスに効率的に代入しています。

void ex_nonvirtual_buses_step(void)
{
  Nonvirtual_In_One.SimpleBus_1.A1 = A1;
  Nonvirtual_In_One.SimpleBus_1.A2 = A2;
  Nonvirtual_In_One.SimpleBus_2.A3 = A3;
  Nonvirtual_In_One.SimpleBus_2.A4 = A4;
  Nonvirtual_In_One.A5 = A5;
}

参考

トピック