Main Content

Simulink 環境内での統合コードのビルド

ワークフロー

生成コードと外部 C または C++ コードを統合する実行可能プログラムをビルドするには、次の表のタスクを反復します。

タスク

アクション

詳細

1

ビルド アプローチを選択します。

Simulink モデルから生成されたコードのビルドに使用するアプローチ

例については、リアルタイム システムのビルド プロセス ワークフローを参照してください。

2

外部コードのビルド プロセス サポートを構成します。

統合コード ビルド プロセスのパラメーターの構成

3

外部コードの S-Function ビルド サポートを構成します。

S-Function のビルド サポート

生成される makefile を makecfg を使用して S-Function 用にカスタマイズする

例については、シミュレーションおよびコード生成のための再利用可能な外部アルゴリズム コードの呼び出しを参照してください。

4

外部コード ソース、ライブラリ、ヘッダー ファイルを検索するようビルド プロセスを構成します。

ビルド プロセスのファイルの依存関係の管理

ビルド中のライブラリの位置および名前付けの制御

5

外部コードの統合に必要なカスタムのビルド処理を設定します。

ビルド プロセスのカスタマイズ ワークフローについては、コード生成後のビルド プロセスのカスタマイズを参照してください。

ビルド カスタマイズのツールチェーン アプローチ ビルドへの適用を自動化するには、sl_customization.m によるビルド プロセスのカスタマイズを参照してください。

ビルド カスタマイズのテンプレート makefile アプローチ ビルドへの適用を自動化するには、STF_make_rtw_hook ファイルによるビルド プロセスのカスタマイズを参照してください。

統合コード ビルド プロセスのパラメーターの構成

次の表に、外部コード統合のビルド プロセスをサポートする [モデル コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成][カスタム コード] ペインのモデル コンフィギュレーション パラメーターのガイドを示します。外部コードのフォルダーの詳細については、ビルド プロセスのフォルダーの管理を参照してください。Code generation folderに外部コードを配置する場合は、ビルド フォルダーでの外部コード ファイルの保持を参照してください。

目的選択

ヘッダー ファイルを含んでいるインクルード フォルダーをビルド プロセスに追加する

[コード情報][インクルード ディレクトリ] を選択し、フォルダーの絶対パスまたは相対パスを入力します。

相対パスを指定する場合、そのパスは、ビルド フォルダーではなく、モデル ファイルを含んでいるフォルダーに対して相対的でなければなりません。フォルダーを指定する順序は、ヘッダー、ソースおよびライブラリ ファイルが検索される順序です。

コンパイルおよびリンク対象のソース ファイルを追加する

[コード情報][ソース ファイル] を選択し、ファイルの絶対パスまたはファイル名のみを入力します。

ファイルが現在の MATLAB® フォルダーまたはインクルード フォルダーのいずれかにある場合、ファイル名のみを入力します。指定した追加のソースごとに、ビルド プロセスは、ソース ファイルが存在するフォルダーのテンプレート makefile に一般的なルールを拡張します。たとえば、ソース ファイルがフォルダー inc にある場合、ビルド プロセスは次のようなルールを追加します。

%.obj: buildir\inc\%.c
            $(CC) -c -Fo$(@F) $(CFLAGS) $<

ビルド プロセスは、ソース ファイルがリストされている順序でルールを追加します。

リンクするライブラリを追加する

[コード情報][ライブラリ] を選択し、ライブラリの絶対パスまたはファイル名のみを入力します。

ライブラリが現在の MATLAB フォルダーまたはインクルード フォルダーのいずれかにある場合、ファイル名のみを入力します。

MATLAB Function ブロック、Stateflow® チャートおよび Truth Table ブロックのシミュレーションに指定された設定と同じカスタム コード設定を使用する

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

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

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

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

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

ビルド フォルダーでの外部コード ファイルの保持

既定では、ビルド プロセスで外部のソース ファイルは削除されます。次のガイドラインに従って、外部ソース ファイルを保持できます。

.c/.cpp または .h ソース ファイルをビルド フォルダーに入れて、コード ジェネレーターで TLC コード生成プロセス時にこのソース ファイルが削除されないようにするには、.c/.cpp または .h ファイルの 1 行目にテキスト target specific file を挿入します。以下に例を示します。

