Main Content

生成された C 関数インターフェイスをモデルのエントリポイント関数用に構成

エントリポイント関数とは

エントリ ポイントは、プログラム コントロール (実行) の転送が行われるコード内の場所です。main 関数 (main()) は C/C++ プログラムへのエントリ ポイントであり、アプリケーションが実行を開始すると呼び出されます。たとえば、関数 main などから、他の関数への呼び出しによって、関数コードにエントリ ポイントが提供されます。プログラム コントロールは呼び出される関数に転送されます。関数のコードが実行され、終了すると、コントロールが main または他の呼び出し関数に返されます。

モデルのコードを生成するときに、コード ジェネレーターは生成されたコードを実行するために呼び出すことができる一連のエントリポイント関数を定義します。生成された関数は、外部コードまたは変更する生成された main 関数のバージョンから呼び出すことができます。

コード生成レポートの [コード インターフェイス レポート] セクションに、コード ジェネレーターがモデルに対して生成するエントリポイント関数が一覧表示されます。詳細については、Analyze Generated Data Code Interface Report (Embedded Coder)を参照してください。

生成されたエントリポイント関数のタイプ

コード ジェネレーターは以下のタイプのモデル関数に対してエントリポイント関数を生成します。

モデル関数のタイプモデル ソース名生成された既定の関数名説明
エクスポートした関数 (Embedded Coder® が必要)ExportedFunction:slIdentifier。ここで、slIdentifier はモデル内の関数呼び出し Inport ブロックの名前です。function-call-inport-block-name または signal-label (指定した場合)エクスポートした関数モデルの場合、サブシステムのエクスポート関数。
初期化関数Initializemodel_initialize

モデルの初期化コード。アプリケーション コードの開始位置で関数を "一度" 呼び出します。この関数を使用してリアルタイム モデル データ構造体 (rtM) をリセットしないでください。

分割関数Partition:slIdentifier。ここで、slIdentifier はモデル内のブロックから明示的に作成され、Simulink® スケジュール エディターに表示される分割 (P1 など)、または [同時実行] ダイアログのタスク名です。model_stepn。ここで、n はいずれかのモデル サンプル周期に対して生成された関数を一意に識別します。モデル分割の場合、出力および更新コード。モデル コンフィギュレーション パラメーター [1 つの出力/更新関数] はオンです (既定の設定)。
分割更新関数PartitionUpdate:slIdentifier。ここで、slIdentifier はモデル内のブロックから明示的に作成され、Simulink® スケジュール エディターに表示される分割 (P1 など)、または [同時実行] ダイアログのタスク名です。model_outputnmodel_updaten。ここで、n はいずれかのモデル サンプル周期に対して生成された関数を一意に識別します。モデル分割の場合、個別の関数内の出力および更新コード。モデル コンフィギュレーション パラメーター [1 つの出力/更新関数] はオフです。
周期的なマルチタスク関数Periodic:slIdentifier,。ここで、slIdentifier はマルチタスク モデル (D1 など) の周期レートまたは連続レートに対するサンプル時間の周期に対応する注釈です。model_stepn。ここで、n はいずれかのモデル サンプル周期に対して生成された関数を一意に識別します。マルチタスクに対して構成されたレートベース モデル内のブロックの場合、出力および更新コード。コード ジェネレーターはサンプル周期ごとに関数を生成します。モデル コンフィギュレーション パラメーター [1 つの出力/更新関数] はオンです (既定の設定)。
周期的なマルチタスク更新関数PeriodicUpdate:slIdentifier,。ここで、slIdentifier はマルチタスク モデル (D1 など) の周期レートまたは連続レートに対するサンプル時間の周期に対応する注釈です。model_outputnmodel_updaten。ここで、n はいずれかのモデル サンプル周期に対して生成された関数を一意に識別します。マルチタスクに対して構成されたレートベース モデル内のブロックの場合、個別の関数内の出力および更新コード。コード ジェネレーターはサンプル周期ごとに出力関数と更新関数を生成します。モデル コンフィギュレーション パラメーター [1 つの出力/更新関数] はオフです。
周期的なシングルタスク関数Periodicmodel_stepシングルタスクに対して構成されたレートベース モデル内のブロックの場合、出力および更新コード。モデル コンフィギュレーション パラメーター [1 つの出力/更新関数] はオンです (既定の設定)。
周期的なシングルタスク更新関数PeriodicUpdatemodel_output および model_updateシングルタスクに対して構成されたレートベース モデル内のブロックの場合、個別の関数内の出力および更新コード。モデル コンフィギュレーション パラメーター [1 つの出力/更新関数] はオフです。
リセット関数Reset:slIdentifier,。ここで slIdentifier はモデル内のリセット関数の名前です。model_reset-function-name

