メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

生成されたコードへの外部 C/C++ コードの配置

生成されたコードの特定の場所に外部コードを配置することで、コード ジェネレーターがモデルに対して生成したコードをカスタマイズできます。たとえば、次のようなことができます。

  • ルート モデル用に生成されたコードの開始および終了部分に外部コードを配置します。

  • ルート モデルまたは非バーチャル サブシステムのブロックに対して生成された関数コードに宣言、本体、および終了コードおよび終了コードを配置します。

外部コードで拡張可能な関数は、コード ジェネレーターがモデル内のブロックに対して生成する関数によって異なります。たとえば、モデルまたは Atomic Subsystem に状態をもつブロックが含まれている場合、関数 disable のコードを指定できます。同様に、ブロックでデータの保存、メモリの解放、ターゲット ハードウェアのリセットを実行するためのコードが必要な場合は、関数 terminate のコードを指定します。詳細については、ブロック ターゲット ファイルのメソッドを参照してください。

外部コードを生成されたコードと統合するその他の方法については、外部コード統合ワークフローの選択を参照してください。

統合方法の選択

Simulink® モデリング環境内では、2 つの方法を使用して、生成されたコードに外部 C/C++ コードを配置できます。

  • Custom Code ブロックを追加する。

  • [コード生成][カスタム コード] ペインでモデル コンフィギュレーション パラメーターを設定する。

Custom Code ブロックを使用すると、生成されたコード内への外部コードの配置をより柔軟に制御できます。たとえば、外部コードを生成されたコードの末尾 (最後) に挿入するか、生成された関数コードの宣言、本体、最後に挿入するかを制御できます。外部コードの配置の正確な制御は、以下のために必要になります。

  • システム関数のプロファイリング

  • 割り込みの無効化と有効化

  • システム コードを正しく統合するためにビルド環境に必要なコメントのトレース。

以下の表で、2 つの方法を比較します。統合要件に最適な方法を選択してください。

要件ブロックモデル コンフィギュレーション パラメーター
モデリング キャンバスに外部コードの表現を含める。 
ルート モデル用に生成された関数にコードを配置する。
Atomic Subsystem 用に生成された関数にコードを配置する。 
モデル コンフィギュレーション セットにコード配置を保存する。 
モデル用に生成されたヘッダー ファイルとソース ファイルの上部と下部にコードを配置する。 
モデル用に生成されたヘッダー ファイルとソース ファイルの最上部付近にコードを配置する。 
コード ジェネレーターが作成した SystemInitialize および SystemTerminate 関数内にコードを配置する。 
コード ジェネレーターが作成した SystemInitialize および SystemTerminate 関数の宣言、実行および終了セクション内にコードを配置する。 
コード ジェネレーターが生成した SystemStartSystemEnableSystemDisableSystemOutputsSystemUpdateSystemDerivatives 関数の宣言、実行および終了セクション内にコードを配置する。 
生成コードにプリプロセッサ マクロ定義を追加する。 
シミュレーション ターゲットに対して指定されているカスタム コード設定を使用する。 
ライブラリがリンクしている親モデルの一意のカスタム コード設定を使用するようライブラリ モデルを構成する。 

各アプローチの適用方法の詳細については、Custom Code ブロックを使用した外部コードの統合 (Embedded Coder)およびモデル コンフィギュレーション パラメーターを使用した外部コードの統合 (Embedded Coder)を参照してください。

Custom Code ブロックを使用した外部コードの統合

Custom Code ブロック ライブラリ

Custom Code ブロック ライブラリには、生成されたコードの特定の場所および関数に外部 C または C++ コードを配置するために使用できるブロックが含まれています。このライブラリは、コード ジェネレーターが生成するモデル ヘッダー (model.h) およびソース (model.c または model.cpp) ファイルにコードを追加する 10 のブロックで構成されています。

Model Header ブロックと Model Source ブロックは、コード ジェネレーターがルート モデルに対して生成するヘッダーおよびソース ファイルの上部と下部に外部コードを追加できます。これらのブロックには、コードを入力または貼り付けることができる 2 つのテキスト フィールドがあります。1 つ目のフィールドでは、生成されたヘッダーまたはソース ファイルの上部に配置するコードを指定します。2 つ目のフィールドでは、ファイルの下部に配置するコードを指定します。

