生成コード内の行列の配列レイアウトを選択
Stateflow® チャートからのコード生成時に、行列の配列のレイアウトを指定できます。たとえば、以下の行列を考えます。
コード ジェネレーターは、既定で列優先のレイアウトを使用して行列を 1 次元配列に変換し、次の配置でメモリに保存します。
{1, 4, 2, 5, 3, 6}
行優先のレイアウトを選択すると、コード ジェネレーターは行列を 1 次元配列に変換し、次の配置でメモリに保存します。
{1, 2, 3, 4, 5, 6}
Embedded Coder® がある場合は、行列の多次元性を保持して、次の配置の 2 次元配列として保存できます。
{{1, 2, 3}, {4, 5, 6}}
詳細については、行列および配列のコード生成 (Simulink Coder)およびDimension Preservation of Multidimensional Arrays (Embedded Coder)を参照してください。
列優先の配列レイアウト
既定では、Simulink® モデルの [配列のレイアウト] コンフィギュレーション パラメーターは Column-Major
です。モデルからのコード生成時に、コード ジェネレーターはすべての行列データを列優先のレイアウトの 1 次元配列にフラット化します。
たとえば、以下の Stateflow チャートには、サイズが [2 3]
のローカル データ x
が含まれています。ステート アクションにより、x
内の要素に、行と列の番号によってインデックスが付けられます。
このモデルのコードを生成するには、次を行います。
[アプリ] タブで、[Simulink Coder] または [Embedded Coder] を選択します。
[C コード] タブで、[ビルド] をクリックします。
ファイル sf_matrix_layout.c
は以下のコード行を使用して、ローカル データ x
を列優先のレイアウトで実装します。
... sf_matrix_layout_DW.x[0] = 1.0; sf_matrix_layout_DW.x[2] = 2.0; sf_matrix_layout_DW.x[4] = 3.0; sf_matrix_layout_DW.x[1] = 4.0; sf_matrix_layout_DW.x[3] = 5.0; sf_matrix_layout_DW.x[5] = 6.0; ...
生成されたコードは、1 つのインデックスのみを使用してx
の要素を参照します。インデックスは昇順で現れません。
行優先の配列レイアウト
行優先のレイアウトにより、特定のアルゴリズムのパフォーマンスが改善する場合があります。例については、行優先の配列レイアウトのための内挿アルゴリズム (Embedded Coder)を参照してください。
行優先の配列レイアウトを使用するコードを生成するには、次を行います。
[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。
[コード生成]、[インターフェイス] ペインで、[配列のレイアウト] パラメーターを [
Row-Major
] に設定します。Simulink Coder を使用したコード生成 (Simulink Coder)またはEmbedded Coder を使用したコード生成 (Embedded Coder)の説明に従ってコードを生成します。
ファイル sf_matrix_layout.c
は以下のコード行を使用して、ローカル データ x を実装します。
... sf_matrix_layout_DW.x[0] = 1.0; sf_matrix_layout_DW.x[1] = 2.0; sf_matrix_layout_DW.x[2] = 3.0; sf_matrix_layout_DW.x[3] = 4.0; sf_matrix_layout_DW.x[4] = 5.0; sf_matrix_layout_DW.x[5] = 6.0; ...
生成されたコードは、1 つのインデックスのみを使用してx
の要素を参照します。インデックスが昇順で現れます。
行優先の配列レイアウトを有効にすると、カスタム コードの関数にチャート データとメッセージ データを引数として行優先の配列レイアウトで渡すことができます。また、カスタム コード変数の既定のレイアウトとして、行優先を使用することもできます。カスタム コード関数の既定の配列レイアウトとして行優先を実装するには、次を行います。
[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。
[コード生成]、[インターフェイス] ペインで、[配列のレイアウト] パラメーターを [
Row-Major
] に設定します。[シミュレーション ターゲット] ペインの [詳細設定パラメーター] で、[カスタム コードのインポート] を選択します。
[インポート設定] タブで、[既定の関数配列のレイアウト] パラメーターを
Row-major
に設定します。
また、個々の関数に行優先の配列レイアウトを指定することもできます。[シミュレーション ターゲット] ペインの [インポート設定] タブで、[関数による例外] をクリックします。[カスタム コード関数の配列のレイアウト] ウィンドウで、関数の追加や削除を行い、各関数の個々の配列レイアウトを指定できます。
カスタム C コードを使用するチャートで行優先の配列レイアウトを有効にする場合、カスタム コードで定義されるカスタム コード関数のグローバル変数と引数は、スカラー、ベクトル、またはスカラーとベクトルからなる構造体である必要があります。n 要素のベクトルのサイズは n と指定します。[n 1] または [1 n] として指定しないでください。
変化検出演算子を使用するチャートで行優先の配列レイアウトを有効にすると、コード生成でエラーが発生します。変化検出演算子を使用するチャートでコードを生成する前に、列優先の配列レイアウトを有効にします。変化検出演算子を参照してください。
多次元配列レイアウト
Embedded Coder がある場合は、データを 1 次元配列としてフラットにすることなく Stateflow データの多次元性を保持するコードを生成できます。
多次元配列のレイアウトを使用して前の例のコードを生成するには、次を行います。
行優先のレイアウトを有効にします。
[アプリ] タブで、[Embedded Coder] を選択します。
[C コード] タブで、[コード インターフェイス]、[既定のコード マッピング] を選択して、[コード マッピング] エディターと [プロパティ インスペクター] を開きます。
[コード マッピング] エディターの [データの既定の設定] タブで、[Signals, states, and internal data] カテゴリを選択し、[ストレージ クラス] を
Localizable
に設定します。コード マッピング エディターが空の場合は、Simulink モデルに移動します。[プロパティ インスペクター] の [コード] セクションで、[PreserveDimensions] を選択します。
[C コード] タブで、[ビルド] をクリックします。
ファイル sf_matrix_layout.c
は以下のコード行を使用して、ローカル データ x を実装します。
... sf_matrix_layout_DW.x[0][0] = 1.0; sf_matrix_layout_DW.x[0][1] = 2.0; sf_matrix_layout_DW.x[0][2] = 3.0; sf_matrix_layout_DW.x[1][0] = 4.0; sf_matrix_layout_DW.x[1][1] = 5.0; sf_matrix_layout_DW.x[1][2] = 6.0; ...
生成されたコードは、2 つのインデックスを使用して x の要素を参照します。
多次元配列レイアウトは以下で使用できます。
Stateflow チャート内の定数データとローカル データ
Stateflow チャート内のメッセージ データ
Simulink モデル内のパラメーター、およびルートレベルの入力端子と出力端子のデータ
多次元レイアウトは、多次元配列データを含むバス信号では使用できません。
多次元レイアウトは、再利用可能なチャートまたは再利用可能な親サブシステム内のチャートでサポートされていません。
詳細については、Preserve Dimensions of Multidimensional Arrays in Generated Code (Embedded Coder)を参照してください。
インポートされたバスの多次元配列の制限
カスタム コードで定義されたバスに多次元配列が含まれている場合、そのバスをインポートすることはできません。
多次元配列を含むバスをカスタム コードで使用するには、Stateflow でバスを定義し、そのバスをカスタム コードに渡します。
カスタム コードでバスを定義して渡す方法の詳細については、Stateflow チャートのカスタム構造体の統合を参照してください。
参考
モデル設定
- 配列のレイアウト (Simulink Coder) | 既定の関数配列のレイアウト (Simulink) | 関数による例外 (Simulink)
関連するトピック
- Stateflow ブロックからの C または C++ コードの生成
- 行列および配列のコード生成 (Simulink Coder)
- 行優先の配列レイアウトのための内挿アルゴリズム (Embedded Coder)
- Dimension Preservation of Multidimensional Arrays (Embedded Coder)
- Preserve Dimensions of Multidimensional Arrays in Generated Code (Embedded Coder)