生成された初期化関数と終了関数の使用
MATLAB® コードから C/C++ コードを生成するとき、初期化と終了の 2 つのハウスキーピング関数がコード ジェネレーターによって自動的に作成されます。初期化関数は、生成される C/C++ エントリポイント関数が扱う状態を初期化します。エントリポイント関数を初めて呼び出す前に呼び出す必要があります。終了関数は、割り当て済みのメモリを解放し、その他のクリーンアップ操作を実行します。エントリポイント関数を最後に呼び出した後に呼び出す必要があります。
初期化関数
生成される初期化関数の名前は primary_function_name_initialize になります。ここで、primary_function_name は、コード生成中に指定した最初の MATLAB エントリポイント関数の名前です。初期化関数は、生成されるエントリポイント関数が扱う状態を初期化します。初期化関数は、以下を含むことができます。
非有限データ (
InfおよびNaN) 用のサポート コードの呼び出し。これらの呼び出しは、MATLAB コードに非有限値を生成する可能性のある演算が含まれる場合に生成されます。変数
globalまたは変数persistentを初期化するコード。指定する初期状態を生成するためのカスタム コード。初期化関数にカスタム コードを含めるには、以下のいずれかを行います。
コード構成オブジェクトで、カスタム コードを含む文字ベクトルに
CustomInitializerを設定します。[コード生成設定] ダイアログ ボックスの [カスタム コード] ペインで、初期化関数のカスタム コードを指定します。
場合により、初期化コードが必要なく、生成される初期化関数が空になることがあります。
初期化関数の呼び出し
MEX 関数を生成すると、生成されるコードに初期化関数への呼び出しが自動的に含まれます。スタンドアロン コードを生成する場合、次の 2 つの状況が考えられます。
既定では、初期化関数が空でない場合、コード ジェネレーターにより生成される C/C++ エントリポイント関数の先頭に初期化関数への呼び出しが含まれます。生成コードには、エントリポイント関数が複数あったとしても初期化関数が 1 回だけ自動的に呼び出されることを確認するためのチェックも含まれています。この状況では、初期化関数を手動で呼び出す必要はありません。
初期化関数が空の場合、生成される C/C++ エントリポイント関数に初期化関数への呼び出しは含まれません。
生成されるエントリポイント関数が初期化関数の呼び出しを含まないようにすることもできます。次のいずれかを行います。
coder.CodeConfigオブジェクトまたはcoder.EmbeddedCodeConfigオブジェクトでRunInitializeFcnをfalseに設定します。[コード生成設定] ダイアログ ボックスで [初期化関数を自動的に実行] チェック ボックスをオフにします。
この選択をした場合、生成されるエントリポイント関数を初めて呼び出す前に、初期化関数を手動で呼び出さなければなりません。初期化関数を呼び出さなければ、生成されるエントリポイント関数は無効な状態に対して作用することになります。
クラス インターフェイスをもつ C++ コードを生成する場合、初期化操作と終了操作を実行するクラス コンストラクターおよびデストラクターがコード ジェネレーターによって生成されます。関数 initialize と関数 terminate を手動で呼び出す必要はありません。クラス インターフェイスをもつ C++ コードの生成を参照してください。
生成される初期化関数の例
MATLAB コード パターンと、それに対して生成される初期化関数の例を以下に示します。
MATLAB コードに変数
globalまたは変数persistentが使用されている場合。たとえば、次の MATLAB 関数を定義します。function y = bar global g y = g; end
barのスタティック ライブラリを生成します。gの初期値を1に指定します。codegen -config:lib -globals {'g',1} bar
コード ジェネレーターは、
にファイルwork\codegen\lib\barbar_initialize.cを生成します。ここではworkbar.mを含むフォルダーです。関数bar_initializeは、グローバル変数gを初期化します。生成される C 関数void bar_initialize(void) { g = 1.0; isInitialized_bar = true; }barには、bar_initializedへの呼び出しが含まれます。これは boolean のisInitialized_barを使用して、初期化関数が 1 回だけ自動で呼び出されることを確認します。double bar(void) { if (!isInitialized_bar) { bar_initialize(); } return g; }MATLAB コードに非有限値 (
InfまたはNaN) を生成する可能性のある演算が含まれる場合。たとえば、factorialを呼び出す MATLAB 関数fooを定義します。関数factorialのサイズはすぐに大きくなり、一定のしきい値より大きい入力に対してInfを返します。double型の入力の場合、しきい値は170です。MATLAB でfactorial(171)を実行すると、Infを返します。function y = foo(a) y = factorial(a); end
fooのスタティック ライブラリを生成します。codegen -config:lib foo -args {1}
コード ジェネレーターは、
にファイルwork\codegen\lib\foofoo_initialize.cを生成します。ここではworkfoo.mを含むフォルダーです。関数foo_initializeは非有限データ用のサポート コードrt_InitInfAndNaNを呼び出します。これは、別の生成ファイルrt_nonfinite.cに定義されています。void foo_initialize(void) { rt_InitInfAndNaN(); isInitialized_foo = true; }
終了関数
生成される終了関数の名前は primary_function_name_terminate になります。ここで、primary_function_name は、コード生成中に指定した最初の MATLAB エントリポイント関数の名前です。終了関数は、割り当て済みのメモリを解放し、その他のクリーンアップ操作を実行します。
終了関数には、指定するカスタムのクリーンアップ コードを含めることができます。終了関数にカスタム コードを含めるには、次のいずれかを行います。
コード構成オブジェクトで、カスタム コードを含む文字ベクトルに
CustomTerminatorを設定します。[コード生成設定] ダイアログ ボックスの [カスタム コード] ペインで、終了関数のカスタム コードを指定します。
MEX 関数を生成する場合、生成されるコードには終了関数への呼び出しが自動的に含まれます。
スタンドアロン コードを生成する場合、生成されるコードには終了関数への呼び出しは自動的に含まれません。その場合、生成されるエントリポイント関数を最後に呼び出した後に、終了関数を手動で呼び出さなければなりません。
終了関数は、永続変数の状態のクリアにも使用されます。永続変数は、終了関数が呼び出されるまでその状態を保持します。詳細については、永続変数のコード生成を参照してください。
生成される終了関数の例
以下の MATLAB 関数を定義します。
function y = bar global g y = g; end
bar のスタティック ライブラリを生成します。g の初期値を 1 に指定します。
codegen -config:lib -globals {'g',1} bar
コード ジェネレーターは、 にファイル work\codegen\lib\barbar_terminate.c を生成します。ここで は workbar.m を含むフォルダーです。関数 bar_terminate は、boolean の isInitialized_bar (初期化関数の呼び出し後に true にセットされていた) を false にセットします。
void bar_terminate(void)
{
isInitialized_bar = false;
}
参考
coder.MexCodeConfig | coder.CodeConfig | coder.EmbeddedCodeConfig