Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

モデル内でバス信号を使用して、複数の信号を 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;
}

参考

関連するトピック