/*  COMPANY-NAME target specific file
 *
 *   This file is created for use with the 
 *   COMPANY-NAME target.
 *   It is used for ...
 */
...

前の例で示されているように、正確にテキスト "target specific file" を入力し、この文字列がソース ファイルの 1 行目に置かれるようにしてください。その他のテキストは、このテキストの前または後に表示されます。

この方法でユーザー ファイルにフラグを設定すると、ユーザー ファイルへの後処理が回避されて、生成されたソース ファイルと共にユーザー ファイルがインデントされないようになります。旧リリースでは、パターン model_*.c/.cpp (ここで * はテキスト) の名前をもつフォルダー ファイルをビルドするために自動インデントが行われていました。インデントは無害ですが、ソース管理ソフトウェアによって違いが検出されることがあり、そのために不必要な更新がトリガーされる可能性があります。

S-Function のビルド サポート

ユーザーが記述する S-Function ブロックには、外部コードを Simulink® 開発環境に組み込むための強力な方法が用意されています。多くの場合、S-Function を使用して既存の外部コードを生成コードに統合します。以下のように、S-Function の記述に使用できる方法がいくつかあります。

古い形式のコード ファイルやカスタム コード ファイルのビルド情報をビルド プロセスに含めるために、S-Function にも柔軟で機能的な方法が用意されています。

S-Functions をビルド プロセスに追加するさまざまな方法があります。

暗黙的なビルド サポート

S-Function を使用してモデルをビルドする場合、ビルド プロセスによって、規則、インクルード パスおよびソース ファイル名が生成済みの makefile に追加されます。S-Function のソース ファイル (.h.c および .cpp) を S-Function MEX ファイルと同じフォルダーに配置しなければなりません。ビルドにツールチェーン アプローチを使用しているかテンプレート makefile アプローチを使用しているかにかかわらず、ビルド プロセスではツールチェーンまたはテンプレート makefile を介してこの情報が伝播されます。

  • ファイル sfcnname.h が S-Function MEX ファイル (sfcnname.mexext など) と同じフォルダーに存在する場合、そのフォルダーはインクルード パスに追加されます。

  • ファイル sfcnname.c または sfcnname.cpp が S-Function MEX ファイルと同じフォルダーに存在する場合、ビルド プロセスはそのフォルダーからファイルをコンパイルするための makefile 規則を追加します。

  • S-Function が TLC ファイルでインライン化されていないと、ビルド プロセスはその S-Function のソース ファイルをコンパイルしなければなりません。ソース ファイルの名前をコンパイルするファイルのリストに追加するかどうかを決定するために、ビルド プロセスは MATLAB パスで sfcnname.cpp を検索します。ソース ファイルを見つけると、ビルド プロセスはそのソース ファイル名を makefile に追加します。パスで sfcnname.cpp が見つからないと、ビルド プロセスはファイル名 sfcnname.c が MATLAB パス上にあるかどうかにかかわらず、この名前を makefile に追加します。

    メモ

    Simulink エンジンでシミュレーションやコード生成のための MEX ファイルを見つけるには、ファイルが MATLAB パス上か、現在の MATLAB 作業フォルダー内になければなりません。

S-Function の追加ソース ファイルの指定

S-Function に追加のソース ファイルの依存関係がある場合は、追加モジュールの名前をビルド プロセスに追加しなければなりません。次のようにファイル名を指定します。

  • S-Function ブロック パラメーター ダイアログ ボックスの [S-Function モジュール] フィールドで指定

  • 関数 set_param の呼び出しの SFunctionModules パラメーターを使用して指定

たとえば、複数のモジュールで S-Function をビルドするとします。

mex sfun_main.c sfun_module1.c sfun_module2.c

次のいずれかを実行すると、モジュールをビルド プロセスに追加できます。

  • S-Function ブロック パラメーター ダイアログ ボックスの [S-Function モジュール] フィールドで sfun_mainsfun_module1 および sfun_module2 を指定します。

  • MATLAB コマンド プロンプトで、次のように入力します。

    set_param(sfun_block,'SFunctionModules','sfun_module1 sfun_module2')

    または、変数を定義してパラメーター値を表すことができます。

    modules = 'sfun_module1 sfun_module2'
              set_param(sfun_block,'SFunctionModules', modules)

