Main Content

外部の呼び出しコードと生成コード間のデータ交換

生成コードを外部コードにエクスポートするには、外部コードのデータ インターフェイスに一致するように生成コードを設定します。たとえば、外部コードで出力データを格納するためのグローバル変数が定義され、生成コードにそのデータを入力として読み取らせる必要がある場合、生成コードが既存の変数を操作するように対応する Inport ブロックを構成できます。

  • モデルから再呼び出し可能なコードを生成できます。通常、生成されたエントリポイント関数は引数を介してデータを受け取ります。呼び出しコードはこれらの引数を介してデータを渡します。1 つのアプリケーションで関数を複数回呼び出すことができ、アプリケーションはモデルの複数のインスタンスを維持できます。再呼び出し可能な生成コードのデータ交換を参照してください。

  • 再呼び出し不可能なコードを生成すると、既定では、エントリポイント関数は生成コードと独自のコード間でグローバル変数を介してデータを交換します。コードの変数定義を生成して使用するか、コードで既に定義されている既存の変数を共有および再利用できます。再呼び出し不可能な生成コードのデータ交換を参照してください。

    代わりに、グローバル変数ではなく引数を介してシステムの入力と出力 (ルートレベルの Inport ブロックと Outport ブロック) を交換するようにエントリポイント関数を構成することもできます。関数プロトタイプ コントロールをモデルに適用します。これには Embedded Coder® が必要です。関数プロトタイプの制御の詳細については、生成された C 関数インターフェイスをモデルのエントリポイント関数用に構成 (Embedded Coder)を参照してください。

生成コードと外部コード間のデータ交換に関する一般的な情報については (特定の C コード パターンに一致させる方法など)、外部 C/C++ コードと Simulink モデルまたは生成コード間のデータ交換を参照してください。

再呼び出し可能な生成コードのデータ交換

再呼び出し可能なコードを生成すると、モデルのエントリポイント関数は引数を介してデータを交換します。引数の一部の特性を制御できます。詳細については、生成コードでのデータと関数インターフェイスの制御を参照してください。

外部コードの各呼び出しサイトに対する個別のデータセットの作成の詳細については、Modify Static Main to Allocate and Access Model Instance Data (Embedded Coder)を参照してください。

再呼び出し不可能な生成コードのデータ交換

生成コードが信号、状態またはパラメーター データの項目をグローバル変数として読み取りまたは書き込むようにするには、ストレージ クラスをモデル内のデータに適用します。ストレージ クラスは、生成コードが変数定義を外部コードにエクスポートするか、あるいは定義をコードからインポートするかも決定します。再呼び出し不可能なコードを生成するように構成されたモデルのデータ インターフェイスの制御に関する一般的な情報については、再呼び出し不可能なコードのデータ インターフェイスの制御を参照してください。例については、Inport ブロックと Outport ブロックの設定によるデータ インターフェイスの設計Integrate External Application Code with Code Generated from PID Controller (Embedded Coder)を参照してください。

グローバル データの定義 (メモリの割り当て) を行うコードを生成する場合、生成コードはそのデータをエクスポートします。外部コードがデータを定義する場合、生成コードはそのデータをインポートします。通常、データをインポートするストレージ クラスは、そのストレージ クラス名に Import という単語が含まれています (たとえば ImportedExternPointer)。

エクスポートされたグローバル データのファイル配置の制御 (Embedded Coder)

ストレージ クラスを使用して生成コードからデータをエクスポートするときに、コード ジェネレーターは extern 宣言を作成します。既定では、この宣言は生成されたヘッダー ファイル model.h に表示されるのが一般的です。このヘッダー ファイルは外部コードに含める (#include) ことができます。

既定では、エクスポートされたデータの定義 (メモリの割り当て) は model.c に表示されるのが一般的です。

宣言と定義のファイル配置を制御して、以下を行うことができます。

  • グローバル パラメーター データのみを格納する個別のオブジェクト ファイルを作成する。

  • 宣言を個別のファイルに整理することで生成コードをモジュール化する。

宣言と定義のファイル配置の制御の詳細については、Control Placement of Global Data Definitions and Declarations in Generated Files (Embedded Coder)を参照してください。例については、パラメーター データの定義、初期化および宣言 (Embedded Coder)を参照してください。

グローバル変数の初期化コードの重複を防止

外部コードでグローバル変数を定義する場合、それらの変数を操作するコードを生成できます。たとえば、ストレージ クラス ImportFromFile を使用します (生成されたコードでのデータ表示を制御するストレージ クラスの選択を参照)。

信号や状態データを表すインポートされた変数に対して、コード ジェネレーターは生成されたコードでの信号、状態、パラメーター データの初期化で説明されているように初期化コードを生成することができます。コードで既に変数を初期化している場合は、重複する初期化コードの生成を防止することを検討してください。独自のストレージ クラスを作成し、そのストレージ クラスの [データの初期化][なし] に設定します。独自のストレージ クラスの作成と適用の詳細については、Define Service Interfaces, Storage Classes, Memory Sections, and Function Templates for Software Architecture (Embedded Coder)を参照してください。

キーワード constvolatile を使用したグローバル データの保護

外部コードと生成コードがグローバル変数を介してデータを交換する場合、C 型修飾子 constvolatile を使用してデータの整合性を保護し、アプリケーションの安全性を向上させるコードを生成することができます。次に例を示します。

  • キャリブレーション パラメーターに const を適用する。

  • 非同期的に動作するハードウェア デバイスの出力を格納するグローバル変数に volatile を適用する。

  • 外部コードによって定義されたデータを表す信号、状態、およびパラメーターに constvolatile を適用する。その後、生成コードで対応するストレージ型修飾子を使用して外部データを宣言および操作する。

Embedded Coder がなければなりません。詳細については、型修飾子 const と volatile を使用したグローバル データの保護 (Embedded Coder)を参照してください。

関連するトピック