C コード生成のためのブロックの状態の構成
Unit Delay ブロックの状態など、ブロックの状態は、アルゴリズムの実行サイクル間にある状態値を保持します。コード生成のためモデルを構成する際は、状態データを構成して次のことができます。
メモリに格納されるデータの量を最小限に抑える。
コード ジェネレーターが状態データをメモリ内のどこに配置するかを制御する。
状態データをモデル インターフェイスにプロモートし、コンポーネントおよびシステムがそのデータにアクセスできるようにする。
生成されたコードの可読性およびトレーサビリティを向上させる。
コード生成のためにモデル ConfigurationInterface
についてブロックの状態を構成する方法を、例で説明します。コード マッピング エディター – C またはコード マッピング プログラミング インターフェイス (coder.mapping.api.CodeMapping
) を使用してコード マッピングを構成できます。
状態についてのコード構成オプションの選択
コード生成の要件に応じて、状態データを表現する方法を決定します。既定では、モデルの状態は生成されたコードでは
という名前のグローバル データ構造体のフィールドとして表示されます。カスタマイズを構成しない場合、コード ジェネレーターは生成されたコード内の状態の表現を最適化目的で削除するか変更するかを判断します。カスタマイズを構成する場合は、以下を決定します。model
_DW
既定の構成を設定するかどうか
(10 より多いなど) 多数の状態へのアクセスを取得する必要がある場合、既定の設定で状態を構成してからその設定を特殊なケースについてオーバーライドするのが効率的です。固有のソース要件、ネーミング要件、または配置要件をもつ少数の状態へのアクセスを取得する必要がある場合は、それらの状態を個別に構成することを検討します。
生成されたコードでの状態データの宣言と取り扱いの方法
個別のグローバル変数として
外部コードで定義されているグローバル変数から入力データを読み取るため
アクセス関数への呼び出しとして。Embedded Coder® が必要
これらのオプションの詳細については、生成コードでのデータと関数インターフェイスの制御を参照してください。
その他の考慮事項には次のものがあります。
モデルに表示される状態ラベルを使用して、または一意のコード識別子を使用して、生成されたコードで状態に名前を付けるかどうか。
volatile
型の修飾子をグローバル変数定義および宣言に含めるかどうか。Embedded Coder が必要です。型修飾子 const と volatile を使用したグローバル データの保護を参照してください。状態データをメモリの特定の領域に配置するかどうか。Embedded Coder が必要です。Control Data and Function Placement in Memory by Inserting Pragmasを参照してください。
状態とそれに対応するストレージ クラスとストレージ クラスのプロパティに関連するインターフェイス要件のリストについては、Choose Storage Class and Storage Class Properties for Data Storesを参照してください。
モデル例 ConfigurationInterface
についての状態の要件は次のとおりです。
生成されたコードの実行中のアクセシビリティのため Unit Delay ブロックの状態データを保持する。
状態を別のグローバル変数として表現する。
接頭辞
dtemp_
を、状態を表す変数の名前に適用する。
この例では、生成されたコードでの既定の状態の表現を、static
型修飾子をもつグローバル変数として設定します。次に、Unit Delay ブロックの状態を、既定のストレージ クラスと、必須の接頭辞 dtemp_
を含む一意のコード識別子を使用するよう構成します。コード識別子機能によって、モデルの設計を変更することなくコード生成識別子を指定できます。
状態についての既定のコード生成設定の構成
状態の規定のコード生成設定を使用すると、特に、生成されたコードの実行中にアクセスする状態が多数あるモデルの場合、コード生成のためのモデルの準備作業を軽減できます。構成設定を一度選択すると、コード ジェネレーターによってこれらの設定がモデル全体の状態に適用されます。Simulink® は既定の構成をモデルの一部として保存します。
モデルで固有の要件がない複数の状態を使用する場合や共有の Embedded Coder ディクショナリを使用する場合は、モデルの状態について既定のコード生成設定を構成することを検討してください。
この例では、コード マッピング エディター – C を使用して状態について既定の設定を構成する方法を説明します。コード マッピング エディターを使用して、モデル ConfigurationInterface
の状態についての既定のストレージ クラスを FileScope
に設定します。ストレージ クラス設定をそのようにすると、コード ジェネレーターは、生成されたコードで状態データを static
型修飾子をもつグローバル変数として表します。
モデル
ConfigurationInterface
を開きます。openExample("ConfigurationInterface")
Embedded Coder アプリを開きます。
[C コード] タブで、[コード インターフェイス] 、 [既定のコード マッピング] を選択します。
コード マッピング エディターで、[信号] の下でカテゴリー [Signals, states, and internal data] を選択します。既定のストレージ クラスを
[FileScope]
に設定します。モデルを保存します。
個別の状態に対するコード生成設定の構成
コード生成についての個別の状態を構成できます。たとえば、モデルに固有のコード生成要件をもつ状態が 2 つある場合、状態を個別に構成します。または、状態について既定の設定を構成する場合、特定の状態についてその設定をオーバーライドできます。
モデルが以下の条件のうち少なくとも 1 つを満たす場合、状態に対して個別にコード生成設定を構成することを検討してください。
固有のソース要件、ネーミング要件、または配置要件がある複数の状態を使用する場合。
少数の状態を使用する場合。
状態について既定の構成があり、いくつかの特有の状態についてその構成をオーバーライドする必要がある場合。
この例では、コード マッピング エディターを使用して、既定のストレージ クラス設定をモデル ConfigurationInterface
の Unit Delay ブロックの状態 X
に適用します。
この例では、その状態に対するコード識別子を構成する方法も説明します。コード生成識別子は、たとえば統合用に、モデル設計の変更を伴わずに指定できます。
まだ実行していない場合は、状態についての既定のコード生成設定の構成の手順を完了します。
コード マッピング エディターで、[信号/状態] タブをクリックします。[States] を展開します。状態のストレージ クラスは
Auto
に設定されています。これは、コード ジェネレーターが最適化を目的として関連するコードの表現を削除または変更する可能性があることを意味しています。最適化が不可能な場合、コード ジェネレーターはモデルの既定の構成を適用します。この例の場合、モデルの既定の構成はストレージ クラスFileScope
を指定します。最適化を回避し、コード ジェネレーターで既定の構成が強制的に使われるようにするには、ストレージ クラスを
[Model default]
に設定します。既定の構成をオーバーライドするには、その状態のコード生成に関する要件を満たすストレージ クラスを指定します。
コード マッピング エディターで、状態
X
を選択します。ストレージ クラスを[Model default: FileScope]
に設定します。接頭辞
dstate_
を含む名前をもつ状態のコード識別子を構成します。コード マッピング エディターで、状態X
を選択します。アイコンをクリックして、ストレージ クラス プロパティ [識別子] を
dstate_X
に設定します。モデルを保存します。
コードを生成して表示します。たとえば、
ConfigurationInterface.c
で、状態データのデータ定義を見つけます。static MYTYPE dstate_X;
ステップのエントリポイント関数で使用されている状態データの場所を見つけます。
. . . if (mode) { output = (real_T)mp_K1 * dout_Table1; } else { output = dstate_X; } . . . dstate_X = dout_Table2; }
状態についてのコード生成設定のプログラムでの構成
コード生成のための状態の構成を自動化するには、コード マッピングのプログラミング インターフェイスを使用します。たとえば、カスタム ブロック ライブラリの作成時やアプリケーション テスト環境の作成の一環として、プログラミング インターフェイスを使用してデータの構成を自動化します。
この例では、プログラミング インターフェイスを使用して、モデル ConfigurationInterface
の状態を構成する方法を説明します。生成されたコードでの既定の状態の表現を static
型修飾子をもつグローバル変数として設定します。次に、Unit Delay ブロックの状態 X
を、既定のストレージ クラスと、必須の接頭辞 dstate_
を含む固有のコード識別子を使用するよう構成します。
モデル例を開きます。
openExample("ConfigurationInterface")
関数
coder.mapping.api.get
を呼び出してオブジェクトcm
を作成します。このオブジェクトは、モデルConfigurationInterface
のデータおよび関数のコード生成構成を保存します。cm = coder.mapping.api.get("ConfigurationInterface");
関数
setDataDefault
を呼び出して状態の既定の設定を構成します。引数には、次の値を指定します。coder.mapping.api.get
で返されるオブジェクト既定のカテゴリの
InternalData
プロパティ値
FileScope
をもつプロパティ名StorageClass
setDataDefault(cm,"InternalData","StorageClass","FileScope");
状態についての既定の構成を検証します。
coder.mapping.api.get
およびカテゴリInternalData
によって返されるオブジェクトを指定するgetDataDefault
の呼び出しを発行します。3 番目の引数をプロパティStorageClass
として指定します。getDataDefault(cm,"InternalData","StorageClass")
ans = 'FileScope'
状態
X
に既定の状態の構成を適用します。既定では、Simulink は個別の状態のストレージ クラスを
Auto
に設定します。コード ジェネレーターは次を行います。最適化目的で生成されたコードからデータを削除するかどうかを決定する。
データを保持する場合、既定の構成設定を考慮して、生成されたコード内でデータを効率的に表す方法を決定する。
状態の構成を制御するには、関数
setState
を呼び出します。次を指定する
setState
への呼び出しを発行します。coder.mapping.api.get
によって返されるオブジェクト状態名
X
状態に対してプロパティ
StorageClass
およびプロパティ値Model default
を使用して以前に設定された既定のストレージ クラス。プロパティ
Identifier
およびプロパティ値dstate_X
setState(cm,"X","StorageClass","Model default","Identifier","dstate_X");
関数
getState
を呼び出して構成の変更を検証します。coder.mapping.api.get
によって返されるオブジェクト、状態の名前、プロパティStorageClass
またはプロパティIdentifier
を指定します。getState(cm,"X","StorageClass")
ans = 'Model default'
getState(cm,"X","Identifier")
ans = 'dstate_X'
モデルを保存します。
コードを生成して表示します。たとえば、
ConfigurationInterface.c
で、状態データについてのデータ定義を見つけます。static MYTYPE dstate_X;
ステップのエントリポイント関数で使用されている状態データの場所を見つけます。
. . . if (mode) { output = (real_T)mp_K1 * dout_Table1; } else { output = dstate_X; } . . . dstate_X = dout_Table2; }
状態のストレージ クラスおよびストレージ クラス プロパティの選択
コード生成の要件に応じて、ブロックの状態に対してコード生成を構成するストレージ クラスを次から選択します。ストレージ クラスのリストは Coder ディクショナリで定義されています。
ヒント
既定のマッピングでは、状態は [Signals, states, and internal data] セクションで構成されます。
要件 | 既定のマッピングのストレージ クラス | 個別のマッピングのストレージ クラス |
---|---|---|
生成されたコードで状態を表現する方法をコード ジェネレーターの処理に委ねます。たとえば、最適化の目的で、コード ジェネレーターがデータの表現を削除または変更する可能性があります。 | Auto | |
最適化できないデータ要素の場合、データを標準のデータ構造体のフィールドとして表します。 | 既定値 | |
最適化によってデータ要素のストレージが削除されるのを防ぎ、データ要素のカテゴリに対して既定のマッピングを使用します。 | Model Default | |
共有 Coder ディクショナリを使用する場合は、コード ジェネレーターで最適化しないデータ要素に対するディクショナリの既定値を選択します。 | Dictionary Default | |
boolean、固定小数点、整数のデータを名前付きビット フィールドに保存する構造体を生成します。 | ビットフィールド | |
volatile 型修飾子をもつグローバル変数の定義と宣言を生成します。 | Volatile (Const、Volatile、および ConstVolatileを参照) | Volatile (Const、Volatile、および ConstVolatileを参照) |
グローバル変数の定義と宣言を生成します。 | ExportedGlobal | ExportedGlobal |
グローバル変数の定義と宣言を指定したファイルに生成します。 | ExportToFile | ExportToFile |
static 型修飾子をもつグローバル変数の定義と宣言を生成します。 | FileScope (ローカルおよび共有ローカル データ ストア マッピングのみ) | FileScope (ローカルおよび共有ローカル データ ストア マッピングのみ) |
カスタムのアクセサー関数を呼び出して、データを処理するコードを生成します。 | GetSet | GetSet |
外部コードで定義されたグローバル変数またはグローバル変数のポインターに対して読み取りと書き込みを実行するコードを生成します。 | ImportedExtern、ImportedExternPointer | ImportedExtern、ImportedExternPointer |
ExportToFile | ImportFromFile | ImportFromFile |
関数に対してローカルである変数を生成します。 | Localizable | Localizable |
指定可能な名前をもつグローバル構造体を生成します。 | struct | |
バッファーの再利用を有効にするグローバル変数を生成します。 | Reusable | |
単一インスタンス データに対しては変数、マルチインスタンス データに対しては構造体を生成する。 | MultiInstance | MultiInstance |
使用可能なストレージ クラスのリストには、Embedded Coder ディクショナリで定義された他のプロジェクト固有のストレージ クラスが含まれている可能性があります。リストされているストレージ クラスでは満たされない特別な要件がある場合、Embedded Coder ソフトウェアをお持ちであれば、ストレージ クラスを定義できます。Define Service Interfaces, Storage Classes, Memory Sections, and Function Templates for Software Architectureを参照してください。
個別の状態については、[Identifier] ストレージ クラス プロパティを使用して、生成されたコードで状態を表す変数の名前を構成します。[Identifier] プロパティを空白のままにすると、コード ジェネレーターは状態をもつブロックの [状態名] パラメーターを使用します。このパラメーターが空の場合、コード ジェネレーターはブロック名を使用します。
Embedded Coder を使用し、選択するストレージ クラスに応じて以下のプロパティを構成することもできます。
プロパティ | 説明 | ストレージ クラス |
---|---|---|
DefinitionFile | 状態および外部コードで読み取られるグローバル データの定義を含むソース定義ファイル | ExportToFile および Volatile |
GetFunction | 状態は指定した関数 get への呼び出しとして生成されたコードに表示されます。 | GetSet |
HeaderFile | 状態および外部コードで読み取られるグローバル データの宣言を含むソース ヘッダー ファイル | ExportToFile 、GetSet 、ImportFromFile 、および Volatile |
Memory Section (既定の状態の構成のみ) | 状態で読み取られるデータを含むメモリ セクション | Default |
Owner | コード ジェネレーターは、定義を共有するモデルの階層構造内の複数のモデルのいずれか 1 つに生成されたコード内に状態の定義を配置します。モデル コンフィギュレーション パラメーター [データ定義の配置にデータ オブジェクトからオーナーを使用する] を選択しなければなりません。Control Placement of Global Data Definitions and Declarations in Generated Filesを参照してください。 | ExportToFile および Volatile |
PreserveDimensions | コード ジェネレーターは生成されたコードで多次元配列として表される状態データの次元を保持します。モデル コンフィギュレーション パラメーター [配列のレイアウト] を [行優先] に設定しなければなりません。Preserve Dimensions of Multidimensional Arrays in Generated Codeを参照してください。 | ExportToFile 、FileScope 、GetSet 、ImportFromFile 、Localizable 、および Volatile |
SetFunction | 状態は指定した関数 set への呼び出しとして生成されたコードに表示されます。 | GetSet |
StructName | 状態用に生成されたコード内の構造体の名前。 | BitField および Struct |
参考
コード マッピング エディター – C | coder.mapping.api.CodeMapping