Main Content

ステート関数の生成コード内インライン化

ステート関数の生成コードのインライン化

既定の設定では、コード ジェネレーターは内部の経験則を使用してステート関数の生成コードをインライン化するかどうかを判定します。この経験則では、インラインのしきい値が考慮されます。コードのサイズが増減すると、ステート関数の生成コードが予測できなくなる可能性があります。

モデルに Stateflow® オブジェクトが含まれていて、生成コードとそれに対応するステート関数との間のトレーサビリティに関する必要条件が厳密な場合は、既定の動作をオーバーライドできます。状態プロパティ Function Inline Option を使用して、明示的にステート関数のインライン化を強制するか、回避します。

インライン化を強制した場合

あるステートに対してインライン化を強制すると、コード ジェネレーターはステート アクションに対するコードを親関数にインライン化します。親関数には、ステート アクション、外部遷移およびフロー チャートを実行するためのコードが含まれています。空のステート アクションに対するコードはインクルードされません。

インライン化を回避した場合

あるステートのインライン化を回避すると、コード ジェネレーターはステート foo について以下の静的関数を生成します。

関数説明

enter_atomic_foo

foo がアクティブになり、その entry アクションが実行されます。

enter_internal_foo

既定のパスが呼び出されます。

inner_default_foo

内部遷移およびデフォルト遷移がステート内にある同じジャンクションに達した場合、派生するフロー チャートを実行します。

フロー チャートがインラインのしきい値を超えるに十分な複素数である場合のみ、コード ジェネレーターはこの関数を生成します。

生成コードでは、Stateflow ソフトウェアはこの関数を、関数 enter_internal_foo と関数 foo の両方から呼び出します。

foo

有効な外部遷移の存在が調べられ、存在しない場合はアクション中に実行されます。

exit_atomic_foo

exit アクションが実行され、foo が非アクティブになります。

exit_internal_foo

子サブステートの exit アクションが実行され、foo が終了します。

以下のチャートがモデル M 内にあるとします。

ステート A のインライン化を回避すると、コード ジェネレーターはこのコードを生成します。

static void M_inner_default_A(void);
static void M_exit_atomic_A(void);
static void M_A(void);
static void M_enter_atomic_A(void);
static void M_enter_internal_A(void);

ステート関数インライン オプションの設定方法

ステートに対して関数インライン化プロパティを設定するには、以下の手順を実行します。

  1. ステートを右クリックし、コンテキスト メニューから [プロパティ] をクリックします。

    ステートのプロパティ ダイアログ ボックスが表示されます。

  2. プロパティ [関数インライン オプション] で、次のいずれかの値を選択します。

    動作
    インラインステート関数の親関数へのインライン化が強制されます。ただし、親関数が漸化式の一部でない場合に限ります。インライン化を強制した場合を参照してください。
    関数ステート関数のインライン化が回避されます。そのステートに対して最大 6 つの静的関数が生成されます。インライン化を回避した場合を参照してください。
    自動ステート関数がインライン化されるかどうかが、内部の経験則を使用して判定されます。
  3. [適用] をクリックします。

ステート関数のインライン化制御のベスト プラクティス

目的[関数インライン オプション] プロパティの設定
ステートのアクションごとに、またそのサブステートのアクションごとに、個別の関数を生成するステートと各サブステートで [関数] に設定
ステートのアクションごとに個別の関数を生成するが、そのサブステートの関連アクションに対するコードをインクルードするステートは [関数] に、各サブステートは [インライン] に設定