MATLAB Coder が生成コードを分割する方法
生成ファイルの分割
既定では、コードの生成中に、MATLAB® Coder™ はコードを MATLAB ファイル構造に一致するように分割します。この 1 対 1 のマッピングにより、C/C++ で生成されたファイルとコンパイルされた MATLAB コードを容易に関連付けることができます。MATLAB Coder は、生成コード内でインライン化された MATLAB 関数について同様な 1 対 1 の対応を作成することはできません (ファイルの分割とインライン化を参照)。
または、すべての C/C++ 関数を単一のファイル内に生成することを選択できます。詳細は、ファイル分割法の選択方法を参照してください。このオプションを指定すると、コードと既存の組み込みソフトウェアの統合が容易になります。
ファイル分割法の選択方法
MATLAB Coder アプリの使用
[生成] ダイアログ ボックスを開くために、[コード生成] ページの [生成] 矢印
をクリックします。
[詳細設定] をクリックします。
[コード外観] タブで、[生成されたファイルの分割法] を
[MATLAB ファイルごとに 1 つのファイルを生成]
または[すべての関数を 1 つのファイルに生成]
に設定します。
コマンド ラインの入力
codegen
構成オブジェクトの FilePartitionMethod
オプションを使用します。たとえば、入力のない関数 foo
をコンパイルして各 MATLAB 関数に対して 1 つの C/C++ ファイルを生成するには、次の操作を実行します。
MEX 構成オブジェクトを作成して
FilePartitionMethod
オプションを設定します。mexcfg = coder.config('mex'); mexcfg.FilePartitionMethod = 'MapMFileToCFile';
-config
オプションを使用して、構成オブジェクトをcodegen
に渡します。codegen -config mexcfg -O disable:inline foo % Disable inlining to generate one C/C++ file for each MATLAB function
MATLAB ファイルごとに 1 つの C/C++ ファイルに生成ファイルを分割する
既定では、インライン化されていない MATLAB 関数の場合、MATLAB Coder は各 MATLAB ファイルに対して 1 つの C/C++ ファイルを生成します。この場合、MATLAB Coder は、生成された C/C++ コードを MATLAB ファイルに対応するように分割します。
MATLAB Coder がエントリポイント MATLAB 関数を分割する方法
各エントリポイント (最上位レベル) MATLAB 関数の場合は、MATLAB Coder は、C/C++ ソース、ヘッダーおよびオブジェクト ファイルを 1 ファイルで生成し、MATLAB ファイルと同じ名前を付けます。
たとえば、関数 identity
を呼び出す簡単な関数 foo
を定義するとします。ソース ファイル foo.m
は、以下のコードを含みます。
function y = foo(u,v) %#codegen s = single(u); d = double(v); y = double(identity(s)) + identity(d);
以下は、identity.m
のコードです。
function y = identity(u) %#codegen y = u;
MATLAB Coder アプリ内で、foo.m
の C スタティック ライブラリを生成するには次の操作を実行します。
入力
u
およびv
を定義します。詳細は、アプリを使用したエントリポイント関数の入力のプロパティの指定を参照してください。[生成] ダイアログ ボックスを開くために、[コード生成] ページの [生成] 矢印
をクリックします。
[ビルド タイプ] を
[スタティック ライブラリ]
に設定します。[詳細設定] をクリックします。
[すべての設定] タブの [関数のインライン化] の下で、[インラインしきい値] パラメーターを
0
に設定します。[閉じる] をクリックします。
ライブラリを生成するには [生成] をクリックします。
コマンド ラインで foo.m
の C スタティック ライブラリを生成するには、次のように入力します。
codegen -config:lib -O disable:inline foo -args {0, 0} % Use the -args option to specify that u and v are both % real, scalar doubles
MATLAB Coder は、出力フォルダー内に foo
および identity
のソース、ヘッダーおよびオブジェクトの各ファイルを生成します。
MATLAB Coder がローカル関数を分割する方法
各ローカル関数について、MATLAB Coder は呼び出し元の関数と同じ C/C++ ファイル内にコードを生成します。たとえば、ローカル関数 identity
を呼び出す関数 foo
を以下のように定義したとします。
function y = foo(u,v) %#codegen s = single(u); d = double(v); y = double(identity(s)) + identity(d); function y = identity(u) y = u;
C++ ライブラリを生成するには、コードを生成する前に、C++ コンパイラを選択して C++ をターゲット言語として設定します。たとえば、コマンド ラインで次のように入力します。
C++ をターゲット言語として選択します。
cfg = coder.config('lib') cfg.TargetLang='C++'
C++ ライブラリを生成します。
codegen -config cfg foo -args {0, 0} % Use the -args option to specify that u and v are both % real, scalar doubles
基本関数
foo
で、MATLAB Coder がローカル関数identity
のコードをインライン化します。メモ
C++
を指定する場合、MATLAB Coder はC
コードを.cpp
ファイルにラップするため、C++
コンパイラおよび外部C++
アプリケーションとのインターフェイスを使用できます。foo.cpp
内の生成コードの抜粋を次に示します。... /* Function Definitions */ double foo(double u, double v) { return (double)(float)u + v; } ...
MATLAB Coder がオーバーロードされた関数を分割する方法
オーバーロード関数とは、さまざまなクラスの入力に対応するために複数の実装をもつ関数のことです。各実装 (インライン化されていない) について、MATLAB Coder は一意の数値の接尾辞をもつ個別の C/C++ ファイルを生成します。
たとえば、簡単な関数 multiply_defined
を以下のように定義したとします。
%#codegen function y = multiply_defined(u) y = u+1;
次に、multiply_defined
の 2 つの実装を追加します。一方は single
型の入力 (@single
サブフォルダー内) を処理し、もう一方は double
型の入力 (@double
サブフォルダー内) を処理します。
各実装を呼び出すために、関数 call_multiply_defined
を定義します。
%#codegen function [y1,y2,y3] = call_multiply_defined y1 = multiply_defined(int32(2)); y2 = multiply_defined(2); y3 = multiply_defined(single(2));
次に、オーバーロードされた関数 multiply_defined
の C コードを生成します。たとえば、MATLAB コマンド ラインで次のように入力します。
codegen -O disable:inline -config:lib call_multiply_defined
MATLAB Coder は、次に示すように multiply_defined
の各実装に対して C ソース、ヘッダーおよびオブジェクトの各ファイルを生成します。数値接尾辞を使用して、一意なファイル名を作成しています。
生成ファイルと場所
生成ファイルのタイプと場所は、指定したターゲットに依存します。すべてのターゲットについて、ビルド中にエラーや警告が発生した場合、または明示的にレポートを要求した場合、MATLAB Coder はレポートを生成します。
MATLAB Coder は、同じコードまたはプロジェクトに対して同じタイプの出力を生成するたびに、前回ビルドしたファイルを削除します。新しいビルドでファイルが書き換えられないようにする場合は、ファイルを別の場所にコピーしてからビルドを開始します。
MEX ターゲットの生成ファイル
既定では、MATLAB Coder は MEX 関数 (mex
) ターゲットに対して次のファイルを生成します。
ファイルのタイプ | 場所 |
---|---|
プラットフォーム固有の MEX ファイル | 現在のフォルダー |
MEX および C/C++ ソース、ヘッダーおよびオブジェクト ファイル | codegen/mex/function_name |
HTML レポート | codegen/mex/function_name /html |
C/C++ スタティック ライブラリ ターゲットの生成ファイル
既定では、MATLAB Coder は C/C++ スタティック ライブラリ ターゲットに対して次のファイルを生成します。
ファイルのタイプ | 場所 |
---|---|
C/C++ ソース、ライブラリ、ヘッダーおよびオブジェクトの各ファイル | codegen/lib/function_name |
HTML レポート | codegen/lib/function_name /html |
C/C++ ダイナミック ライブラリ ターゲットの生成ファイル
既定では、MATLAB Coder は C/C++ ダイナミック ライブラリ ターゲットに対して次のファイルを生成します。
ファイルのタイプ | 場所 |
---|---|
C/C++ ソース、ライブラリ、ヘッダーおよびオブジェクトの各ファイル | codegen/dll/function_name |
HTML レポート | codegen/dll/function_name /html |
C/C++ 実行可能ファイル ターゲットの生成ファイル
既定では、MATLAB Coder は C/C++ 実行可能ファイル ターゲットに対して次のファイルを生成します。
ファイルのタイプ | 場所 |
---|---|
C/C++ ソース、ヘッダーおよびオブジェクト ファイル | codegen/exe/function_name |
HTML レポート | codegen/exe/function_name /html |
生成ファイルの名前と場所の変更
MATLAB Coder アプリの使用
変更対象 | アクション |
---|---|
出力ファイル名 |
|
出力ファイルの場所 |
|
コマンド ラインの入力. codegen
オプション -o
および -d
を使用して、生成ファイルの名前および場所を変更できます。
ファイルの分割とインライン化
生成された C/C++ コードを MATLAB Coder が分割する方法は、各 MATLAB ファイルに対して 1 つの C/C++ ファイルを生成することを選択するかどうか、および MATLAB 関数をインライン化するかどうかによって変わります。
ユーザーの操作 | MATLAB Coder |
---|---|
すべての C/C++ 関数を単一のファイル内に生成し、インライン化を無効にする | 関数をインライン化せずに単一の C/C++ ファイルを生成します。 |
すべての C/C++ 関数を単一のファイル内に生成し、インライン化を有効にする | 単一の C/C++ ファイルを生成します。サイズがインライン化のしきい値以内にある関数はインライン化します。 |
各 MATLAB ファイルに対して 1 つの C/C++ ファイルを生成し、インライン化を無効にする | 生成された C/C++ コードを、MATLAB ファイル構造に一致するように分割します。MATLAB ファイルごとに 1 つの C/C++ ファイルに生成ファイルを分割するを参照してください。 |
各 MATLAB ファイルに対して 1 つの C/C++ ファイルを生成し、インライン化を有効にする | インライン化先の関数と同じ C/C++ ファイル内にインライン化された関数を配置します。 インライン化を有効にしても、MATLAB Coder はサイズがインライン化のしきい値内にある関数のみをインライン化します。インライン化されない MATLAB 関数については、説明したように MATLAB Coder は生成された C/C++ コードを分割します。 |
ファイルの分割とインライン化の間のトレードオフ
ファイルの分割をインライン化に対して比較すると、可読性、効率および MATLAB コードと既存の組み込みソフトウェアの統合の容易性の間のトレードオフが明らかになります。
ユーザーの生成操作 | 生成される C/C++ コード | 長所 | 短所 |
---|---|---|---|
すべての C/C++ 関数を単一のファイル内に生成する | MATLAB ファイル構造と一致しない | 既存の組み込みソフトウェアとの統合が容易 | C/C++ コードと元の MATLAB ファイルのマッピングが困難 |
各 MATLAB ファイルに対して 1 つの C/C++ ファイルを生成し、インライン化を有効にする | MATLAB ファイル構造と正確には一致しない | プログラムの実行が高速 | C/C++ コードと元の MATLAB ファイルのマッピングが困難 |
各 MATLAB ファイルに対して 1 つの C/C++ ファイルを生成し、インライン化を無効にする | MATLAB ファイル構造と一致する | C/C++ コードと元の MATLAB ファイルのマッピングが容易 | プログラムの実行効率が低い |
インライン化の無効化がファイルの分割に与える影響
インライン化は既定で有効になっています。したがって、最上位の各 MATLAB 関数に対して 1 つの C/C++ ファイルを生成するには、次の操作を行わなければなりません。
最上位レベルの各 MATLAB 関数に対して 1 つの C/C++ ファイルを生成するように選択する。詳細は、ファイル分割法の選択方法を参照してください。
グローバルに、または個別の MATLAB 関数に対してインライン化を明示的に無効にする。
MATLAB Coder アプリを使用してインライン化をグローバルに無効にする方法
[生成] ダイアログ ボックスを開くために、[コード生成] ページの [生成] 矢印
をクリックします。
[詳細設定] をクリックします。
[すべての設定] タブの [関数のインライン化] の下で、[インラインしきい値] を
0
に設定します。
コマンド ラインでインライン化をグローバルに無効にする方法. 関数のインライン化を無効にするには、codegen
の -O disable:inline
オプションを使用します。たとえば、インライン化を無効にし、入力がない関数 foo
の MEX 関数を生成するには、次のように入力します。
codegen -O disable:inline foo
詳細は、codegen
の説明を参照してください。
個別の関数のインライン化を無効にする方法. 個別の MATLAB 関数のインライン化を無効にするには、命令 coder.inline('never');
をソース MATLAB ファイル内の関数シグネチャの後の別の行に追加します。
function y = foo(u,v) %#codegen coder.inline('never'); s = single(u); d = double(v); y = double(identity(s)) + identity(d);
codegen
はエントリポイント関数をインライン化しません。
coder.inline
命令は、命令が配置された関数のみに適用されます。この例では、インライン化は関数 foo
に対して無効にされますが、別の MATLAB ファイルで定義され、foo
により呼び出される最上位の関数である identity
に対しては無効にされません。identity
のインライン化を無効にするには、この命令をソース ファイル identity.m
内の関数シグネチャの後に追加する必要があります。詳細については、coder.inline
を参照してください。
両方の関数のインライン化をより効率的に無効にする方法の詳細は、コマンド ラインでインライン化をグローバルに無効にする方法を参照してください。
C/C++ コードとインライン化された関数の相関
生成した C/C++ コードと元のインライン化された関数を相関するには、MATLAB コード内にコメントを追加して関数を特定します。これらのコメントは C/C++ コード内に配置され、生成したコードと元の MATLAB 関数のマッピングを支援します。
インライン化しきい値の変更
インライン化動作を変更するには、インライン化しきい値パラメーターを調節します。
MATLAB Coder アプリを使用したインライン化しきい値の変更
[生成] ダイアログ ボックスを開くために、[コード生成] ページの [生成] 矢印
をクリックします。
[詳細設定] をクリックします。
[すべての設定] タブの [関数のインライン化] の下で、[インラインしきい値] パラメーターの値を設定します。
コマンド ラインでのインライン化しきい値の変更. 構成オブジェクトの InlineThreshold
パラメーター の値を設定します。coder.MexCodeConfig
、coder.CodeConfig
、coder.EmbeddedCodeConfig
を参照してください。