生成された初期化関数と終了関数の使用
MATLAB® コードから C/C++ コードを生成するとき、初期化と終了の 2 つのハウスキーピング関数がコード ジェネレーターによって自動的に作成されます。初期化関数は、生成される C/C++ エントリポイント関数が扱う状態を初期化します。エントリポイント関数を初めて呼び出す前に呼び出す必要があります。終了関数は、割り当て済みのメモリを解放し、その他のクリーンアップ操作を実行します。エントリポイント関数を最後に呼び出した後に呼び出す必要があります。
初期化関数
生成される初期化関数の名前は primary_function_name_initialize
になります。ここで、primary_function_name は、コード生成中に指定した最初の MATLAB エントリポイント関数の名前です。初期化関数は、生成されるエントリポイント関数が扱う状態を初期化します。初期化関数は、以下を含むことができます。
非有限データ (
Inf
およびNaN
) 用のサポート コードの呼び出し。これらの呼び出しは、MATLAB コードに非有限値を生成する可能性のある演算が含まれる場合に生成されます。変数
global
または変数persistent
を初期化するコード。指定する初期状態を生成するためのカスタム コード。初期化関数にカスタム コードを含めるには、以下のいずれかを行います。
コード構成オブジェクトで、カスタム コードを含む文字ベクトルに
CustomInitializer
を設定します。MATLAB Coder™ アプリの [カスタム コード] タブで、初期化関数用のカスタム コードを指定します。
場合により、初期化コードが必要なく、生成される初期化関数が空になることがあります。
初期化関数の呼び出し
MEX 関数を生成すると、生成されるコードに初期化関数への呼び出しが自動的に含まれます。スタンドアロン コードを生成する場合、次の 2 つの状況が考えられます。
既定では、初期化関数が空でない場合、コード ジェネレーターにより生成される C/C++ エントリポイント関数の先頭に初期化関数への呼び出しが含まれます。生成コードには、エントリポイント関数が複数あったとしても初期化関数が 1 回だけ自動的に呼び出されることを確認するためのチェックも含まれています。この状況では、初期化関数を手動で呼び出す必要はありません。
初期化関数が空の場合、生成される C/C++ エントリポイント関数に初期化関数への呼び出しは含まれません。
生成されるエントリポイント関数が初期化関数の呼び出しを含まないようにすることもできます。次のいずれかを行います。
coder.CodeConfig
オブジェクトまたはcoder.EmbeddedCodeConfig
オブジェクトでRunInitializeFcn
をfalse
に設定します。MATLAB Coder アプリで、[すべての設定] タブで [初期化関数を自動的に実行] を
[いいえ]
に設定します。
この選択をした場合、生成されるエントリポイント関数を初めて呼び出す前に、初期化関数を手動で呼び出さなければなりません。初期化関数を呼び出さなければ、生成されるエントリポイント関数は無効な状態に対して作用することになります。
クラス インターフェイスをもつ 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
を生成します。ここで
はwork
bar.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
を生成します。ここで
はwork
foo.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
を設定します。あるいは、MATLAB Coder アプリの [カスタム コード] タブで、終了関数のカスタム コードを指定します。
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
を生成します。ここで
は work
bar.m
を含むフォルダーです。関数 bar_terminate
は、boolean の isInitialized_bar
(初期化関数の呼び出し後に true
にセットされていた) を false
にセットします。
void bar_terminate(void) { isInitialized_bar = false; }
参考
coder.MexCodeConfig
| coder.CodeConfig
| coder.EmbeddedCodeConfig