C コード生成のためのルートレベルの Outport ブロックの構成
モデルから生成するコードを使用するには、生成されたエントリポイント関数を呼び出します。呼び出しの環境と生成される関数は、たとえばグローバル変数や関数の引数として、入力データと出力データを交換します。ルートレベルの Outport ブロック (出力端子) がインターフェイスの出力データを構成します。生成されたコードをより大きなアプリケーションに統合して展開するため、出力データの宣言と取り扱いの方法を含め、コード ジェネレーターがインターフェイス コードを生成する方法をカスタマイズできます。カスタマイズにより、次のことができます。
既存のコードに行う変更の最小化。
モデルに変更を行う場合に、変更しない、あるいは最小限の変更しか行わない、安定したインターフェイスの生成。
データをより効率的に交換するコードの生成 (たとえば、非スカラー データに対するポインターおよび参照渡しの引数の使用による)。
コード生成について、この例ではモデル ConfigurationRapidPrototypingInterface
について Outport インターフェイスをカスタマイズする方法を説明します。コード マッピング エディター – C またはコード マッピング API (coder.mapping.api.CodeMapping
) を使用してコード マッピングを構成できます。
Outport インターフェイスのカスタマイズ オプションの選択
既定では、モデルのルートレベルの Outport は、生成されたコードでは
という名前のグローバル データ構造体のフィールドとして表示されます。コード インターフェイスの要件に基づいて、Outport データの生成をカスタマイズするかどうかを決定します。カスタマイズを構成しない場合、コード ジェネレーターは生成されたコード内の Outport の表現を最適化目的で削除するか変更するかを判断します。カスタマイズを構成する場合は、以下を決定します。model
_ExtY
既定の構成を設定するかどうか
モデルに多数 (たとえば 10 より多い) のルートレベルの Outport が含まれている場合、それらの Outport を既定の設定で構成して、それから特殊な場合についてその設定をオーバーライドすることがより効率的です。モデルに固有のソース、名前、または配置要件をもつ少数の Outport が含まれている場合は、その Outport を個別に構成することを検討します。
生成されたインターフェイスで Outport データを宣言し取り扱う方法
個別のグローバル変数として
外部コードで定義されているグローバル変数に出力データを書き込む
参照モデルの Outport の場合にグローバル変数 (
void-void
) としてアクセス関数への呼び出しとして。Embedded Coder® が必要
エントリポイント関数の引数として。Embedded Coder が必要
これらのオプションの詳細については、生成コードでのデータと関数インターフェイスの制御を参照してください。
その他の考慮事項には次のものがあります。
モデル内で表示される Outport ブロック ラベルを使用して、または一意のコード識別子を使用して、生成されたコード内の Outport に名前を付けるかどうか。
volatile
型の修飾子をグローバル変数定義および宣言に含めるかどうか。Embedded Coder が必要です。型修飾子 const と volatile を使用したグローバル データの保護 (Embedded Coder)を参照してください。メモリの特定の領域からデータを書き込むかどうか。Embedded Coder が必要です。Control Data and Function Placement in Memory by Inserting Pragmas (Embedded Coder)を参照してください。
対応するストレージ クラスとストレージ クラス プロパティをもつ Outport に関連するインターフェイス要件のリストについては、生成されたコードでのデータ表示を制御するストレージ クラスの選択を参照してください。
モデル例 ConfigurationRapidPrototypingInterface
の Outport のインターフェイス要件は次のとおりです。
ルートレベルの Outport
Out1
のデータを外部ヘッダー ファイルに書き込む。Out1
で書き込まれたデータは Switch ブロックについて生成されたコードの出力です。生成されたコードで Outport を表す変数は
output
という名前でなければならない。
この例では、ConfigurationRapidPrototypingInterface
の Outport を構成して、これらのコード生成要件を満たすようにします。
ルートレベルの Outport に対する既定のコード生成設定の構成
ルートレベルの Outport に対する既定のコード生成設定を使用すると、特に、モデルに多数の Outport がある場合に、コード生成のためのモデルの準備作業を削減できます。構成設定を一度選択すると、コード ジェネレーターによってこれらの設定がモデル全体の Outport に適用されます。Simulink® は既定の構成をモデルの一部として保存します。
固有の要件がないルートレベルの Outport がモデルで複数使用されている場合は、モデルの Outport について既定のコード生成設定を構成することを検討します。
モデル例 ConfigurationRapidPrototypingInterface
には 1 つのルートレベルの Outport が含まれています。この例では、コード マッピング エディター – C を使用して、ルートレベルの Outport について既定の設定を構成する方法を説明します。コード ジェネレーターが、生成された外部ヘッダー ファイルと定義ファイルのルート Outport を表す変数を宣言し定義することを指定します。
モデル例
ConfigurationRapidPrototypingInterface
を開きます。書き込み可能な場所にモデルのコピーを保存します。Simulink Coder アプリを開きます。
[C コード] タブで、[コード インターフェイス] 、 [既定のコード マッピング] を選択します。
コード マッピング エディターの [Inports and Outports] でカテゴリ [出力端子] を選択します。既定のストレージ クラスを
[ExportedGlobal]
に設定します。モデルを保存します。
個別のルートレベル Outport に対するコード生成設定の構成
コード生成について、個別のルートレベルの Outport を構成できます。たとえば、固有のコード生成要件をもつルートレベルの Outport がモデルに 2 つある場合には、Outport を個別に構成します。または、Outport に対して既定の設定を構成する場合、個別の Outport を、既定の設定を使用するか、または固有の設定を使用するよう構成します。
モデルが以下の条件のうち少なくとも 1 つを満たす場合、Outport に対して個別にコード生成設定を構成することを検討してください。
固有の要件をもつ Outport を複数使用する。
使用する Outport が少数である。
Outport について既定の構成があり、いくつかの Outport について、その構成をオーバーライドする必要がある。
この例では、コード マッピング エディターを使用して、モデル ConfigurationRapidPrototypingInterface
の Outport に既定のコード生成構成を適用する方法を説明します。前の例で、Outport の既定のストレージ クラスを ExportedGlobal
に設定しました。
この例では、コード ジェネレーターが、生成されたコードで Outport に名前を付けるために使用する識別子を構成する方法も説明します。コード生成識別子は、たとえば統合用に、モデル設計の変更を伴わずに指定できます。
まだ実行していない場合は、ルートレベルの Outport に対する既定のコード生成設定の構成の手順を完了します。
コード マッピング エディターで、[出力端子] タブをクリックします。エディターに、モデル内の Outport ブロックの名前とバス要素の名前がリストされます。端子が信号オブジェクトに関連付けられる場合、信号オブジェクトへの関連付けアイコンが要素名の右側に表示されます。モデル例の Outport のストレージ クラスは
Auto
に設定されています。これは、最適化を目的として、コード ジェネレーターが関連するコードの表現を削除または変更する可能性があるということを意味します。最適化が不可能な場合、コード ジェネレーターはモデルの既定の構成を適用します。この例の場合、モデルの既定の構成はストレージ クラスExportedGlobal
を指定します。最適化を回避し、コード ジェネレーターで既定の構成が強制的に使われるようにするには、ストレージ クラスを
[Model default]
に設定します。既定の構成をオーバーライドするには、その Outport のコード生成に関する要件を満たすストレージ クラスを指定します。
コード ジェネレーターを構成し、既定のストレージ クラス設定が Outport
Out1
に適用されるようにします。Outport の行を選択します。ストレージ クラスを[Model default:ExportedGlobal]
に設定します。選択した Outport のストレージ クラスが
[Model default:ExportedGlobal]
に変更されます。Outport のコード識別子を構成して、生成されたコードでのインターフェイス引数名が外部コードで使用されるインターフェイス引数名と一致するようにします。コード マッピング エディターで、Outport の行を選択します。 アイコンをクリックして、[識別子] プロパティを
output
に設定します。モデルを保存します。
コードを生成して表示します。たとえば、ファイル
ConfigurationRapidPrototypingInterface.c
で、ステップ エントリポイント関数内で変数output
が使用されている場所を見つけます。if (mode) { output = (real_T)mp_K1 * dout_Table1; } else { output = dstate_X; }
ルートレベルの Outport についてのプログラムでのコード生成設定の構成
コード生成のためのルートレベルの Outport の構成を自動化するには、コード マッピングのプログラミング インターフェイスを使用します。たとえば、カスタム ブロック ライブラリまたはアプリケーション テスト環境の一部を作成する場合は、プログラミング インターフェイスを使用してデータの構成を自動化します。
この例では、プログラミング インターフェイスを使用して、モデル ConfigurationRapidPrototypingInterface
についてルートレベルの Outport の既定の設定を構成する方法を説明します。ルートレベルの Outport は、出力を別個のグローバル変数に書き込みます。
Outport について識別子を構成して、生成されたコードでのグローバル変数名が外部コード インターフェイスの変数名と一致するようにします。
モデル例を開きます。
openExample("ConfigurationRapidPrototypingInterface")
関数
coder.mapping.api.get
を呼び出してオブジェクトcm
を作成します。オブジェクトには、モデルConfigurationRapidPrototypingInterface
のデータ要素についてのコード生成の構成が格納されます。cm = coder.mapping.api.get("ConfigurationRapidPrototypingInterface");
関数
setDataDefault
を呼び出して Outport の既定の設定を構成します。引数には、次の値を指定します。coder.mapping.api.get
で返されるオブジェクト既定のカテゴリの
Outports
プロパティ値
ExportedGlobal
をもつプロパティ名StorageClass
setDataDefault(cm,"Outports","StorageClass","ExportedGlobal")
Outport の既定の構成を検証します。
coder.mapping.api.get
によって返されるオブジェクト、カテゴリOutports
、およびStorageClass
を指定するgetDataDefault
の呼び出しを発行します。getDataDefault(cm,"Outports","StorageClass")
ans = 'ExportedGlobal'
既定の Outport の構成を Outport
Out1
に適用します。既定では、Simulink は個別の Outport のストレージ クラスを
Auto
に設定します。ストレージ クラスがAuto
の場合、コード ジェネレーターは次を行います。最適化目的で生成されたコードからデータを削除するかどうかを決定する。
データを保持する場合、既定の構成設定を考慮して、生成されたコード内でデータを効率的に表す方法を決定する。
Outport の構成を制御するには関数
setOutport
を呼び出します。次を指定する
setOutport
への呼び出しを発行します。coder.mapping.api.get
によって返されるオブジェクトOutport ブロック名
Out1
プロパティ
StorageClass
およびプロパティ値Model default
を使用して Outport について以前に設定された既定のストレージ クラスプロパティ
Identifier
およびプロパティ値output
setOutport(cm,"Out1","StorageClass","Model default","Identifier","output");
関数
getOutport
を呼び出して構成の変更を検証します。coder.mapping.api.get
によって返されるオブジェクト、Outport ブロックの名前、およびプロパティStorageClass
またはIdentifier
を指定します。getOutport(cm,"Out1","StorageClass") ans = 'Model default' getOutport(cm,"Out1","Identifier") ans = 'output'
モデルを保存します。
コードを生成して表示します。たとえば、ファイル
ConfigurationRapidPrototypingInterface.c
で、ステップ エントリポイント関数内で変数output
が使用されている場所を見つけます。if (mode) { output = (real_T)mp_K1 * dout_Table1; } else { output = dstate_X; }
ルートレベルの Outport に対するストレージ クラスとストレージ クラス プロパティの選択
コード生成の要件に応じて、ルートレベルの Outport に対してコード生成を構成するストレージ クラスを次から選択します。
要件 | 既定のマッピングのストレージ クラス | 個別のマッピングのストレージ クラス |
---|---|---|
より効率的なコードを生成するように、最適化を有効にします。 | Auto | |
最適化できないデータ要素の場合、データを標準のデータ構造体のフィールドとして表します。 | 既定値 | |
最適化によってデータ要素のストレージが削除されるのを防ぎ、データ要素のカテゴリに対して既定のマッピングを使用します。 | Model Default | |
グローバル変数の定義と宣言を生成します。 | ExportedGlobal | ExportedGlobal |
外部コードで定義されたグローバル変数またはグローバル変数のポインターに対して読み取りと書き込みを実行するコードを生成します。 | ImportedExtern、ImportedExternPointer | ImportedExtern、ImportedExternPointer |
使用可能なストレージ クラスのリストには、Embedded Coder ディクショナリで定義された他のプロジェクト固有のストレージ クラスが含まれている可能性があります。リストされているストレージ クラスでは満たされない特別な要件がある場合、Embedded Coder ソフトウェアをお持ちであれば、ストレージ クラスを定義できます。Define Service Interfaces, Storage Classes, Memory Sections, and Function Templates for Software Architecture (Embedded Coder)を参照してください。
個別の Outport について、[Identifier] ストレージ クラス プロパティを使用して、生成されたコードでその Outport を表す変数の名前を構成します。[Identifier] プロパティを空白のままにすると、コード ジェネレーターは Outport ブロックの [信号名] パラメーターを使用します。このパラメーターが空の場合、コード ジェネレーターは Outport ブロックの名前を使用します。
参考
コード マッピング エディター – C | coder.mapping.api.CodeMapping