生成された C 関数インターフェイスをモデルのエントリポイント関数用に構成
エントリポイント関数とは
エントリ ポイントは、プログラム コントロール (実行) の転送が行われるコード内の場所です。main 関数 (main()) は C/C++ プログラムへのエントリ ポイントであり、アプリケーションが実行を開始すると呼び出されます。たとえば、関数 main などから、他の関数への呼び出しによって、関数コードにエントリ ポイントが提供されます。プログラム コントロールは呼び出される関数に転送されます。関数のコードが実行され、終了すると、コントロールが main または他の呼び出し関数に返されます。
モデルのコードを生成するときに、コード ジェネレーターは生成されたコードを実行するために呼び出すことができる一連のエントリポイント関数を定義します。生成された関数は、外部コードまたは変更する生成された main 関数のバージョンから呼び出すことができます。
コード生成レポートの [コード インターフェイス レポート] セクションに、コード ジェネレーターがモデルに対して生成するエントリポイント関数が一覧表示されます。詳細については、Analyze Generated Data Code Interface Reportを参照してください。
生成されたエントリポイント関数のタイプ
コード ジェネレーターは以下のタイプのモデル関数に対してエントリポイント関数を生成します。
| モデル関数のタイプ | モデル ソース名 | 生成された既定の関数名 | 説明 |
|---|---|---|---|
| エクスポートした関数 (Embedded Coder® が必要) | ExportedFunction:。ここで、 はモデル内の関数呼び出し Inport ブロックの名前です。 | または (指定した場合) | エクスポートした関数モデルの場合、サブシステムのエクスポート関数。 |
| 初期化関数 | Initialize | | モデルの初期化コード。アプリケーション コードの開始位置で関数を "一度" 呼び出します。この関数を使用してリアルタイム モデル データ構造体 ( |
| 分割関数 | Partition:。ここで、 はモデル内のブロックから明示的に作成され、Simulink® スケジュール エディターに表示される分割 (P1 など)、または [同時実行] ダイアログのタスク名です。 | 。ここで、 はいずれかのモデル サンプル周期に対して生成された関数を一意に識別します。 | モデル分割の場合、出力および更新コード。モデル コンフィギュレーション パラメーター [1 つの出力/更新関数] はオンです (既定の設定)。 |
| 分割更新関数 | PartitionUpdate:。ここで、 はモデル内のブロックから明示的に作成され、Simulink® スケジュール エディターに表示される分割 (P1 など)、または [同時実行] ダイアログのタスク名です。 | と 。ここで、 はいずれかのモデル サンプル周期に対して生成された関数を一意に識別します。 | モデル分割の場合、個別の関数内の出力および更新コード。モデル コンフィギュレーション パラメーター [1 つの出力/更新関数] はオフです。 |
| 周期的なマルチタスク関数 | Periodic:。ここで、 はマルチタスク モデル (D1 など) の周期レートまたは連続レートに対するサンプル時間の周期に対応する注釈です。 | 。ここで、 はいずれかのモデル サンプル周期に対して生成された関数を一意に識別します。 | マルチタスクに対して構成されたレートベース モデル内のブロックの場合、出力および更新コード。コード ジェネレーターはサンプル周期ごとに関数を生成します。モデル コンフィギュレーション パラメーター [1 つの出力/更新関数] はオンです (既定の設定)。サンプル時間情報の詳細については、サンプル時間の指定を参照してください。 |
| 周期的なマルチタスク更新関数 | PeriodicUpdate:。ここで、 はマルチタスク モデル (D1 など) の周期レートまたは連続レートに対するサンプル時間の周期に対応する注釈です。 | と 。ここで、 はいずれかのモデル サンプル周期に対して生成された関数を一意に識別します。 | マルチタスクに対して構成されたレートベース モデル内のブロックの場合、個別の関数内の出力および更新コード。コード ジェネレーターはサンプル周期ごとに出力関数と更新関数を生成します。モデル コンフィギュレーション パラメーター [1 つの出力/更新関数] はオフです。サンプル時間情報の詳細については、サンプル時間の指定を参照してください。 |
| 周期的なシングルタスク関数 | Periodic | | シングルタスクに対して構成されたレートベース モデル内のブロックの場合、出力および更新コード。モデル コンフィギュレーション パラメーター [1 つの出力/更新関数] はオンです (既定の設定)。 |
| 周期的なシングルタスク更新関数 | PeriodicUpdate | および | シングルタスクに対して構成されたレートベース モデル内のブロックの場合、個別の関数内の出力および更新コード。モデル コンフィギュレーション パラメーター [1 つの出力/更新関数] はオフです。 |
| リセット関数 | Reset:。ここで はモデル内のリセット関数の名前です。 | | モデルに Reset Function ブロックが含まれている場合、生成されるリセット コード。条件または状態をリセットするには、アプリケーション コードから関数を呼び出します。 |
| Simulink Function | Simulink Function:。ここで はモデル内の Simulink Function ブロックの名前です。 | グローバルな Simulink Function ブロックの またはスコープ内の Simulink Function ブロックの | エクスポートした関数モデルの場合、Simulink Function ブロックのエクスポート関数。 |
| 終了関数 | Terminate | | システムをオフにするコード。ERT ベースのモデルの場合、モデル コンフィギュレーション パラメーター[終了関数が必要] (既定で設定されている) をオフにしてこの関数の生成を抑制できます。 |
Embedded Coder® ソフトウェアをお持ちの場合、外部コードと生成コードの統合を容易にして、コードの標準とガイドラインに準拠するために、コード ジェネレーターがモデルまたはサブシステムから関数インターフェイスを生成する方法を構成できます。
エントリポイント関数の再利用の構成
既定では、最上位モデルは、再利用も再呼び出しも可能でないコードを生成します。エントリポイント関数には void-void インターフェイスがあります。コードは、共有メモリ内にあるグローバル データ構造体に直接アクセスすることで他のコードとやりとりします。
アプリケーションに再利用可能なマルチインスタンスのエントリポイント関数コードが必要な場合、一意のデータを使用して各関数 (インスタンス) を呼び出すようにコード ジェネレーターを構成できます。この場合、コードは再呼び出し可能です。
モデル コンフィギュレーション パラメーターの [コード インターフェイスのパッケージ化 (コンポーネント)] および関連するパラメーターを使用して、エントリポイント関数が再利用可能かどうかを設定します。選択するパラメーター設定は、システム ターゲット ファイル、プログラミング言語および引数インターフェイスに関するコンフィギュレーション選択などの要因によって異なります。
単一インスタンスの C エントリポイント関数の既定の設定
既定では、GRT ベースおよび ERT ベースのシステム ターゲット ファイルに対して、コード ジェネレーターは単一インスタンスの C エントリポイント関数を生成します。生成コードは次を実行します。
引数のない実行関数を作成する (
void-void)。(コンパイル時に) モデル データ構造体に対してメモリを静的に割り当てる。
単一インスタンスのエントリポイント関数のコードを構成するための既定のモデル コンフィギュレーション パラメーター設定は次の通りです。
[言語] を
[C]に設定。[コード インターフェイスのパッケージ化 (コンポーネント)] を
[再利用できない関数]に設定。
再利用可能なマルチインスタンス C エントリポイント関数の生成
GRT ベースまたは ERT ベースいずれかのシステム ターゲット ファイルに対して再利用可能なエントリポイント関数を C で生成するようにコード ジェネレーターを構成できます。ただし、既定では、コード ジェネレーターが生成する関数インターフェイスはさまざまです。モデル コンフィギュレーション パラメーターの [言語] が [C] に設定され、[コード インターフェイスのパッケージ化 (コンポーネント)] が [再利用可能な関数] に設定されていると仮定すると、コード ジェネレーターは各システム ターゲット ファイル シナリオに対してこのエントリ ポイント関数コードを生成します。
| システム ターゲット ファイル | インターフェイス |
|---|---|
| GRT ベース |
|
| ERT ベース |
|
ERT ベースのシステム ターゲット ファイルを使用していて、再呼び出し可能で再利用可能なマルチインスタンスの C エントリポイント関数を生成する場合は、以下を検討します。
動的なメモリ割り当てを使用して、モデル データ構造体を初期化。[モデルの初期化に動的メモリ割り当てを使用] を選択します。
メモ
再利用可能な C 関数インターフェイスで動的メモリ割り当てを使用する場合、生成コード内に
rt_VALIDATE_MEMORYマクロの呼び出しが現れます。既定では、この関数は操作を実行しない空のマクロとして定義されています。割り当て失敗の処理を追加するには、rt_VALIDATE_MEMORY用のカスタム マクロを定義します。モデルのルートレベルの Inport ブロックの値を構造体にパックし、ルートレベルの Outport ブロックの値を 2 番目の構造体にパックし、構造体を実行関数に引数として参照渡し。[ルートレベル I/O を以下として渡す] を
[構造体参照]に設定します。モデルのルートレベルの Inport ブロックと Outport ブロックの値をリアルタイム モデル データ構造体にパックし、その構造体を実行関数に引数として参照渡し。[ルートレベル I/O を以下として渡す] を
[モデル データ構造体の一部]に設定します。
モデル参照エントリポイント関数の再利用性の構成
既定では、モデル参照は、再利用および再呼び出し可能なコードを生成します。コード ジェネレーターは、一意のデータを使用して各参照モデル関数を呼び出します。
モデル コンフィギュレーション パラメーターの [コード インターフェイスのパッケージ化 (サブコンポーネント)] を使用して、参照モデルのエントリポイント関数が再利用可能かどうかを設定できます。
既定では、再利用できないモデル参照は、ルートレベル I/O データを関数引数としてエントリポイント関数に渡すコードを生成します。ERT ベースのシステム ターゲット ファイルを使用している場合は、ルートレベル I/O データをグローバル変数として渡すことで、関数引数を削除することを検討します。モデル コンフィギュレーション パラメーター [ルートレベル I/O を次として実装] を [グローバル変数] に設定します。
生成された C 関数インターフェイスの構成方法の選択
外部コードと生成コードの統合を容易にして、コードの標準とガイドラインに準拠するために、コード マッピング エディターまたはコード マッピング API を使用して、コード ジェネレーターがモデルまたはサブシステムから関数インターフェイスを生成する方法を構成できます。
サービス インターフェイスで構成されたモデルについては、次を構成できます。
関数名
サブコンポーネントの関数および Simulink Function ブロックとして表されるコンポーネント モデルの関数の引数
メモリ セクション
| 構成 | 詳細 |
|---|---|
| モデル全体の関数のカテゴリ (初期化/終了、実行、共有ユーティリティ) に対する既定の命名規則 | Configure Default Code Generation for Functions |
| 個々のエントリポイント関数 (既定の命名規則をオーバーライドする) | 個々の C エントリポイント関数に対する名前の設定 |
| 基本レートのステップ エントリポイント関数に対する対話的なステップ関数インターフェイス (関数名、戻り値、引数 C 型修飾子、名前、順序) | 個々のステップ関数に対する名前と引数の設定 |
| Simulink Function ブロックと Function Caller ブロックに対する対話的な関数インターフェイス (関数名、戻り値、引数 C 型修飾子、名前、順序) | Configure C Entry-Point Function Interfaces for Simulink Function and Function Caller Blocks |
ソフトウェアインザループ (SIL) テストを使用して、カスタマイズされたエントリポイント関数のコードを検証できます。生成コードを使用して SIL ブロックを作成します。次に SIL ブロックをモデルに統合し、生成されたコードが元のモデルまたは非バーチャル サブシステムと同じ結果を提供することを検証します。詳細については、SIL アプローチまたは PIL アプローチの選択を参照してください。
関数カテゴリに対する既定のコード生成設定の構成
モデル全体の関数のカテゴリに対して既定の構成を指定することにより、C コード生成用にモデルを準備する作業を軽減します。たとえば、関数名規則やメモリ セクションにおける関数コードの配置を構成できます。既定の構成を適用すると、多数の関数をもつモデルの場合は特に、時間が節約でき、コードでエラーが発生するリスクを抑えることができます。
コード ジェネレーターはモデル関数の次のカテゴリに対して、エントリポイント関数を生成します。
| 関数カテゴリ | 説明 |
|---|---|
| 初期化/終了 | システムを初期化し、オフにする関数 |
| 実行 | 実行とリセットを開始する関数 |
| 共有ユーティリティ | 共有ユーティリティ関数コード |
コード マッピング エディター – C またはコード マッピング API 関数 setFunctionDefault を使用して関数の既定のコード マッピングを構成します。これらのインターフェイスを使用して、関数カテゴリをモデルの Embedded Coder ディクショナリで定義された関数カスタマイズ テンプレートに関連付けることができます。
アプリケーションで、メモリ内でのエントリポイント関数の配置を構成する必要がある場合は (生成コードを特定のハードウェア向けに最適化するためなど)、既定のメモリ セクションをモデル全体の関数のカテゴリに適用できます。コード マッピング エディターで、特定のメモリ セクションを使用するように定義された関数カスタマイズ テンプレートに関数カテゴリをマッピングします。関数カスタマイズ テンプレートの作成を参照してください。
関数カスタマイズ テンプレートが存在しない場合、Embedded Coder ディクショナリを使用して作成できます (Define Service Interfaces, Storage Classes, Memory Sections, and Function Templates for Software Architectureを参照)。
関数カテゴリに対する既定の構成を設定する方法の例については、Configure Default C Code Generation for Categories of Data Elements and Functionsを参照してください。
個々の C エントリポイント関数に対する名前の設定
生成された C コードがコードの標準およびガイドラインに準拠するように、またはそのコードが外部コードとより簡単に統合できるように、個々のエントリポイント関数の名前を設定できます。たとえば、モデルに対して生成された初期化関数に myInitFunc と名前を付けることができます。
モデルが少なくとも次のいずれか 1 つの条件を満たす場合は、関数の名前を個別に設定することを検討してください。
一意の命名要件をもつ複数の関数を使用する。
関数をほとんど使用しない。
関数カテゴリに対する既定の構成があり、特定の関数でこの構成をオーバーライドしなければならない。
コード マッピング エディターまたはコード マッピング API 関数 setFunction を使用して、個々のステップ関数の関数名を構成します。
詳細については、以下を参照してください。
個々のステップ関数に対する名前と引数の設定
生成された C コードがコードの標準およびガイドラインに準拠するように、またはそのコードが外部コードとより簡単に統合できるように、Simulink の周期関数に対して生成された個々のステップ関数の名前と引数を設定できます。ステップ関数の以下の要素をカスタマイズできます。
関数名
引数名
引数の順序
戻り値および引数データの修飾子
引数のバッファリング最適化
モデルが少なくとも次のいずれか 1 つの条件を満たす場合は、ステップ関数の名前と引数を個別に設定することを検討してください。
コード ジェネレーターが 1 つのステップ関数を生成する周期的なシングルタスク モデルである。
Execution関数カテゴリには既定の構成があり、特定のステップ関数についてこの構成をオーバーライドしなければならない。
コード マッピング エディターまたはコード マッピング API 関数 setFunction を使用して、個々のステップ関数のコード マッピングを構成します。
詳細については、以下を参照してください。
Customize Default Naming Rule of Generated Entry-Point C Functions in Subcomponent Models
Customize Generated Entry-Point C Function Arguments for Component Models
Customize Generated Entry-Point C Function Arguments for Subcomponent Models
Customize Arguments of Step C Function Generated from Single-Tasking Model
C エントリポイント関数に対するコード生成設定のプログラムによる構成
C コード生成に対するモデル関数の構成を自動化するには、コード マッピングのプログラミング インターフェイスを使用します。たとえば、カスタム ブロック ライブラリまたはアプリケーションのテスト環境の一部を作成する場合、プログラミング インターフェイスを使用して関数の構成を自動化します。
これらの関数の一般的な使用法には以下が含まれます。
関数インターフェイスを作成する。
既存の関数インターフェイスを変更する。
モデルの既定の構成情報を開始点として、関数インターフェイスを作成する。
モデル関数インターフェイスを既定の ERT 関数の構成にリセットする。
C エントリポイント関数のコード生成設定をプログラムで構成する方法の例については、Configure Default Data and Function Code Generation Programmaticallyを参照してください。この例では、関数カテゴリと個々の関数に対する既定の設定の構成方法を示します。
生成された C エントリポイント関数をカスタマイズするためのプログラム インターフェイスの使用の詳細については、以下を参照してください。
生成されたエントリポイント関数とインターフェイスをとる方法
モデルのコードが生成された後、[コード] ビューを使用して生成されたエントリポイント関数、および該当する場合は、外部の入力端子と出力端子を表す変数を確認します。
モデルのエントリポイント関数を宣言する生成されたヘッダー ファイルを含める
#includeステートメントを外部コードに追加します。生成されたファイル
rtwtypes.hを含める#includeステートメントを追加します。このファイルは型定義、#defineステートメント、および列挙型を提供します。ターゲット固有のデータ構造体とハードウェア (ADC や DAC など) を初期化します。
該当する場合は、再利用可能なモデルの各インスタンスのデータを初期化します。
該当する場合は、モデルの Inport ブロックを表す生成された変数に入力データを書き込みます。
生成されたエントリポイント関数を呼び出し、関数
rt_OneStepの使用を設定します。該当する場合は、モデルの Outport ブロックを表す生成された変数からデータを読み取ります。
詳細については、Deploy Applications to Target Hardwareを参照してください。
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を参照してください。
参考
setFunctionDefault | setFunction | Simulink Function | Function Caller
トピック
- Customize Generated Entry-Point C Function Names
- Customize Default Naming Rule of Generated Entry-Point C Functions in Subcomponent Models
- Customize Generated Entry-Point C Function Arguments for Component Models
- Customize Generated Entry-Point C Function Arguments for Subcomponent Models
- Customize Arguments of Step C Function Generated from Single-Tasking Model
- Programmatically Customize Generated Entry-Point C Function Names
- Programmatically Customize Generated Entry-Point C Function Arguments for Component Models
- Programmatically Customize Arguments of Step C Function Generated from Single Tasking Model
- C Data Code Interface Configuration for Model Interface Elements
- Configure Default C Code Generation for Categories of Data Elements and Functions
- Simulink Function ブロックとコードの生成