最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

生成された初期化関数と終了関数の使用

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 オブジェクトで RunInitializeFcnfalse に設定します。

    • 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\bar にファイル bar_initialize.c を生成します。ここで workbar.m を含むフォルダーです。関数 bar_initialize は、グローバル変数 g を初期化します。

    void bar_initialize(void)
    {
      g = 1.0;
      isInitialized_bar = true;
    }
    
    生成される C 関数 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\foo にファイル foo_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 を設定します。

  • あるいは、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\bar にファイル bar_terminate.c を生成します。ここで workbar.m を含むフォルダーです。関数 bar_terminate は、boolean の isInitialized_bar (初期化関数の呼び出し後に true にセットされていた) を false にセットします。

void bar_terminate(void)
{
  isInitialized_bar = false;
}

参考

| |

関連するトピック