モデルに Reset Function ブロックが含まれている場合、生成されるリセット コード。条件または状態をリセットするには、アプリケーション コードから関数を呼び出します。

Simulink FunctionSimulink Function:slIdentifier,。ここで slIdentifier はモデル内の Simulink Function ブロックの名前です。グローバルな Simulink Function ブロックの function-name またはスコープ内の Simulink Function ブロックの model_function-nameエクスポートした関数モデルの場合、Simulink Function ブロックのエクスポート関数。
終了関数Terminatemodel_terminate

システムをオフにするコード。ERT ベースのモデルの場合、モデル コンフィギュレーション パラメーター[終了関数が必要] (Embedded Coder) (既定で設定されている) をオフにしてこの関数の生成を抑制できます。

Embedded Coder® ソフトウェアをお持ちの場合、外部コードと生成コードの統合を容易にして、コードの標準とガイドラインに準拠するために、コード ジェネレーターがモデルまたはサブシステムから関数インターフェイスを生成する方法を構成できます。

エントリポイント関数が再利用可能かどうかを設定

既定では、コード ジェネレーターは、最上位モデルに対して再利用または再呼び出し可能でないコードを生成します。エントリポイント関数には void-void インターフェイスがあります。コードは、共有メモリ内にあるグローバル データ構造体に直接アクセスすることで他のコードとやりとりします。

アプリケーションに再利用可能なマルチインスタンスのエントリポイント関数コードが必要な場合、一意のデータを使用して各関数 (インスタンス) を呼び出すようにコード ジェネレーターを構成できます。この場合、コードは再呼び出し可能です。

モデル コンフィギュレーション パラメーターの[コード インターフェイスのパッケージ化]および関連するパラメーターを使用して、エントリポイント関数が再利用可能かどうかを設定します。選択するパラメーター設定は、システム ターゲット ファイル、プログラミング言語および引数インターフェイスに関するコンフィギュレーション選択などの要因によって異なります。

単一インスタンスの C エントリポイント関数の既定の設定

既定では、GRT ベースおよび ERT ベースのシステム ターゲット ファイルに対して、コード ジェネレーターは単一インスタンスの C エントリポイント関数を生成します。生成コードは次を実行します。

  • 引数のない実行関数を作成する (void-void)。

  • (コンパイル時に) モデル データ構造体に対してメモリを静的に割り当てる。

単一インスタンスのエントリポイント関数のコードを構成するための既定のモデル コンフィギュレーション パラメーター設定は次の通りです。

再利用可能なマルチインスタンス C エントリポイント関数の生成

GRT ベースまたは ERT ベースいずれかのシステム ターゲット ファイルに対して再利用可能なエントリポイント関数を C で生成するようにコード ジェネレーターを構成できます。ただし、既定では、コード ジェネレーターが生成する関数インターフェイスはさまざまです。モデル コンフィギュレーション パラメーター[言語][C] に設定され、[コード インターフェイスのパッケージ化][再利用可能な関数] に設定されていると仮定すると、コード ジェネレーターは各システム ターゲット ファイル シナリオに対してこのエントリ ポイント関数コードを生成します。

システム ターゲット ファイルインターフェイス
GRT ベース
  • 再呼び出し可能で、再利用可能なマルチインスタンスの C エントリポイント関数。

  • モデルのルートレベルの Inport ブロックと Outport ブロックの値をリアルタイム モデル データ構造体にパックします。この構造体を実行関数に引数として参照渡しします。

  • モデル インスタンスのデータの実行時にメモリを動的に割り当てます。malloc などの関数を呼び出すことでメモリを割り当てます。

ERT ベース
  • 再呼び出し可能で、再利用可能なマルチインスタンスの C エントリポイント関数。

  • 各モデルのルートレベルの Inport ブロックと Outport ブロックの値を個別の引数として実行関数に渡します。

  • モデル データ構造体に対してメモリを静的に割り当てます。