残りのブロックでは、コード ジェネレーターがブロックを含むルート モデルまたは Atomic Subsystem に対して生成する関数に外部コードを追加します。これらのブロックには、コード ジェネレーターが生成する関数をカスタマイズするコードを入力または貼り付けることができるテキスト フィールドが表示されます。テキスト フィールドは、特定の関数のコードの宣言、実行、および終了セクションに対応しています。

カスタマイズするコードの内容使用目的
連続状態の計算System Derivatives
状態の無効化 System Disable
状態の有効化System Enable
状態のリセットSystem Initialize
出力の生成System Outputs
1 回実行System Start
データの保存、メモリの解放、ターゲット ハードウェアのリセットSystem Terminate
各メジャー タイム ステップで更新が必要System Update

ブロックとモデル内でのその場所によって、コード ジェネレーターが外部コードを配置する場所が決まります。たとえば、System Outputs ブロックがルート モデル レベルにある場合、コード ジェネレーターはモデルの関数 Outputs にコードを配置します。ブロックが Triggered Subsystem または Enabled Subsystem 内にある場合、コードはそのサブシステムの関数 Outputs 内に置かれます。

コード ジェネレーターで、モデルに含める Custom Code ブロックに対応する関数を生成する必要がない場合、コード ジェネレーターは次のいずれかを実行します。

  • Custom Code ブロックで指定した外部コードを省略する。

  • モデルに関連ブロックが含まれていないことを示すエラーを返す。この場合、モデルから Custom Code ブロックを削除します。

詳細については、ブロック ターゲット ファイルのメソッドを参照してください。

メモ

シミュレーションとコード生成の結果の間の不一致の可能性を回避するには、グローバル Simulink データ (信号、状態およびブロック パラメーター) の読み取りと書き込みにカスタム コード ブロックを使用しないでください。代わりに、適切なモデル化パターン (たとえば、Data Store ReadData Store WriteState Reader および State Writer ブロック) を使用します。

モデリング キャンバスへの Custom Code ブロックの追加

Custom Code ライブラリ ブロックをモデルに追加するには、次を行います。

  1. Simulink ライブラリ ブラウザーで Simulink Coder ノードを展開してから、Custom Code ブロック ライブラリを選択します。

  2. 必要なブロックをモデルまたは Subsystem にドラッグします。Model Header ブロックと Model Source ブロックをルート モデルのみにドラッグします。関数ベースの Custom Code ブロックをルート モデルまたは Atomic Subsystem にドラッグします。

Custom Code ブロックを含むモデルを参照モデルとして使用できます。コード ジェネレーターは、シミュレーション ターゲットのコードを生成するときにこれらのブロックを無視します。コード生成ターゲットのコードを生成するときに、コード ジェネレーターにカスタム コードが含まれ、コンパイルされます。

生成された start function への外部コードの配置

この例では、System Start ブロックを使用して、コード ジェネレーターが離散フィルターを含むモデルに対して生成した start function の宣言セクションと実行セクションに外部 C コードを配置する方法を示します。

  1. 以下のモデルを作成します。

  2. コードを生成するためにモデルを設定します。

  3. System Start ブロックをダブルクリックします。

  4. [ブロック パラメーター] ダイアログ ボックスで、[System Start Function 宣言コード] フィールドに次のコードを入力します。

    unsigned int *ptr = 0xFFEE;
  5. [System Start Function 実行コード] フィールドに、次のコードを入力します。

    /* Initialize hardware */
    *ptr = 0;
  6. [OK] をクリックします。

  7. コードとコード生成レポートを生成します。

  8. 生成された model.c ファイルを表示します。文字列 start function を検索します。次のコードが見つかり、手順 4 と 5 で入力した外部コードが正しい場所に含まれています。

      {
        {
          /* user code (Start function Header) */
          /* System '<Root>' */
          unsigned int *ptr = 0xFFEE;
      
          /* user code (Start function Body) */
          /* System '<Root>' */
          /* Initialize hardware */
          *ptr = 0;
        }
      }
    

モデル コンフィギュレーション パラメーターを使用した外部コードの統合

モデル コンフィギュレーション パラメーターを使用して、外部 C または C++ コードを、コード ジェネレーターが生成したコード内の特定の場所および関数に配置できます。

目的選択
生成された model.c または model.cpp ファイルの最上部付近に外部コードを挿入します。

[追加コード] を選択し、挿入する外部コードを入力します。

