Main Content

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

生成されたコードでの関数の再利用

この例では、Atomic サブシステムを再利用可能なコードの生成用に構成する方法を示します。サブシステム用に生成されたコードを Atomic サブシステムとして実行するように指定するには、[ブロック パラメーター] ダイアログ ボックスで [Atomic サブシステムとして扱う] パラメーターを選択します。このパラメーターにより、[コード生成] タブの [関数のパッケージ化] パラメーターが有効になります。[関数のパッケージ化] パラメーターには次の 4 つの設定があります。

  • Inline: サブシステム コードのインライン化

  • Nonreusable function: I/O がグローバル データとして渡される関数

  • Reusable function: I/O が関数の引数として渡される関数

  • Auto: コンテキストに基づいて Simulink Coder により最適化

Reusable function および Auto に設定すると、コード ジェネレーターでサブシステム コードの再利用が許可されます。Reusable function および Nonreusable function に設定すると、[関数名オプション][関数名][ファイル名オプション] のパラメーターが有効になります。

Embedded Coder のライセンスがある場合は、引数を受け入れるように再利用不可能なサブシステムを構成できます。

モデル例

rtwdemo_ssreuse モデルには、SS1 および SS2 という 2 つの同一のサブシステムが含まれています。これらのサブシステムでは、[関数のパッケージ化] パラメーターが Reusable function に設定され、[関数名] パラメーターが myfun になっています。これらのサブシステムはパラメーター化されたマスク サブシステムです。マスク サブシステムの内容を表示するには、サブシステム ブロックを右クリックし、[マスク][マスク内を表示] を選択します。

model = 'rtwdemo_ssreuse';
open_system(model);

コードの生成と検査

ビルドと検査プロセス用に一時フォルダーを作成します。Simulink Coder アプリまたは Embedded Coder アプリを開きます。次に、コードを生成して検査します。

currentDir=pwd;
[~,cgDir]=rtwdemodir();
slbuild(model)
### Starting build procedure for: rtwdemo_ssreuse
### Successful completion of build procedure for: rtwdemo_ssreuse

Build Summary

Top model targets built:

Model            Action                       Rebuild Reason                                    
================================================================================================
rtwdemo_ssreuse  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 14.436s
cfile=fullfile(cgDir, 'rtwdemo_ssreuse_grt_rtw', 'rtwdemo_ssreuse.c');
rtwdemodbtype(cfile, '/* Model step', '/* Model initialize', 1, 0);
/* Model step function */
void rtwdemo_ssreuse_step(void)
{
  /* Outputs for Atomic SubSystem: '<Root>/SS1' */

  /* Inport: '<Root>/In1' incorporates:
   *  Inport: '<Root>/In2'
   */
  myfun(rtwdemo_ssreuse_U.In1, rtwdemo_ssreuse_U.In2, rtwdemo_ssreuse_P.T1Data,
        rtwdemo_ssreuse_P.T1Break, &rtwdemo_ssreuse_B.SS1);

  /* End of Outputs for SubSystem: '<Root>/SS1' */

  /* Outport: '<Root>/Out1' */
  rtwdemo_ssreuse_Y.Out1 = rtwdemo_ssreuse_B.SS1.LookupTable;

  /* Outputs for Atomic SubSystem: '<Root>/SS2' */

  /* Inport: '<Root>/In1' incorporates:
   *  Inport: '<Root>/In2'
   */
  myfun(rtwdemo_ssreuse_U.In1, rtwdemo_ssreuse_U.In2, rtwdemo_ssreuse_P.T2Data,
        rtwdemo_ssreuse_P.T2Break, &rtwdemo_ssreuse_B.SS2);

  /* End of Outputs for SubSystem: '<Root>/SS2' */

  /* Outport: '<Root>/Out2' */
  rtwdemo_ssreuse_Y.Out2 = rtwdemo_ssreuse_B.SS2.LookupTable;
}

モデルのステップ関数に、再利用可能な関数 myfun の呼び出しが 2 つあります。マスク パラメーター T1BreakT1DataT2Break および T2Data は、関数の引数です。

[関数のパッケージ化] パラメーターを Inline に変更します。

set_param('rtwdemo_ssreuse/SS1','RTWSystemCode','Inline')
set_param('rtwdemo_ssreuse/SS2','RTWSystemCode','Inline')

