主要内容

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

サブシステムからの再呼び出し可能なコ,ドの生成

コードジェネレーターが同一の原子サブシステムに対して出力するコード量を削減するには,データを引数として渡す(たとえば,ブロックの入出力の場合はrtB_ *,連続状態の場合はrtDW_ *,およびパラメ,タ,の場合はrtP_ *)再利用可能な関数としてサブシステムを設定できます。既定では,コードジェネレーターは共有メモリに存在するグローバルデータ構造体へのアクセスを共有して他のコードとやりとりするサブシステムコードを作成します。デ,タを引数として渡すことで,コ,ドは再呼び出し可能になります。コドの各ンスタンスは独自の固有デタを維持します。

再利用および再呼び出しが可能になるようサブシステムを設定するには,同一サブシステムのマスクおよびブロックパラメーターを同じ方法で設定します。コードジェネレーターはチェックサムを実行してサブシステムが同一かどうか,およびコードが再利用可能かどうか判断します。コードが再利用可能な場合,コードジェネレーターは再利用可能な再呼び出し可能関数コードの単一のインスタンスを生成します。

サブシステムブロックパラメ,タ,を設定するには,次の手順に従います。

  1. サブシステムがバ,チャルの場合は,ブロックパラメ,タ,原子的サブシステムとして扱う,作为原子单位对待原子的サブシステムとして扱うを選択して関数のパッケ,ジ化パラメ,タ,を有効にします。

  2. ブロックパラメタ関数のパッケージ化、功能包装関数のパッケージ化函数包装[再利用可能な関数]に設定します。コドジェネレタは,サブシステムごとに引数をも個別の関数を生成します。[再利用可能な関数]を選択すると,コードジェネレーターがサブシステムコードに対して生成する関数とファイルの名前の制御に使用できる追加のパラメーターも有効になります。

  3. ブロックパラメタ関数名オプション,函数名选项関数名オプション函数名选项の値を選択します。再利用可能な,再呼び出し可能コ,ドを生成するには,同一のサブシステムに同じ設定を指定します。

    • コ,ドジェネレ,タ,で関数名を決定させるには,[自動]を選択します。

    • サブシステム名(ラ▪▪ブラリブロックの場合はラ▪▪ブラリブロックの名前)を使用するには,[サブシステム名を使用]を選択します。

    • ブロックパラメタ関数名,函数名称関数名函数名称を表示し,一意の有効なc / c++関数名を入力するには,[ユ,ザ,指定]を選択します。

    モデル参照階層内に同一サブシステムの複数の电子邮箱ンスタンスが存在する場合は,[自動]を選択します。

    嵌入式编码器®を使用している場合は,識別子の形式制御を使用できます。标识符格式控制(嵌入式编码)を参照してください。

  4. ファイル名オプション,文件名称选项ファイル名オプション文件名选项を設定します。再利用可能な,再呼び出し可能コ,ドを生成するには,同一のサブシステムに同じ設定を指定します。

    • コ,ドジェネレ,タ,でファ,[自動]を選択します。

    • サブシステム名(ラ▪▪ブラリブロックの場合はラ▪▪ブラリブロックの名前)を使用するには,[サブシステム名を使用]を選択します。

    • 関数名を使用するには,ブロックパラメ,タ,[関数名オプション]で指定したとおり,[関数名を使用]を選択します。

    • ブロックパラメタファイル名(拡張子なし),文件名(不扩展)ファイル名(拡張子なし)文件名(不扩展)を表示し、拡張子(. c. cppなど)を除くファ选区ル名を入力するには,[ユ,ザ,指定]を選択します。

    その他の考慮事項は次のとおりです。

    • モデル参照階層内に同一サブシステムの複数の电子邮箱ンスタンスが存在する場合は,[自動]を選択します。

    • コードジェネレーターでサブシステム用の別のファイルが生成されない場合,関数コードは,サブシステムの親システムから生成されたファイルに配置されます。親がモデルそれ自体である場合,コ,ドジェネレ,タ,は関数コ,ドを模型. cまたは模型. cppに配置します。

    • 生成コ,ドがソ,ス管理の対象である場合は,[自動]以外の値を指定します。このように指定すると,モデルを変更したり,リビルドするときに,生成されたファイル名は変更されません。

    • [サブシステム名を使用]を選択すると,モデルに模型ブロックが含まれている場合や,モデル参照のターゲットがモデルに対して生成されている場合,コードジェネレーターはサブシステムファイル名をマングルします。このような場合,コドジェネレタはファル名模型子系统. cを使用します。

