Main Content

固定小数点データ型のパラメーターとして入出力引数を渡す外部 C 関数の統合

レガシ コード ツールを使用して、固定小数点データ型のパラメーターによって入力と出力を渡すレガシ C 関数を統合します。

レガシ コード ツールでは以下が可能です。

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

  • シミュレーション中にレガシ コードを呼び出す C-MEX S-Function を生成する。

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

  • モデルの生成コードでレガシ コードを呼び出す方法を指定する TLC ブロック ファイルとオプションの rtwmakecfg.m ファイルを生成する。

レガシ関数の仕様の提供

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

myFixpt timesS16(const myFixpt in1, const myFixpt in2, const uint8_T fracLength)

myFixpt は論理的には固定小数点データ型で、物理的には 16 ビット整数に対する typedef です。

myFixpt = Simulink.NumericType;
myFixpt.DataTypeMode = 'Fixed-point: binary point scaling';
myFixpt.Signed = true;
myFixpt.WordLength = 16;
myFixpt.FractionLength = 10;
myFixpt.IsAlias = true;
myFixpt.HeaderFile = 'timesFixpt.h';

レガシ ソース コードは、ファイル timesFixpt.htimesS16.c にあります。

% rtwdemo_sfun_gain_fixpt
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_gain_fixpt';
def.OutputFcnSpec = 'myFixpt y1 = timesS16(myFixpt u1, myFixpt p1, uint8 p2)';
def.HeaderFiles   = {'timesFixpt.h'};
def.SourceFiles   = {'timesS16.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};

シミュレーション用の S-Function の生成

入力引数 'def' によって提供される記述に従って C-MEX S-Function を生成するために、最初の入力を 'sfcn_cmex_generate' に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル rtwdemo_sfun_gain_fixpt.c にあります。

legacy_code('sfcn_cmex_generate', def);

生成された S-Function のシミュレーション向けのコンパイル

C-MEX S-Function ソース ファイルの生成後、Simulink® を使用したシミュレーション用に S-Function をコンパイルするために、最初の入力を 'compile' に設定して関数 legacy_code() を再び呼び出します。

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_gain_fixpt
    mex('-I/mathworks/devel/bat/Bdoc23a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc23a_2181783_2675283/tpf950142d/simulinkcoder-ex05928773', '-c', '-outdir', '/tmp/Bdoc23a_2181783_2675283/tp1a01892f_1fdd_4a66_a978_fbbf72e97d13', '/mathworks/devel/bat/Bdoc23a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/timesS16.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_gain_fixpt.c', '-I/mathworks/devel/bat/Bdoc23a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc23a_2181783_2675283/tpf950142d/simulinkcoder-ex05928773', '/tmp/Bdoc23a_2181783_2675283/tp1a01892f_1fdd_4a66_a978_fbbf72e97d13/timesS16.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_gain_fixpt
### Exit

コード生成用の TLC ブロック ファイルの生成

S-Function をコンパイルしてシミュレーションで使用した後、関数 legacy_code() を再び呼び出すことができます。最初の入力を 'sfcn_tlc_generate' に設定して、TLC ブロック ファイルを生成します。モデルの生成コードでレガシ コードを呼び出す方法を、ブロック ファイルで指定します。TLC ブロック ファイルを生成せずに、S-Function を含むモデルのコードを生成しようとすると、コード生成に失敗します。S-Function の TLC ブロック ファイルは、rtwdemo_sfun_gain_fixpt.tlc です。

legacy_code('sfcn_tlc_generate', def);

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

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

legacy_code('rtwmakecfg_generate', def);

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

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

legacy_code('slblock_generate', def);

レガシ コードとの統合の表示

モデル rtwdemo_lct_fixpt_params は、レガシ コードとのモデルの統合を示しています。サブシステム TestFixpt は、生成された S-Function を介したレガシ C 関数の呼び出しに利用できます。

open_system('rtwdemo_lct_fixpt_params')
open_system('rtwdemo_lct_fixpt_params/TestFixpt')
sim('rtwdemo_lct_fixpt_params')

参考

関連するトピック