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