サブシステムaにマスクパラメ,タ,bKがあり,サブシステムbにマスクパラメ,タ,cKがある場合,コ,ドの再利用は実行できません。コ,ドジェネレ,タ,はサブシステムa,とb,用に個別の関数を生成します。サブシステムとBに個別にブロックパラメーターを設定する場合,コードの再利用は実行できません。

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

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

  • 内联:サブシステムコドのンラン化

  • 那种一次性的功能: I/Oがグロバルデタとして渡される関数

  • 可重用的功能: I/Oが関数の引数として渡される関数

  • 汽车:コンテキストに基づいてSi金宝appmulink Coderにより最適化

可重用的功能および汽车に設定すると,コ,ドジェネレ,タ,でサブシステムコ,ドの再利用が許可されます。可重用的功能および那种一次性的功能に設定すると,[関数名オプション][関数名][ファescル名。オプション]のパラメ,タ,が有効になります。

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

モデル例

rtwdemo_ssreuseモデルには,魔法石,第1章およびSS2という2の同一のサブシステムが含まれています。これらのサブシステムでは,[関数のパッケ,ジ化]パラメ,タ,が可重用的函数に設定され,[関数名]パラメ,タ,がmyfunになっています。これらのサブシステムはパラメ,タ,化されたマスクサブシステムです。マスクサブシステムの内容を表示するには,サブシステムブロックを右クリックし,[マスク][マスク内を。表示]を選択します。

模型=“rtwdemo_ssreuse”;open_system(模型);

コ,ドの生成と検査

ビルドと検査プロセス用に一時フォルダ,を作成します。金宝app仿真软件编码器アプリまたは嵌入式编码器アプリを開きます。次に,コ,ドを生成して検査します。

currentDir = pwd;[~, cgDir] = rtwdemodir ();slbuild(模型)
###开始构建过程:rtwdemo_ssreuse成功完成构建过程:rtwdemo_ssreuse构建摘要构建的顶级模型目标:模型动作重建原因================================================================================================ rtwdemo_ssreuse生成和编译的代码生成信息文件不存在。构建1 / 1模型(0个模型已经更新)构建持续时间:0h 0m 14.436s
用= fullfile (cgDir,“rtwdemo_ssreuse_grt_rtw”“rtwdemo_ssreuse.c”);rtwdemodbtype(用'/*模拟步骤'/*模型初始化, 1, 0);
/*模型步函数*/ void rtwdemo_ssreuse_step(void){/*原子子系统的输出:'<根>/SS1' */ /*输入:'<根>/In1'合并:*输入:'<根>/In2' */ myfun(rtwdemo_ssreuse_U. 0)。三机一体,rtwdemo_ssreuse_U。In2 rtwdemo_ssreuse_P。T1Data,rtwdemo_ssreuse_P.T1Break, &rtwdemo_ssreuse_B.SS1); /* End of Outputs for SubSystem: '/SS1' */ /* Outport: '/Out1' */ rtwdemo_ssreuse_Y.Out1 = rtwdemo_ssreuse_B.SS1.LookupTable; /* Outputs for Atomic SubSystem: '/SS2' */ /* Inport: '/In1' incorporates: * Inport: '/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: '/SS2' */ /* Outport: '/Out2' */ rtwdemo_ssreuse_Y.Out2 = rtwdemo_ssreuse_B.SS2.LookupTable; }

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

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