[S-Function モジュール] フィールドと SFunctionModules パラメーターは、完全なソース ファイル パスの仕様をサポートしません。パラメーターを使用するには、makefile の実行時にコード ジェネレーターが追加ソース ファイルを検出しなければなりません。コード ジェネレーターが追加ファイルの場所を特定するように、そのファイルを S-Function MEX ファイルと同じフォルダーに配置します。これで、暗黙的なビルド サポートに記載されている暗黙的なビルド サポートを活用できます。

コードを生成する準備ができたら、最上位モデル コードの再生成の制御の説明にあるように、コード ジェネレーターで最上位モデルを強制的にリビルドします。

他の場所にあるソース ファイルの指定やライブラリまたはオブジェクト ファイルの指定など、複雑な S-Function ファイルの依存関係では、生成された makefile を rtwmakecfg.m API を使用してカスタマイズで説明されているように rtwmakecfg.m API を使用します。

TLC ライブラリ関数の使用

TLC ファイルを記述して S-Function をインライン化する場合、TLC ライブラリ関数 LibAddToModelSources を使用してソース ファイル名をビルド プロセスに追加できます。詳細については、LibAddSourceFileCustomSection(file, builtInSection, newSection)を参照してください。

メモ

この関数は完全なソース ファイル パスの指定をサポートしません。makefile の実行時にコード ジェネレーターが追加のソース ファイルを検出できるものとみなします。

その他に、LibAddToCommonIncludes という TLC ライブラリ関数が役立ちます。この関数は、生成された model.h ヘッダー ファイルに S-Function ヘッダー ファイルを含めるために、#include ステートメントで使用します。詳細については、LibAddToCommonIncludes(incFileName)を参照してください。

他の場所にあるソース ファイルの指定やライブラリまたはオブジェクト ファイルの指定など、複雑な S-Function ファイルの依存関係では、生成された makefile を rtwmakecfg.m API を使用してカスタマイズで説明されているように rtwmakecfg.m API を使用します。

S-Function ライブラリのプリコンパイル

MATLAB 言語関数 rtw_precompile_libs を使用することによって、モデルに適した新しいまたは更新した S-Function ライブラリ (MEX ファイル) をプリコンパイルできます。この関数は、指定されたモデルおよびライブラリ ビルド仕様を使用し、ライブラリを作成してプリコンパイル済みのライブラリ フォルダーにライブラリを配置します。

S-Function ライブラリをプリコンパイルすることによって、システム ビルドを最適化できます。プリコンパイル済みのライブラリが存在する場合、ビルド プロセスはその後のビルドからライブラリのコンパイルを省略できます。多数のライブラリを使用するモデルでは、ビルド プロセスでの時間短縮は大きな意味があります。

