Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

モデルのエントリポイント関数に対する C コード生成の構成

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

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

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

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

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

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

モデル関数のタイプモデル ソース名生成された既定の関数名説明
エクスポートした関数 (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® ソフトウェアをお持ちの場合、外部コードと生成コードの統合を容易にして、コードの標準とガイドラインに準拠するために、コード ジェネレーターがモデルまたはサブシステムから関数インターフェイスを生成する方法を構成できます。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

C++ クラス インターフェイスはモデル データをクラス プロパティとしてカプセル化し、エントリポイント関数をクラス メソッドとしてカプセル化します。このインターフェイスは、ERT ベースのシステム ターゲット ファイルで使用するために利用可能です。インターフェイスを使用するには、[言語][C++] に設定し、[コード インターフェイスのパッケージ化][C++ クラス] に設定します。以下が可能です。

  • [C++ クラス インターフェイスの設定] をクリックすることで、C++ クラス インターフェイスをプレビューおよびカスタマイズします。カスタマイズとは、外部コードとの統合用にコードを生成したり、コードがコーディング標準に準拠していることを確認できることを意味します。

  • ブロック パラメーター構造体をパブリック、プライベートまたは保護されたデータのメンバーとして生成するかどうかを指定することで、クラスの継承の可視性を設定できます。[パラメーターの可視性][公開][プライベート][保護] に設定します。

  • コードの実行速度または調整可能性の要件を満たす、モデル ブロック パラメーターの C++ インターフェイス コードを生成します。このコードは、インライン化されないアクセス メソッドまたはインライン化されたアクセス メソッドのいずれかになります。[パラメーターのアクセス][メソッド] または [インライン化されたメソッド] に設定します。

  • コードの実行速度、データの調整可能性またはデータのパッケージ化に関する要件を満たす、モデルのルートレベルの Inport と Outport ブロックセットの C++ インターフェイス コードを生成できます。このコードは次のいずれかのタイプのアクセス メソッドになります。

    アクセス メソッドのタイプを次に設定
    インライン化されていないメソッド
    インライン化されているインライン化されたメソッド
    インライン化されていない構造体ベース構造体ベースのメソッド
    インライン化された構造体ベースインライン化された構造体ベースのメソッド
  • ルートレベル I/O 構造体をパブリック、プライベートまたは保護されたデータのメンバーとして生成するかどうかを指定することで、クラスの継承の可視性を設定できます。[外部 I/O の可視性][パブリック][プライベート]、または [保護] に設定します。

生成された C 関数インターフェイスの構成方法の選択

外部コードと生成コードの統合を容易にして、コードの標準とガイドラインに準拠するために、コード マッピング エディターまたはコード マッピング API を使用して、コード ジェネレーターがモデルまたはサブシステムから関数インターフェイスを生成する方法を構成できます。

構成詳細
モデル全体の関数のカテゴリ (初期化/終了、実行、共有ユーティリティ) に対する既定の命名規則Configure Default Code Generation for Functions
個々のエントリポイント関数 (既定の命名規則をオーバーライドする)個々の C エントリポイント関数に対する名前の設定
基本レートのステップ エントリポイント関数に対する対話的なステップ関数インターフェイス (関数名、戻り値、引数 C 型修飾子、名前、順序)個々のステップ関数に対する名前と引数の設定
Simulink Function ブロックと Function Caller ブロックに対する対話的な関数インターフェイス (関数名、戻り値、引数 C 型修飾子、名前、順序)Configure Entry-Point Function Interfaces for Simulink Function and Function Caller Blocks

ソフトウェアインザループ (SIL) テストを使用して、カスタマイズされたエントリポイント関数のコードを検証できます。生成コードを使用して SIL ブロックを作成します。次に SIL ブロックをモデルに統合し、生成されたコードが元のモデルまたは非バーチャル サブシステムと同じ結果を提供することを検証します。詳細については、Choose a SIL or PIL Approachを参照してください。

関数カテゴリに対する既定のコード生成設定の構成

モデル全体の関数のカテゴリに対して既定の構成を指定することにより、C コード生成用にモデルを準備する作業を軽減します。たとえば、関数名規則やメモリ セクションにおける関数コードの配置を構成できます。既定の構成を適用すると、多数の関数をもつモデルの場合は特に、時間が節約でき、コードでエラーが発生するリスクを抑えることができます。

コード ジェネレーターはモデル関数の次のカテゴリに対して、エントリポイント関数を生成します。

関数カテゴリ説明
初期化/終了システムを初期化し、オフにする関数
実行実行とリセットを開始する関数
共有ユーティリティ共有ユーティリティ関数コード

Code Mappings Editor – Cまたはコード マッピング API 関数 setFunctionDefault を使用して関数の既定のコード マッピングを構成します。これらのインターフェイスを使用して、関数カテゴリをモデルの Embedded Coder ディクショナリで定義された関数カスタマイズ テンプレートに関連付けることができます。

アプリケーションで、メモリ内でのエントリポイント関数の配置を構成する必要がある場合は (生成コードを特定のハードウェア向けに最適化するためなど)、既定のメモリ セクションをモデル全体の関数のカテゴリに適用できます。コード マッピング エディターで、特定のメモリ セクションを使用するように定義された関数カスタマイズ テンプレートに関数カテゴリをマッピングします。を参照してください。

関数カスタマイズ テンプレートが存在しない場合、Embedded Coder ディクショナリを使用して作成できます (Define 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 を使用して、個々のステップ関数の関数名を設定します。これらのインターフェイスを使用して、関数をモデルの Embedded Coder ディクショナリで定義された関数カスタマイズ テンプレートに関連付けて、関数名を使用できます。

この例では、モデル rtwdemo_fcnprotoctrl に対する関数 initialize の名前を変更する方法を示します。

  1. モデル rtwdemo_fcnprotoctrl を開き、モデルのコピーを書き込み可能な場所に保存します。

  2. Embedded Coder アプリを開きます。

  3. [C コード] タブで、[コード インターフェイス][個々の要素コードのマッピング] を選択します。

  4. コード マッピング エディターの [Function] タブで、次のいずれかの方法を使用して関数名を変更します。

    • [Function Name] 列で、関数の名前を入力します。

    • [Function Preview] 列で、関数プロトタイプのハイパーリンクをクリックし、設定ダイアログ ボックスを開きます。[C Initialize 関数名] フィールドで、関数名を入力します。[適用] をクリックし、[C 関数プロトタイプ] フィールドで変更を確認するか、[OK] をクリックしてダイアログ ボックスを終了し、コード マッピング エディターの [Function Preview] 列に関数名を表示します。

    この例の場合、関数 initialize の名前を fcnprotoctrl_init に変更します。

  5. モデルを保存します。

  6. コードを生成します。

  7. 生成されたコードで変更内容を確認します。[コード] ビューで、関数名 fcnprotoctrl_init のインスタンスを検索します。関数名が生成されたファイル rtwdemo_fcnprotoctrl.hrtwdemo_fcnprotoctrl.c に表示されます。

    • rtwdemo_fcnprotoctrl.h の場合:

      extern void fcnprotoctrl_init(void);
      
    • rtwdemo_fcnprotoctrl.c の場合:

      void fcnprotoctrl_init(void)
      {
        ...
      }

個々のステップ関数に対する名前と引数の設定

生成された C コードがコードの標準およびガイドラインに準拠するように、またはそのコードが外部コードとより簡単に統合できるように、Simulink の周期関数に対して生成された個々のステップ関数の名前と引数を設定できます。ステップ関数の以下の要素をカスタマイズできます。

  • 関数名

  • 引数名

  • 引数の順序

  • 戻り値および引数データの修飾子

  • 引数のバッファリング最適化

モデルが少なくとも次のいずれか 1 つの条件を満たす場合は、ステップ関数の名前と引数を個別に設定することを検討してください。

  • コード ジェネレーターが 1 つのステップ関数を生成する周期的なシングルタスク モデルである。

  • Execution 関数カテゴリには既定の構成があり、特定のステップ関数についてこの構成をオーバーライドしなければならない。

コード マッピング エディターまたはコード マッピング API 関数 setFunction を使用して、個々のステップ関数のコード マッピングを構成します。これらのインターフェイスを使用して、関数をモデルの Embedded Coder ディクショナリで定義された関数カスタマイズ テンプレートに関連付けて、ステップ関数プロトタイプを完全にカスタマイズできます。

この例では、レートベースのシングルタスク モデルに対してステップ関数名と引数をカスタマイズする方法を示します。

構成ダイアログ ボックスを開く

1. モデル rtwdemo_fcnprotoctrl を開き、モデルのコピーを書き込み可能な場所に保存します。

2.Embedded Coder アプリを開きます。

3.[C コード] タブで、[コード インターフェイス]、[個々の要素コードのマッピング] を選択します。

4.コード マッピング エディターで、[Functions] タブをクリックします。

5.ステップ関数行の [Function Preview] 列で、プロトタイプのハイパーリンクをクリックし、[C Step 関数 インターフェイスの設定] ダイアログ ボックスを開きます。

[C Step 関数 インターフェイスの設定] ダイアログ ボックスの [C 関数プロトタイプ] フィールドに、関数プロトタイプに行う変更のプレビューが表示されます。

マルチインスタンス コードを生成するように構成されているモデルについては、最上位モデルからの再呼び出し可能なコードの生成を参照してください。

関数名のカスタマイズ

1. [C Step 関数 インターフェイスの設定] ダイアログ ボックスで、[C Step 関数 名前]fcnprotoctrl_run に設定します。関数プレビューが更新され、新しい関数名が反映されます。

2.[適用] をクリックし、ダイアログ ボックスを閉じて、モデルを保存します。

3.コードを生成し、名前の変更を確認します。

  • [コード] タブをクリックします。[コード] ビューのファイル リストで、ファイル rtwdemo_fcnprotoctrl.h を選択します。[検索] フィールドで、コード要素のリストに関数名 fcnprotoctrl_run が含まれていることを確認します。宣言を表示するには、この関数名を選択します。

コード内で宣言が強調表示されます。

  • ファイル rtwdemo_fcnprotoctrl.c で名前の変更を検証します。ソース コード (定義) を表示するには、[検索] フィールドで fcnprotoctrl_run を選択します。

他の例については、個々の C エントリポイント関数に対する名前の設定を参照してください。

関数引数のカスタマイズ

グローバル データ構造体の設定

既定では、最上位モデルまたは参照モデルはステップ関数 void-void を使用してデータを渡します。このタイプの関数では、共有メモリにデータ構造体として保存されたグローバル データにアクセスし、生成されたコードで外部のコードと通信できます。

ステップ関数 void-void が含まれるようにモデルを構成するには、[C Step 関数 インターフェイスの設定] ダイアログ ボックスを開き、[ステップ関数プロトタイプの引数を設定] チェック ボックスをオフにします。[C 関数プロトタイプ] プレビューで変更を確認します。

引数の設定

レートベース モデルのステップ関数は、引数を使用してデータを渡すことができます。以下の引数の設定をカスタマイズできます。

  • 戻り値

  • 型修飾子

  • 名前

  • 順序

1. [C Step 関数 インターフェイスの設定] ダイアログ ボックスを開きます。コード マッピング エディターで、[Functions] タブをクリックします。次に、ステップ関数の関数プレビューをクリックします。

2.[C Step 関数 インターフェイスの設定] ダイアログ ボックスで、[ステップ関数プロトタイプの引数を設定] をオンにします。

3.[Get default] をクリックします。ダイアログ ボックスが展開され、関数の戻り値を設定するフィールドと、入力引数および出力引数の一覧が既定の設定とともにリストされたテーブルが表示されます。

4.ステップ関数の戻り値をカスタマイズします。[C 戻り引数]void または出力引数の 1 つのいずれかに設定します。この例では void を選択します。

5.各引数について、[C 型修飾子] を指定します。

型修飾子:

  • Value: 値 (arg など)

  • Const: const 修飾子をもつ値 (const arg など)

  • Pointer to const: const 修飾子をもち、ポインターで参照される値 (const *arg など)

  • Pointer: ポインターによる参照 (*arg など)

  • Const pointer to const: const 修飾子をもち、ポインターで参照される、ポインター自体である値 (const *const arg など)

参照モデルを含むモデル

  • 参照モデルの場合、ステップ関数インターフェイスでルート入力引数の型修飾子は Auto に設定されます。コード ジェネレーターは、ソース信号から const 修飾子を破棄する型キャストを生成して、インターフェイス仕様を使用します。

  • 参照モデルの親の場合、ソース信号の型修飾子は Auto 以外の値に設定されます。この動作をオーバーライドするには、参照モデルに const 型修飾子を追加します。

この例では、C 型修飾子を変更しません。

6.[C 識別子名] 列の値を編集して、引数の名前をカスタマイズします。

この例では、アンダースコアを削除して引数の名前を変更します (arg_In1 を argIn1 に変更するなど)。

7.テーブルの行を新しい場所にドラッグして、引数の順序をカスタマイズします。

この例では、Out1 を 1 番目の位置に移動します。Out 2 を 3 番目の位置に移動します。

8.行った変更を検証してから適用し、ダイアログ ボックスを閉じたら、モデルを保存します。

9. コードを生成し、[コード] ビューで変更内容を確認します。

  • [検索] フィールドに関数 fcnprotoctrl_run が含まれていることをチェックして、ファイル rtwdemo_fcnprotoctrl.h で変更内容を確認します。関数宣言を表示するには、関数名を選択します。

  • ファイル rtwdemo_fcnprotoctrl.c で変更内容を確認します。関数の定義を表示するには、関数名 fcnprotoctrl_run を選択します。

プレビューとは異なるプロトタイプ

[C Step 関数 インターフェイスの設定] ダイアログ ボックスで、参照モデルの関数プロトタイプのプレビューを表示すると、生成コード内の関数プロトタイプよりも引数の数が少なく表示される場合があります。

たとえば、mdlref_counter という名前のモデルを考えます。このモデルには、入力端子 (arg_input)、出力端子 (arg_output)、限度値としてワークスペース パラメーターの引数名 lower_saturation_limit および upper_saturation_limit をもつ Saturation ブロックが含まれます。[C Step 関数 インターフェイスの設定] ダイアログ ボックスでは、関数プロトタイプのプレビューが次のように表示されます。

mdlref_counter_custom(arg_input, arg_output)

生成されたコードでは、プロトタイプに次のパラメーター引数が含まれています。

mdlref_counter_custom(real_T arg_input, real_T arg_output, real_T 
  rtp_lower_saturation_limit, real_T rtp_upper_saturation_limit)

引数のバッファリングの最適化

モデルのステップ関数で I/O 引数に必要なバッファリングを最適化できます。入力端子と出力端子のペアを設定する際にこれらの要件を満たすと、コード ジェネレーターは対応する引数をマージして、関連付けられたバッファーを再利用します。

  • Inport ブロックと Outport ブロックは、データ型、次元、サンプル レートを含め、同じプロパティをもたなければならない。

  • Inport ブロックと Outport ブロックのサンプル レートはモデルの基本レートと同じでなければならない。

  • 条件付きで実行されるサブシステムでは Outport ブロックを駆動できない。

  • 単一の非バーチャル ブロック出力で Outport ブロックを駆動しなければならない。たとえば、複数のバッファーをマージする Mux ブロックは Outport ブロックを駆動できない。

  • [C Step 関数 インターフェイスの設定] ダイアログ ボックスで、同じ C 型修飾子と識別子名で Inport と Outport を設定しなければならない。

この例では、端子 In3 と端子 Out2 の引数を、モデル例 rtwdemo_fcnprotoctrl に対してマージする方法を示します。

1. モデル rtwdemo_fcnprotoctrl の [C Step 関数 インターフェイスの設定] ダイアログ ボックスを開きます。

2.[ステップ関数プロトタイプの引数を設定] を選択し、引数の表示を開きます。

3.端子 In3Out2 の場合、[C 型修飾子] Pointer に、[C 識別子名]sharedArg に設定します。

4.プレビューに argIn3argOut2 のマージされた引数が表示されることを確認します。

5.行った変更を検証してから適用し、ダイアログ ボックスを閉じたら、モデルを保存します。

6.コードの生成と表示[コード] ビューで、関数 fcnprotoctrl_run を検索し、関数インターフェイスを調べます。この例では、Inport ブロックには読み取りコード、Outport ブロックには書き込みコードで共有引数が表示されます。

C エントリポイント関数に対するコード生成設定のプログラムによる構成

C コード生成に対するモデル関数の構成を自動化するには、コード マッピングのプログラミング インターフェイスを使用します。たとえば、カスタム ブロック ライブラリまたはアプリケーションのテスト環境の一部を作成する場合、プログラミング インターフェイスを使用して関数の構成を自動化します。

これらの関数の一般的な使用法には以下が含まれます。

  • 関数インターフェイスを作成する。

  • 既存の関数インターフェイスを変更する。

  • モデルの既定の構成情報を開始点として、関数インターフェイスを作成する。

  • モデル関数インターフェイスを既定の ERT 関数の構成にリセットする。

C エントリポイント関数のコード生成設定をプログラムで構成する方法の例については、Configure Default Data and Function Code Generation Programmaticallyを参照してください。この例では、関数カテゴリと個々の関数に対する既定の設定の構成方法を示します。

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

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

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

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

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

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

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

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

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

詳細については、Deploy Generated Standalone Executable Programs 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 関数インターフェイスが既定ではない場合、その値はモデル コンフィギュレーション パラメーター [コード生成で固定サイズのスカラーのルート入力を値渡しで行う] で無視されます。詳細については、コード生成で固定サイズのスカラーのルート入力を値渡しで行うを参照してください。

参考

|

関連するトピック