Main Content

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

legacy_code

レガシ コード ツールを使用した既存の C/C++ コードの統合

    説明

    legacy_code('help') は、レガシ コード ツールの使い方に関するヘルプを表示します。

    specs = legacy_code('initialize') は、レガシ コード ツールのデータ構造体 specs を初期化します。これは、既存の C または C++ コードの特性と、レガシ コード ツールが生成する S-Function のプロパティを登録します。

    legacy_code('sfcn_cmex_generate', specs) は、レガシ コード ツールのデータ構造体 specs で指定される、S-Function ソース ファイルを生成します。

    legacy_code('compile', specs, compilerOptions) は、レガシ コード ツールにより生成される S-Function のコンパイルとリンクを行います。コンパイルとリンクは、データ構造体、specs、および指定されたコンパイラのオプションに基づいて行われます。コンパイラ オプションは MEX 関数によりサポートされていなければなりません。

    legacy_code('generate_for_sim', specs, modelname) は S-Function の生成、コンパイル、リンクをまとめて 1 ステップで行います。レガシ コード ツール データ構造体の Options.useTlcWithAccel フィールドが logical 1 (true) に設定されている場合、この関数もまた、高速シミュレーション用の TLC ファイルを生成します。

    legacy_code('slblock_generate', specs, modelname) は、データ構造体 specs に基づいて、レガシ コード ツールで生成される S-Function に対するマスク設定された S-Function ブロックを生成します。このブロックは、modelname で指定される Simulink® モデルに表示されます。modelname を省略すると、ブロックは空のモデル エディター ウィンドウに表示されます。

    legacy_code('sfcn_tlc_generate', specs) は、データ構造体 specs に基づいて、レガシ コード ツールで生成される S-Function に対する TLC ファイルを生成します。このオプションは、以下を行う場合に設定します。

    legacy_code('sfcn_makecfg_generate', specs) は、データ構造体 specs に基づいて、レガシ コード ツールで生成される S-Function に対する sFunction_makecfg.m ファイルを生成します。Simulink モデルからコードを生成するために Simulink Coder を使用する場合は、このオプションを使用して、S-Function のビルド プロセス用の追加項目 (ソース フォルダー、プリプロセッサ マクロ、リンク オブジェクトなど) を指定できます。たとえば、生成された S-Function 実行可能ファイルを含むフォルダー以外のフォルダーにある、S-Function が依存するファイルソース ファイルを指定できます。詳細については、生成される makefile を makecfg を使用して S-Function 用にカスタマイズする (Simulink Coder)およびレガシ コード ツールによって外部コードへの呼び出しを生成コードにインポート (Simulink Coder)を参照してください。

    legacy_code('rtwmakecfg_generate', specs) は、データ構造体 specs に基づいて、レガシ コード ツールで生成される S-Function に対する rtwmakecfg.m ファイルを生成します。Simulink モデルからコードを生成するために Simulink Coder を使用する場合は、このオプションを使用して、S-Function のビルド プロセス用の追加項目 (ソース フォルダー、プリプロセッサ マクロ、リンク オブジェクトなど) を指定できます。たとえば、生成された S-Function 実行可能ファイルを含むフォルダー以外のフォルダーにある、S-Function が依存するファイルソース ファイルを指定できます。詳細については、生成された makefile を rtwmakecfg.m API を使用してカスタマイズ (Simulink Coder)およびレガシ コード ツールによって外部コードへの呼び出しを生成コードにインポート (Simulink Coder)を参照してください。

    legacy_code('backward_compatibility') は、レガシ コード ツールの使用に対する構文を、サポートされている構文 (このドキュメントのリファレンス ページおよびIntegrate C Functions Using Legacy Code Toolで説明されている) に自動的に更新します。

    すべて折りたたむ

    この例では、レガシ コード ツールを使用して、値またはアドレスによって入力引数を渡すレガシ C 関数を統合する方法を示します。

    レガシ コード ツールを使用すると、以下のことができます。

    • レガシ関数の仕様を提供する。

    • レガシ コードを呼び出すためにシミュレーション時に使用される C-MEX S-Function を生成する。

    • 生成された S-Function をシミュレーション向けにコンパイルし、ビルドする。

    レガシ関数の仕様を提供

    レガシ コード ツールに含まれる関数は、特定のデータ構造体または構造体配列を引数として使用します。このデータ構造体は、最初の入力として initialize を使用する関数 legacy_code() を呼び出すことで初期化されます。構造体の初期化後、統合されるレガシ コードに対応する値に、構造体のプロパティを割り当てる必要があります。この例で呼び出されるレガシ関数のプロトタイプは以下のとおりです。

    • FLT filterV1(const FLT signal, const FLT prevSignal, const FLT gain)

    • FLT filterV2(const FLT* signal, const FLT prevSignal, const FLT gain)

    FLT は、float に対する typedef です。レガシ ソース コードは、ファイル your_types.hmyfilter.hfilterV1.c、および filterV2.c にあります。

    2 つの構造体で定義されている OutputFcnSpec に違いがあることに注意してください。1 番目のケースでは、1 番目の入力引数が値によって渡されるように指定されています。これに対し、2 番目のケースでは、ポインターによって渡されるように指定されています。

    defs = [];
    
    % sldemo_sfun_filterV1
    def = legacy_code('initialize');
    def.SFunctionName = 'sldemo_sfun_filterV1';
    def.OutputFcnSpec = 'single y1 = filterV1(single u1, single u2, single p1)';
    def.HeaderFiles   = {'myfilter.h'};
    def.SourceFiles   = {'filterV1.c'};
    def.IncPaths      = {'sldemo_lct_src'};
    def.SrcPaths      = {'sldemo_lct_src'};
    defs = [defs; def];
    
    % sldemo_sfun_filterV2
    def = legacy_code('initialize');
    def.SFunctionName = 'sldemo_sfun_filterV2';
    def.OutputFcnSpec = 'single y1 = filterV2(single u1[1], single u2, single p1)';
    def.HeaderFiles   = {'myfilter.h'};
    def.SourceFiles   = {'filterV2.c'};
    def.IncPaths      = {'sldemo_lct_src'};
    def.SrcPaths      = {'sldemo_lct_src'};
    defs = [defs; def];
    

    シミュレーション時に使用される S-Function の生成とコンパイル

    入力引数 defs によって示される説明に従って C-MEX S-Function の生成とコンパイルを自動的に行うために、1 番目の引数を generate_for_sim に設定して関数 legacy_code() が再び呼び出されます。この S-Function は、シミュレーションでレガシ関数を呼び出すときに使用されます。S-Function のソース コードは、ファイル sldemo_sfun_filterV1.csldemo_sfun_filterV2.c にあります。

    legacy_code('generate_for_sim', defs);
    
    ### Start Compiling sldemo_sfun_filterV1
        mex('-I/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex08075368/sldemo_lct_src', '-I/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex08075368', '-c', '-outdir', '/tmp/Bdoc22a_1891349_109752/tpdbbc3103_1b61_4aa3_803f_e04dee7548a0', '/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex08075368/sldemo_lct_src/filterV1.c')
    Building with 'gcc'.
    MEX completed successfully.
        mex('sldemo_sfun_filterV1.c', '-I/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex08075368/sldemo_lct_src', '-I/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex08075368', '/tmp/Bdoc22a_1891349_109752/tpdbbc3103_1b61_4aa3_803f_e04dee7548a0/filterV1.o')
    Building with 'gcc'.
    MEX completed successfully.
    ### Finish Compiling sldemo_sfun_filterV1
    ### Exit
    
    ### Start Compiling sldemo_sfun_filterV2
        mex('-I/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex08075368/sldemo_lct_src', '-I/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex08075368', '-c', '-outdir', '/tmp/Bdoc22a_1891349_109752/tp78d3e49c_45db_40ad_9ae9_bceda05f20fe', '/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex08075368/sldemo_lct_src/filterV2.c')
    Building with 'gcc'.
    MEX completed successfully.
        mex('sldemo_sfun_filterV2.c', '-I/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex08075368/sldemo_lct_src', '-I/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex08075368', '/tmp/Bdoc22a_1891349_109752/tp78d3e49c_45db_40ad_9ae9_bceda05f20fe/filterV2.o')
    Building with 'gcc'.
    MEX completed successfully.
    ### Finish Compiling sldemo_sfun_filterV2
    ### Exit
    

    コード生成用の rtwmakecfg.m ファイルの生成

    TLC ブロック ファイルの作成後に、最初の入力を rtwmakecfg_generate に設定することで関数 legacy_code() を再び呼び出します。これは、Simulink® Coder™ を介したコード生成をサポートする rtwmakecfg.m ファイルを生成するためです。S-Function に必要なソース ファイルとヘッダー ファイルが S-Function と同じディレクトリにない場合に、コード生成時に作成される makefile 内にこれらの依存関係を追加するとき、rtwmakecfg.m ファイルを生成します。

    メモ: モデルのシミュレーションをアクセラレータ モードで実行する場合にのみ、この手順を実行します。

    legacy_code('rtwmakecfg_generate', def);
    

    生成された S-Function を呼び出すためのマスクされた S-Function ブロックの生成

    C-MEX S-Function ソースのコンパイルが終了したら、最初の入力を slblock_generate に設定して関数 legacy_code() を再び呼び出すことができます。これは、S-Function を呼び出すように設定されたマスク済みの S-Function ブロックを生成するためです。これらのブロックは新しいモデルに配置されますが、既存のモデルにコピーすることもできます。

    % legacy_code('slblock_generate', defs);
    

    レガシ コードの統合

    モデル sldemo_lct_filter は、レガシ コードとの統合を示しています。サブシステム TestFilter は、以前の出力値の保存に役立つ単位遅延と共に、生成された S-Function を介したレガシ C 関数の呼び出しに利用できます。

    open_system('sldemo_lct_filter')
    open_system('sldemo_lct_filter/TestFilter')
    sim('sldemo_lct_filter');
    

    入力引数

    すべて折りたたむ

    既存の C または C++ コードと生成される S-Function に対する仕様。以下のフィールドをもつ struct として指定します。

    S-Function の名前

    SFunctionName (必須) — レガシ コード ツールで生成される S-Function の名前。文字ベクトルまたは string として指定します。

    レガシ コード ツールでの関数指定の定義

    • InitializeConditionsFcnSpec — S-Function が状態を初期化しリセットするために呼び出す関数。空でない文字ベクトルまたは string として指定します。Declaring Legacy Code Tool Function Specificationsで説明されているように、Simulink が解釈できるトークンを使ってこの関数を宣言しなければなりません。

    • OutputFcnSpec — S-Function が各タイム ステップで呼び出す関数。空でない文字ベクトルまたは string として指定します。Declaring Legacy Code Tool Function Specificationsで説明されているように、Simulink が解釈できるトークンを使ってこの関数を宣言しなければなりません。

    • StartFcnSpec — S-Function が実行を開始するときに呼び出す関数。文字ベクトルまたは string として指定します。この関数は、S-Function パラメーター引数と作業データにアクセスできます。Declaring Legacy Code Tool Function Specificationsで説明されているように、Simulink が解釈できるトークンを使ってこの関数を宣言しなければなりません。

    • TerminateFcnSpec — S-Function が実行を終了するときに呼び出す関数。文字ベクトルまたは string として指定します。この関数は、S-Function パラメーター引数と作業データにアクセスできます。Declaring Legacy Code Tool Function Specificationsで説明されているように、Simulink が解釈できるトークンを使ってこの関数を宣言しなければなりません。

    コンパイルのリソースの定義

    • HeaderFiles — コンパイルに必要となるヘッダー ファイルのファイル名。文字ベクトルの cell 配列または string 配列として指定します。

    • SourceFiles — コンパイルに必要となるソース ファイル。文字ベクトルの cell 配列または string 配列として指定します。絶対パス名または相対パス名を使ってソース ファイルを指定できます。

    • HostLibFiles — ホストのコンパイルに必要となるライブラリ ファイル。文字ベクトルの cell 配列または string 配列として指定します。絶対パス名または相対パス名を使ってライブラリ ファイルを指定できます。

    • TargetLibFiles — ターゲット (つまり、スタンドアロン) のコンパイルに必要となるライブラリ ファイル。文字ベクトルの cell 配列または string 配列として指定します。絶対パス名または相対パス名を使ってライブラリ ファイルを指定できます。

    • IncPaths — ヘッダー ファイルを含むディレクトリ。文字ベクトルの cell 配列または string 配列として指定します。絶対パス名または相対パス名を使ってディレクトリを指定できます。

    • SrcPaths — ソース ファイルを含むディレクトリ。文字ベクトルの cell 配列または string 配列として指定します。絶対パス名または相対パス名を使ってディレクトリを指定できます。

    • LibPaths — ホストとターゲットのライブラリ ファイルを含むディレクトリ。文字ベクトルの cell 配列または string 配列として指定します。絶対パス名または相対パス名を使ってディレクトリを指定できます。

    サンプル時間の指定

    SampleTime - 以下のいずれかにすることができます。

    • 'inherited' (既定の設定) - サンプル時間は、ソース ブロックから継承されます。

    • 'parameterized' - サンプル時間は、調整可能なパラメーターとして表されます。生成コードは、mxGetPr または mxGetData のような MEX API 関数を呼び出すことによって、パラメーターにアクセスできます。

    • Fixed - サンプル時間を明示的に指定します。サンプル時間を指定する方法の詳細は、サンプル時間の指定を参照してください。

    このフィールドを指定する場合、最後に指定しなければなりません。

    S-Function オプションの定義

    Options — S-Function オプション。構造体として指定します。この構造体には、次のフィールドがあります。

    • canBeCalledConditionally — S-Function SS_OPTION_CAN_BE_CALLED_CONDITIONALLY オプションの設定。logical として指定します。既定の設定では、値は true (1) です。

    • convertNDArrayToRowMajor — 行列の列優先の形式と行優先の形式の自動変換。logical として指定します。MATLAB®、Simulink、生成コードでは列優先の形式が使用されます。C では行優先の形式が使用されます。既定値は false (0) です。現在、このオプションの以前のバージョン convert2DMatrixToRowMajor を指定している場合、この関数によって自動的に新しい convertNDArrayToRowMajor オプションが指定されます。

      メモ

      このオプションでは複素数データの 2 次元行列はサポートされません。

    • isMacro — レガシ コードが C マクロであるかどうか。logical として指定します。既定の設定では、値は false (0) です。

    • isVolatile — S-Function SS_OPTION_NONVOLATILE オプションの設定。logical として指定します。既定の設定では、値は true (1) です。

    • language — レガシ コード ツールが生成する S-Function のターゲット言語。'C' または 'C++' のいずれかとして指定します。既定の設定では、値は 'C' です。

      メモ

      レガシ コード ツールは、C++ 関数とインターフェイスで接続することができますが、C++ オブジェクトとは接続できません。この問題に関しては、Simulink ドキュメンテーションのLegacy Code Tool Limitationsを参照してください。

    • outputsConditionallyWritten — レガシ コードが条件付きで出力端子を記述するかどうか。logical として指定します。true の場合、生成された S-Function は、各出力端子に関連付けられたメモリは上書きできず、グローバルである (SS_NOT_REUSABLE_AND_GLOBAL) ことを指定します。false の場合、各出力端子に関連付けられたメモリは再利用可能でローカルです (SS_REUSABLE_AND_LOCAL)。既定の設定では、値は false (0) です。詳細については、ssSetOutputPortOptimOpts を参照してください。

    • singleCPPMexFile — 生成されたコードが以下であるかどうか。

      • 拡張子が .c.tlc である 2 つのファイルとしてではなく、.cpp である 1 つのファイルとして、インライン S-Function を生成して管理することが必要です。

      • モデルのコンフィギュレーション パラメーターで指定されるように、モデルのコード スタイル (式内の小かっこ使用のレベル、式内のオペランドの順序の保持、if ステートメント内の条件式) を保持します。

      logical として指定します。既定の設定では、値は false です。

      制限

      以下の場合は、singleCPPMexFile フィールドを true に設定できません。

      • Options.language='C++'

      • 次の Simulink オブジェクトのいずれかを使用して、IsAlias プロパティを true に設定する場合

        • Simulink.Bus

        • Simulink.AliasType

        • Simulink.NumericType

      • レガシ コード ツールの関数の仕様で、状態引数としてスカラー作業データを表現するための void* または void** を含む場合

      • レガシ コード ツール構造体の HeaderFiles フィールドで、複数のヘッダー ファイルを指定する場合

    • supportsMultipleExecInstances — 関数 ssSupportsMultipleExecInstances の呼び出しを含めるオプション。logical として指定します。既定の設定では、値は false (0) です。

    • supportCodeReuseAcrossModels — 生成された S-Function をモデル参照階層全体で再利用できるかどうか。logical として指定します。true の場合、生成された S-Function には ssSetSupportedForCodeReuseAcrossModels 関数呼び出しが含まれます。コード ジェネレーターは、S-Function のコードを slprj\ert\_sharedutils フォルダー内に生成します。

    • supportCoverage — 生成された S-Function がモデル カバレッジと互換性がなければならないかどうか。logical として指定します。既定の設定では、値は false (0) です。

    • supportCoverageAndDesignVerifier — 生成された S-Function がモデル カバレッジおよび Simulink Design Verifier™ と互換性がなければならないかどうか。logical として指定します。既定の設定では、値は false (0) です。

    • useTlcWithAccel — S-Function SS_OPTION_USE_TLC_WITH_ACCELERATOR オプションの設定。logical として指定します。既定の設定では、値は true (1) です。

    データ型: struct

    Simulink モデルの名前。string または文字ベクトルとして指定します。アクション 'slblock_generate' を使って legacy_code を指定する場合に、レガシ コード ツールによって、生成されるマスクされた S-Function ブロックが指定されたモデルに挿入されます。この引数を省略すると、空のモデル エディター ウィンドウにブロックが表示されます。

    データ型: char | string

    アクション 'compile' を使って legacy_code を指定する場合に含めるコンパイラ オプション。string または文字ベクトルとして指定します。コンパイラ オプションは MEX 関数によりサポートされていなければなりません。

    データ型: char | string

    バージョン履歴

    R2006b で導入