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