このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
バス信号の効率的なコードの生成
モデル内でバス信号を使用して、複数の信号を 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; }