サブシステム コードを別のファイルに生成すると、そのコードは [追加コード] パラメーターで指定した外部コードにアクセスできません。たとえば、インクルード ファイルを [追加コード] 設定として指定すると、コード ジェネレーターでは model.c または model.cpp ファイルの最上部付近に #include が挿入されます。コード ジェネレーターが別のファイルに配置するサブシステム コードは、インクルード ファイル内の宣言にアクセスできません。この場合は、外部コードを [インクルード ヘッダー] パラメーターで指定することを検討してください。

生成された model.h ファイルの最上部付近に外部コードを挿入する[インクルード ヘッダー] を選択し、挿入する外部コードを入力します。
model.c または model.cpp ファイルでモデルの初期化関数内に外部コードを挿入する[初期化コード] を選択し、挿入する外部コードを入力します。
model.c または model.cpp ファイルでモデルの終了関数内に外部コードを挿入する[終了コード] を選択し、挿入する外部コードを入力します。また、[インターフェイス] ペインの [終了関数が必要] パラメーターも選択します。
プリプロセッサ マクロ定義の追加 [定義] を選択し、生成コードに追加するプリプロセッサ マクロ定義のリストをスペースで区切って入力します。リストには単純な定義 (-DEF1 など) と値をもつ定義 (-DDEF2=1 など) を含めることができます。定義では -D を省略できます (たとえば -DFOO=1FOO=1 は同じです)。定義に -D が含まれる場合、ツールチェーンは、定義に別のフラグを使用している場合、フラグをオーバーライドできます。
MATLAB Function ブロック、Stateflow® チャートおよび Truth Table ブロックのシミュレーションに指定された設定と同じカスタム コード パラメーター設定を使用する

[シミュレーション ターゲットと同じカスタム コードの設定を使用] を選択します。

このパラメーターは、[コンフィギュレーション パラメーター] ダイアログ ボックスの [シミュレーション ターゲット] ペインを参照します。

ライブラリがリンクしている親モデルから一意のカスタム コード設定をライブラリ モデルで使用できるようにする

ローカルなカスタム コード設定を使用 (メイン モデルから継承しません)

このパラメーターは、MATLAB Function ブロック、Stateflow チャートまたは Truth Table ブロックを含むライブラリ モデルに対してのみ使用可能です。

外部ヘッダー ファイルにヘッダー ファイルを含めるには、#ifndef コードを追加します。このコードを使用すると、複数回のインクルードを防止できます。たとえば、rtwtypes.h の場合には、次の #include の追加によって防止しています。

#ifndef RTW_HEADER_rtwtypes_h_ 
#define RTW_HEADER_rtwtypes_h_ 
... 
#endif /* RTW_HEADER_rtwtypes_h_ */

ヘッダー ファイル、ソース ファイルおよび共有ライブラリ ファイルの名前と場所をビルド プロセスに追加する方法の詳細については、Simulink 環境内での統合コードのビルドを参照してください。

メモ

コード ジェネレーターは、ソフトウェアインザループ (SIL) およびプロセッサインザループ (PIL) シミュレーション用にコードを生成するときに、コンフィギュレーション セットに含める外部コードを含めます。ただし、コード ジェネレーターは、S-Function、ラピッド シミュレーションまたはシミュレーション システム ターゲット ファイルでコードを生成するときは、コンフィギュレーション セットに含める外部コードを無視します。

モデル コンフィギュレーション パラメーターを使用した外部 C コードの生成コードへの統合

この例では、モデル コンフィギュレーション パラメーターを使用して生成コードに外部コードを配置する方法を示します。

1. モデル CustomCode を開きます。

open_system('CustomCode')

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

3. [モデル コンフィギュレーション パラメーター] ダイアログ ボックスを開いて [カスタム コード] ペインに移動します。

4. [追加のソース コード] タブで、モデル コンフィギュレーション パラメーター [追加コード][初期化コード] の設定を確認します。

  • [追加コード] にはコメントを指定し、変数 GLOBAL_INT2 を -1 に設定します。

  • [初期化コード] は変数 GLOBAL_INT2 を 1 に初期化します。

5. ダイアログ ボックスを閉じます。

6. コードとコード生成レポートを生成します。

7. 生成されたソース ファイル CustomCode.c のコードを調べます。ファイルの先頭、#include ステートメントの後に、次の宣言コードがあります。

int_T GLOBAL_INT2 = -1;

次の代入がモデルの初期化エントリポイント関数に表示されます。この例では、[初期化コード] コンフィギュレーション パラメーターによるこの代入が指定されています。

GLOBAL_INT2 = 1;

参考

トピック