rtw_precompile_libs を使用するには、次を行います。

  1. システム プラットフォームに基づいたファイル タイプの拡張子など、ライブラリ ファイルの接尾辞を設定します。

    プラットフォームのタイプを特定したら、TargetLibSuffix パラメーターを使用してそれに対応したライブラリ接尾辞を設定することを検討します。たとえば、GRT ターゲットの接尾辞を適用する場合、UNIX® プラットフォームの _std.a および Windows® プラットフォームの _vcx64.lib に接尾辞を設定できます。

      if isunix
        suffix = '_std.a';
      else
        suffix = '_vcx64.lib';
      end
    
    set_param(my_model,'TargetLibSuffix', suffix);

    プリコンパイル済みのライブラリ接尾辞と拡張子に影響する要因はいくつかあります。以下の表に、接尾辞と拡張子の選択肢に影響するシステム ターゲット ファイル、コンパイラ ツールチェーン、その他のオプションの典型的な選択例を示します。詳細は、matlab/rtw/c/grt フォルダーまたは matlab/rtw/c/ert フォルダーでテンプレート makefile を確認してください。

    TMF ファイルCOMPILER _TOOL_CHAIN 値プリコンパイラ ライブラリ (PRECOMP_LIBRARIES)
    S-Function のライブラリ接尾辞 (EXPAND _LIBRARY _NAME 値) 整数のみのコードのライブラリ接尾辞 (EXPAND _LIBRARY _NAME 値)速度を最適化するライブラリ接尾辞 (EXPAND _LIBRARY _NAME 値)ライブラリ拡張子 (EXPAND _LIBRARY _NAME 値)
    ert_lcc64.tmflcc_rtwsfcn_lcc_int_ert_lcc_ert_lcc.lib
    ert_vcx64.tmfvcx64_rtwsfcn_vcx64_int_ert_vcx64_ert_vcx64.lib
    ert_unix.tmfunix_rtwsfcn_int_ert_ert.a
    grt_lcc64.tmflccN/AN/A_lcc.lib
    grt_vcx64.tmfvcx64N/AN/A_vcx64.lib
    grt_unix.tmfunixN/AN/A_std.a

    メモ

    lcc-win64 コンパイラは将来のリリースで削除されます。サポート対象のコンパイラについては、https://www.mathworks.com/support/requirements/supported-compilers.htmlを参照してください。

  2. プリコンパイル済みのライブラリ フォルダーを設定します。

    次のメソッドのいずれかを使用して、プリコンパイル済みのライブラリ フォルダーを設定します。

    TargetPreCompLibLocationmakeInfo.precompile の両方を設定する場合は、TargetPreCompLibLocation の設定内容が優先されます。

    次のコマンドは、モデル my_model のプリコンパイル済みライブラリ フォルダーを、現在の作業フォルダーの下にあるフォルダー lib に設定します。

    set_param(my_model,'TargetPreCompLibLocation', fullfile(pwd,'lib'));

    メモ

    プリコンパイル済みライブラリ ファイルのターゲット フォルダーとターゲット ライブラリ ファイルの接尾辞の両方を設定する場合、ビルド プロセスは、ビルド処理中にプリコンパイル済みライブラリ ファイルが失われているかどうかを検出します。

  3. ビルド仕様を定義します。

    ビルド仕様を定義する構造体を設定します。次の表では、構造体で定義できるフィールドを説明します。これらのフィールドは rtwmakecfgDirs を除き、オプションです。

    フィールド説明

    rtwmakecfgDirs

    プリコンパイルするライブラリの rtwmakecfg ファイルを含んでいるフォルダーに名前を付ける文字ベクトルの cell 配列。この関数は rtwmakecfg が返すのと同様に、makeInfo.libraryName 要素と Location 要素を使用して、プリコンパイル済みライブラリの名前と位置を指定します。TargetPreCompLibLocation パラメーターをライブラリ フォルダーを指定するように設定すると、その設定は makeInfo.library.Location の設定をオーバーライドします。

    メモ: 指定したモデルは、rtwmakecfg ファイルで指定されるプリコンパイル済みライブラリを使用するブロックを含んでいなければなりません。これは、ビルド プロセスでライブラリを使用する場合に限って、TMF から makefile への変換でライブラリの規則が生成されるからです。

    libSuffix

    各ライブラリの名前 (.a_vc.lib など) に追加する、ファイル タイプの拡張子を含むサフィックスを指定する文字ベクトル。文字ベクトルはピリオド (.) を含まなければなりません。このフィールドか TargetLibSuffix パラメーターを使用してサフィックスを設定します。両方の方法で接尾辞を指定した場合はこのフィールドの設定内容が TargetLibSuffix の設定によってオーバーライドされます。

    intOnlyBuild

    boolean フラグ。true に設定すると、フラグは、ライブラリが整数コードからしかコンパイルされないようにライブラリが最適化されることを示します。このフィールドは ERT ターゲットにのみ適用されます。

    makeOpts

    rtwMake コマンド ラインに含まれるオプションを指定する文字ベクトル。

    addLibs

    関数 rtwmakecfg で指定されない作成対象のライブラリを指定する構造体の cell 配列。各構造体は、文字配列である 2 つのフィールドで定義されなければなりません。

    • libName — サフィックスのないライブラリ名

    • libLoc — プリコンパイル済みライブラリの位置

    ターゲット makefile (TMF) では、他のライブラリと、ライブラリのビルド方法を指定できます。このフィールドを使用して、それらのライブラリをプリコンパイルします。

    次のコマンドはビルド仕様 build_spec を設定します。これによって、コンパイル対象のファイルが現在の作業フォルダーの下にあるフォルダー src 内に存在することが示されます。

    build_spec = [];
    build_spec.rtwmakecfgDirs = {fullfile(pwd,'src')};
  4. rtw_precompile_libs を呼び出します。

    この呼び出しでは、プリコンパイル済みのライブラリとビルド仕様を作成するモデルを指定しなければなりません。次に例を示します。

    rtw_precompile_libs(my_model,build_spec);

関連するトピック