ERT ベースのシステム ターゲット ファイルを使用していて、再呼び出し可能で再利用可能なマルチインスタンスの C エントリポイント関数を生成する場合は、以下を検討します。

  • 動的なメモリ割り当てを使用して、モデル データ構造体を初期化。[モデルの初期化に動的メモリ割り当てを使用] (Embedded Coder) を選択します。

  • モデルのルートレベルの Inport ブロックの値を構造体にパックし、ルートレベルの Outport ブロックの値を 2 番目の構造体にパックし、構造体を実行関数に引数として参照渡し。[ルートレベル I/O を以下として渡す] (Embedded Coder)[構造体参照] に設定します。

  • モデルのルートレベルの Inport ブロックと Outport ブロックの値をリアルタイム モデル データ構造体にパックし、その構造体を実行関数に引数として参照渡し。[ルートレベル I/O を以下として渡す] (Embedded Coder)[モデル データ構造体の一部] に設定します。

生成されたエントリポイント関数とインターフェイスをとる方法

  1. モデルのコードが生成された後、[コード] ビューを使用して生成されたエントリポイント関数、および該当する場合は、外部の入力端子と出力端子を表す変数を確認します。

  2. モデルのエントリポイント関数を宣言する生成されたヘッダー ファイルを含める #include ステートメントを外部コードに追加します。

  3. 生成されたファイル rtwtypes.h を含める #include ステートメントを追加します。このファイルは型定義、#define ステートメント、および列挙型を提供します。

  4. ターゲット固有のデータ構造体とハードウェア (ADC や DAC など) を初期化します。

  5. 該当する場合は、再利用可能なモデルの各インスタンスのデータを初期化します。

  6. 該当する場合は、モデルの Inport ブロックを表す生成された変数に入力データを書き込みます。

  7. 生成されたエントリポイント関数を呼び出し、関数 rt_OneStep の使用を設定します。

  8. 該当する場合は、モデルの Outport ブロックを表す生成された変数からデータを読み取ります。

詳細については、Deploy Applications to Target Hardware (Embedded Coder)を参照してください。

C 関数インターフェイスのカスタマイズの制限事項

次の制限事項は生成された C 関数インターフェイスのカスタマイズに適用されます。

  • モデル コンフィギュレーション パラメーター [1 つの出力/更新関数] を選択しなければなりません。

  • マルチレート モデルはサポートされていますが、シングル タスクのモデルを構成しなければなりません。

  • Default ストレージ クラスを使用するようにルートレベルの Inport および Outport を構成しなければなりません。

  • 関数インターフェイスをカスタマイズする場合は、独自のカスタム main プログラムを提供しなければなりません。MathWorks® が提供する静的な rt_main.c を使用して関数インターフェイスを構成することはできません。既定以外の関数インターフェイスの構成を指定すると、生成されたコードと既定の静的な rt_main.c との間に不一致が発生します。

  • 再利用できない関数によって実装されたサブシステムが 1 つ以上の Inport の値を使用していない限り、コード ジェネレーターはモデルのルート Inport に対するデータ構造体を削除します。

  • MAT ファイルのログを有効にするか、1 つ以上の Outport のサンプル時間が基礎的な基本レート (定数のレートも含め) ではない場合、コード ジェネレーターはモデルのルート Outport に対するデータ構造体を削除します。

  • Subsystem ブロックをコピーして新しいモデル内または同じモデル内でブロックを作成すると、元の Subsystem ブロックの関数インターフェイス情報は新しい Subsystem ブロックにコピーされません。

  • Stateflow® をお持ちの場合、モデルのルート Inport の値を使用するかモデルのルート Inport の値を使用するサブシステムを呼び出す Stateflow チャートに対しては、次のいずれかを実行してコードを生成します。

    • Stateflow チャートで、[初期化時に指定されたチャートを実行 (入力)] チェック ボックスをオフにします。

    • 関数 Stateflow を再利用できない関数にします。

    • Simulink® Signal Conversion ブロックをルート Inport の直後に挿入します。Signal Conversion ブロック パラメーターのダイアログ ボックスで、['ブロック削減' の最適化からこのブロックを排除する] を選択します。

  • モデルのルート Inport の値が Simscape™ 変換ブロックに接続されている場合、Simulink Signal Conversion ブロックをルート Inport と Simscape 変換ブロックの間に挿入します。Signal Conversion ブロック パラメーターのダイアログ ボックスで、['ブロック削減' の最適化からこのブロックを排除する] を選択します。

  • 関数インターフェイスで構成された参照モデルをビルドする際は、バーチャル バスを参照モデルに対する入力または出力として使用しないでください。代わりに、非バーチャル バスを使用します。

  • C 関数インターフェイスが既定ではない場合、その値はモデル コンフィギュレーション パラメーター [コード生成で固定サイズのスカラーのルート入力を値渡しで行う] で無視されます。詳細については、Pass fixed-size scalar root inputs by value for code generationを参照してください。

参考

|

関連するトピック