Main Content

インライン化されたサブシステム コードの生成

サブシステム コードをモデル コードにインライン化するには、非バーチャル サブシステムを構成します。サブシステムの [ブロック パラメーター] ダイアログ ボックスで、[関数のパッケージ化] パラメーターを使用してサブシステムの生成コードの形式を指定します。このパラメーターの設定は次のとおりです。

  • 自動

  • インライン

  • 再利用できない関数

  • 再利用可能な関数

コード ジェネレーターでは、[自動] 設定と [インライン] 設定の場合にインライン化コードを生成できます。[インライン] 設定は、サブシステム コードを無条件にインライン化するようにコード ジェネレーターに指示します。

既定の [自動] 設定は、モデル内に存在するサブシステムのインスタンスのタイプと数に基づいて最も効率的なサブシステムのコードを生成するようにコード ジェネレーターに指示します。サブシステムのインスタンスが 1 つだけの場合、[自動] 設定でサブシステム コードがインライン化されます。Embedded Coder® では、サブシステムのインスタンスが複数ある場合、それらがそれほど複雑でなければ、[自動] 設定で各サブシステムのコードがインライン化されます。それ以外の場合、[自動] 設定で関数の単一のコピーが (再利用可能な関数として) 生成されます。複数の呼び出し元をもつ Function-Call Subsystem の場合、[自動] 設定で [再利用できない関数] 設定と同等のサブシステム コードが生成されます。

コードをインライン化するためのサブシステムの構成

  1. サブシステムをもつモデル (SubsystemAtomic など) を開きます。

    openExample('SubsystemAtomic')

  2. Simulink® Coder™ または Embedded Coder を開きます。

    Embedded Coder を使用している場合は、[C コード] タブで、[コードの表示] をクリックして [コード ビュー] エディターを開きます。

  3. Subsystem ブロックを右クリックします。コンテキスト メニューから [ブロックのパラメーター (Subsystem)] を選択します。

  4. [Subsystem のパラメーター] ダイアログ ボックスで [Atomic サブシステムとして扱う] が選択されていることを確認します。このオプションにより、サブシステムが非バーチャルになります。サブシステムが非バーチャルの場合、[コード生成] タブで [関数のパッケージ化] パラメーターが利用可能になります。

  5. [コード生成] タブをクリックし、[関数のパッケージ化] パラメーターから [自動] または [インライン] を選択します。

  6. [適用] をクリックしてダイアログ ボックスを閉じます。

    サブシステムの枠線が太くなり、非バーチャルであることが示されます。

  7. モデルからコードを生成します。コード ジェネレーターで、サブシステム コードが SubsystemAtomic.c 内にインライン化されます。このコードは、システムとブロックの次のような識別タグで識別できます。

    /* Atomic SubSystem Block: <Root>/AtomicSubsys1 */
    

インライン化の例外

特定の状況において、[インライン] 設定を選択しても、コード ジェネレーターで非バーチャル サブシステムがインライン化されないことがあります。

  • インラインでない S-Function で Function-Call Subsystem を呼び出す場合、[インライン] 設定はコード ジェネレーターで無視されます。インラインでない S-Function では関数の呼び出しに関数ポインターを使用するため、コード ジェネレーターですべての引数を含む関数を生成しなければなりません。

  • Function-Call Subsystem を含むフィードバック ループでは、いずれかのサブシステムについて、インライン化コードではなく関数がコード ジェネレーターで生成されます。関数を生成する対象のサブシステムについては、内部で並べ替えられたサブシステムの順序に基づいてコード ジェネレーターで選択されます。

  • オプション SS_OPTION_FORCE_NONINLINED_FCNCALLTRUE に設定された S-Function、Async Interrupt ブロック、または Task Sync ブロックでサブシステムを呼び出す場合、サブシステムのインライン化コードではなく関数がコード ジェネレーターで生成されます。ユーザー定義の Async Interrupt ブロックおよび Task Sync ブロックは VxWorks® ブロック ライブラリ (vxlib1) に格納されます。1

[関数のパッケージ化] パラメーターは Simulink Function ブロックでは無効になります。

参考


1 VxWorks is a registered trademark of Wind River® Systems, Inc.