set_param (“rtwdemo_ssreuse(魔法石,第1章”“RTWSystemCode”“内联”) set_param (“SS2 rtwdemo_ssreuse /”“RTWSystemCode”“内联”

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

slbuild(模型)
###为:rtwdemo_ssreuse开始构建过程成功完成:rtwdemo_ssreuse的构建过程构建摘要构建的顶级模型目标:模型动作重建原因=============================================================================== rtwdemo_ssreuse生成和编译的代码生成的代码已经过时。构建1 / 1模型(0个模型已经更新)构建持续时间:0h 0m 12.037s
用= fullfile (cgDir,“rtwdemo_ssreuse_grt_rtw”“rtwdemo_ssreuse.c”);rtwdemodbtype(用'/*模拟步骤'/*模型初始化, 1, 0);
/*模型步长函数*/ void rtwdemo_ssreuse_step(void) {real_T Out1_tmp;/* output for Atomic SubSystem: '<根>/SS2' */ /* output for Atomic SubSystem: '<根>/SS1' */ /* Sum: '/Sum'合并:* Inport: '<根>/In1' * Inport: '<根>/In2' * Sum: '/Sum' */ Out1_tmp = rtwdemo_ssreuse_U。In1 + rtwdemo_ssreuse_U.In2;/* End of Outputs for SubSystem: '/SS2' */ /* Outport: '/Out1'合并:* Lookup_n-D: '/Lookup Table' * Sum: '/Sum' */ rtwdemo_ssreuse_Y. Outport: '/Out1'Out1 = look1_binlx(Out1_tmp, rtwdemo_ssreuse_P。T1Break rtwdemo_ssreuse_P。T1Data 10 u);/* End of Outputs for SubSystem: '/SS1' */ /* Outputs for Atomic SubSystem: '/SS2' */ /* Outport: '/Out2'合并:* Lookup_n-D: '/Lookup Table' */ rtwdemo_ssreuse_Y。Out2 = look1_binlx(Out1_tmp, rtwdemo_ssreuse_P。T2Break rtwdemo_ssreuse_P。T2Data 10 u);/* output for SubSystem: '/SS2' */}

モデルのステップ関数では,サブシステムコ,ドは。

[関数のパッケ,ジ化]パラメ,タ,を那种一次性的功能に変更します。SS2の場合は,[関数名]パラメ,タ,をmyfun2に変更します。

set_param (“rtwdemo_ssreuse(魔法石,第1章”“RTWSystemCode”“那种一次性函数”) set_param (“SS2 rtwdemo_ssreuse /”“RTWSystemCode”“那种一次性函数”) set_param (“SS2 rtwdemo_ssreuse /”“RTWFcnName”“myfun2”

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

slbuild(模型)
###为:rtwdemo_ssreuse开始构建过程成功完成:rtwdemo_ssreuse的构建过程构建摘要构建的顶级模型目标:模型动作重建原因=============================================================================== rtwdemo_ssreuse生成和编译的代码生成的代码已经过时。构建1 / 1模型(0个模型已经更新)构建持续时间:0h 0m 11.393秒
用= fullfile (cgDir,“rtwdemo_ssreuse_grt_rtw”“rtwdemo_ssreuse.c”);rtwdemodbtype(用'/*模拟步骤'/*模型初始化, 1, 0);
/*模型步函数*/ void rtwdemo_ssreuse_step(void){/*输出原子子系统:'<根>/SS1' */ myfun();/* output for SubSystem: '/SS1' */ /* output for Atomic SubSystem: '/SS2' */ myfun2();/* output for SubSystem: '/SS2' */}

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

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

set_param (“rtwdemo_ssreuse(魔法石,第1章”“RTWSystemCode”“汽车”) set_param (“SS2 rtwdemo_ssreuse /”“RTWSystemCode”“汽车”

汽车設定では,金宝appSimulink Coderは最適な形式を選択します。このモデルでは,最適な形式は再利用可能な関数です。

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

bdclose rtwdemoclean(模型);cd (currentDir)

制限

  • コードジェネレーターはチェックサムを使用して,サブシステムが同一であり再利用可能であるかどうかを判断します。次の場合,サブシステムコ,ドは再利用されません。

    • ブロックとデ,タオブジェクトで,シンボルを使用して次元を指定している。

    • 端子のサンプル時間,データ型,実数/複素数,フレームステータス,次元がサブシステムによって異なる。

    • サブシステムの出力がグロ,バル信号としてマ,クされている。

    • 名前やパラメ,タ,設定の異なる同一ブロックがサブシステムに含まれている。

    • サブシステムの出力が合并ブロックに接続されていて,合并ブロックの出力がアドレス指定できないメモリ(设置など)としてcコ,ドに実装されるカスタムストレ,ジクラスを使用して設定されている。

    • サブシステムの入力が非スカラーで,アドレス指定できないメモリとしてCコードに実装されるカスタムストレージクラスを使用して設定されている。

    • マスクサブシステムが非スカラーのパラメーターをもち,アドレス指定できないメモリとしてCコードに実装されるカスタムストレージクラスを使用して設定されている。

    • モデルコンフィギュレ,ションパラメ,タ,の既定のパラメ,タ,動作[調整可能]に設定した場合に,函数调用子系统はマスクパラメーターを使用する。マスクされた函数调用子系统を再利用するには,それを新しい原子子系统内にマスクなしで配置します。次に,触发ブロックをマスクサブシステムから原子子系统に移動します。

    • サブシステムのブロックは“部分的に調整可能な式”を使用する。部分的に調整可能な式によってはコ,ドの再利用を無効にします。

      部分的に調整可能な式は,1以上の調整可能な変数と調整不可能な式が含まれる式です。たとえば,値15.23をも調整可能な変数Kと,値(5、7、9)をも調整可能な変数Pを作成すると仮定します。式P 'は調整不可能なので,式K + P 'は部分的に調整可能な式になります。調整可能な式の制限の詳細については、調整可能な式の制限を参照してください。

  • 再利用可能なS-Functionブロックを含むサブシステムでは,ブロックは代码重用的s函数にリストされている要件を満たなければなりません。

  • [再利用可能な関数]が選択されていて,コードジェネレーターがサブシステムのコードが再利用できないと判断すると,再利用できない別の関数が生成されます。その関数が再利用可能かどうかは,それが1つのサブシステムだけで使用されている場合でも,コード生成レポートで確認できる可能性があります。(関数として導入するのではなく)このような場合のコードジェネレーターのインラインサブシステムコードが必要な場合は,関数のパッケージ化、功能包装関数のパッケージ化函数包装[自動]に設定します。

  • 再利用可能なサブシステムで共有のローカルデータストアを使用し,モデルデータ要素に対して既定のマッピングを構成している場合は,カテゴリ[共享本地数据存储]の既定のストレ,ジクラスマッピングを[既定]に設定したままにします。

  • サブシステムにおける次のブロックの使用は,サブシステムコ,ドの再利用を妨げる場合があります。

    • 范围ブロック(デ,タログが有効化されている)

    • 一定基準を満たさないS-Functionブロック(代码重用的s函数を参照)

    • 提交ブロック(デ,タログが有効化されている)

    • 到工作区ブロック(デ,タログが有効化されている)

  • 再利用可能なライブラリサブシステム(参照モデル間で共有されるサブシステム)の場合,コードジェネレーターはチェックサムを使用してサブシステムが同一かどうかを判別します。コードジェネレーターは再利用可能なライブラリサブシステムコードを共有ユーティリティフォルダーに置きますが,この再利用可能コードは最上位モデルや参照モデルの生成コードからは独立です。たとえば,再利用可能なラ模型. h模型_types.hは含みません。

    コードジェネレーターが共有ユーティリティフォルダーに置き,かつモデルコード依存である再利用可能コードはコンパイルされません。コードジェネレーターによって,再利用可能なライブラリサブシステムコードがモデルコード依存であると判別されると,その再利用可能なサブシステムコードは共有ユーティリティフォルダーに配置されません。再利用可能なライブラリサブシステムが次の場合,コードジェネレーターはモデルコード依存のコードを生成します:

    • 一步ブロック,連続時間またはマルチレートブロックなど,時間関連の機能を使用するブロックを含む。

    • 1以上の型号ブロックを含む。

    • ▪▪▪▪ンラ▪▪▪ン化されていないサブシステムまたは再利用可能なラ▪▪▪ブラリサブシステムを含む。

    • デ,タ宣言を模型_ert_rtwにあるファ▪▪ルに配置するストレ▪ジクラスをも▪信号またはパラメ▪タ▪を含む(たとえば,ExportedGlobalストレ,ジクラスはデ,タを模型. cに配置)。

    • 枚举,Simulink.金宝app signal, Simulink。参数など,[デ,タスコ,プ][エクスポ,ト]に設定されていないユ,ザ,定義ストレ,ジクラスを含む。コ,ドジェネレ,タ,は型定義を模型_types.hに配置している場合があります。

    • プリプロセッサ条件を生成する变体子系统である。コ,ドジェネレ,タ,はバリアントオブジェクトを定義するプリプロセッサ命令を模型_types.hに配置します。

  • モデルに同じサブシステムのインスタンスが複数あり,一方のサブシステムは常数ブロックに接続されてもう一方は接続されていない場合,サブシステムを再利用できません。この制限を回避するには,サブシステムの前に信号转换ブロックを挿入します。

  • チェックサムが異なる2の再利用可能なサブシステムでは,生成コドで同じ関数を共有できません。[ブロックパラメ,タ,(子系统)][コ,ド生成][関数名]で両方のサブシステムに同じ関数名を指定すると,次のようになります。

    • サブシステムがライブラリにリンクされている場合,コードジェネレーターは関数名をマングルして一意の関数名を生成します。コ,ドジェネレ,タ,による関数名の生成にはサブシステムの命名規則が使用されます。

    • サブシステムがラブラリにリンクされていない場合,コドジェネレタはエラを発行します。

上記の制限はラブラリベスのコド生成にも適用されます。詳細にいては,基于库的可重用库子系统代码生成(嵌入式编码)を参照してください。

関連するトピック