コードを生成して検査します。

slbuild(model)
### Starting build procedure for: rtwdemo_ssreuse
### Successful completion of build procedure for: rtwdemo_ssreuse

Build Summary

Top model targets built:

Model            Action                       Rebuild Reason                   
===============================================================================
rtwdemo_ssreuse  Code generated and compiled  Generated code was out of date.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 12.037s
cfile=fullfile(cgDir, 'rtwdemo_ssreuse_grt_rtw', 'rtwdemo_ssreuse.c');
rtwdemodbtype(cfile, '/* Model step', '/* Model initialize', 1, 0);
/* Model step function */
void rtwdemo_ssreuse_step(void)
{
  real_T Out1_tmp;

  /* Outputs for Atomic SubSystem: '<Root>/SS2' */
  /* Outputs for Atomic SubSystem: '<Root>/SS1' */
  /* Sum: '<S1>/Sum' incorporates:
   *  Inport: '<Root>/In1'
   *  Inport: '<Root>/In2'
   *  Sum: '<S2>/Sum'
   */
  Out1_tmp = rtwdemo_ssreuse_U.In1 + rtwdemo_ssreuse_U.In2;

  /* End of Outputs for SubSystem: '<Root>/SS2' */

  /* Outport: '<Root>/Out1' incorporates:
   *  Lookup_n-D: '<S1>/Lookup Table'
   *  Sum: '<S1>/Sum'
   */
  rtwdemo_ssreuse_Y.Out1 = look1_binlx(Out1_tmp, rtwdemo_ssreuse_P.T1Break,
    rtwdemo_ssreuse_P.T1Data, 10U);

  /* End of Outputs for SubSystem: '<Root>/SS1' */

  /* Outputs for Atomic SubSystem: '<Root>/SS2' */
  /* Outport: '<Root>/Out2' incorporates:
   *  Lookup_n-D: '<S2>/Lookup Table'
   */
  rtwdemo_ssreuse_Y.Out2 = look1_binlx(Out1_tmp, rtwdemo_ssreuse_P.T2Break,
    rtwdemo_ssreuse_P.T2Data, 10U);

  /* End of Outputs for SubSystem: '<Root>/SS2' */
}

モデルのステップ関数では、サブシステム コードはインライン化されます。

[関数のパッケージ化] パラメーターを Nonreusable function に変更します。SS2 の場合は、[関数名] パラメーターを myfun2 に変更します。

set_param('rtwdemo_ssreuse/SS1','RTWSystemCode','Nonreusable function')
set_param('rtwdemo_ssreuse/SS2','RTWSystemCode','Nonreusable function')
set_param('rtwdemo_ssreuse/SS2','RTWFcnName','myfun2')

コードを生成して検査します。

slbuild(model)
### Starting build procedure for: rtwdemo_ssreuse
### Successful completion of build procedure for: rtwdemo_ssreuse

Build Summary

Top model targets built:

Model            Action                       Rebuild Reason                   
===============================================================================
rtwdemo_ssreuse  Code generated and compiled  Generated code was out of date.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 11.393s
cfile=fullfile(cgDir, 'rtwdemo_ssreuse_grt_rtw', 'rtwdemo_ssreuse.c');
rtwdemodbtype(cfile, '/* Model step', '/* Model initialize', 1, 0);
/* Model step function */
void rtwdemo_ssreuse_step(void)
{
  /* Outputs for Atomic SubSystem: '<Root>/SS1' */
  myfun();

  /* End of Outputs for SubSystem: '<Root>/SS1' */

  /* Outputs for Atomic SubSystem: '<Root>/SS2' */
  myfun2();

  /* End of Outputs for SubSystem: '<Root>/SS2' */
}

モデルのステップ関数に、関数 myfunmyfun2 の呼び出しが含まれています。これらの関数には void-void インターフェイスがあります。

[関数のパッケージ化] パラメーターを Auto に変更します。

set_param('rtwdemo_ssreuse/SS1','RTWSystemCode','Auto')
set_param('rtwdemo_ssreuse/SS2','RTWSystemCode','Auto')

auto 設定では、Simulink Coder は最適な形式を選択します。このモデルでは、最適な形式は再利用可能な関数です。

モデルを閉じてクリーンアップします。

bdclose(model)
rtwdemoclean;
cd(currentDir)