このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
Embedded Coder ディクショナリ
モデル データおよび関数のコード生成を制御するためのコード定義を作成します。
Embedded Coder ディクショナリ を開く
Embedded Coder ディクショナリを開くには、モデル ウィンドウの [アプリ] ギャラリーを開き、[Embedded Coder] をクリックして Embedded Coder アプリを開きます。[C コード] タブで [コード インターフェイス]、[Embedded Coder ディクショナリ] を選択します。Embedded Coder ディクショナリ ウィンドウに、ディクショナリに格納されているコード インターフェイス構成が表示されます。
Simulink® データ ディクショナリで Embedded Coder ディクショナリを開くには、モデル エクスプローラーの [モデルの階層構造] ペインで、次の操作を行います。
ディクショナリ ノードの下で、[Embedded Coder] ノードを選択します。
ノードが表示されない場合は、ディクショナリ ノードを右クリックして [空のセクションを表示] を選択します。
[ダイアログ] ペイン (右側のペイン) で、[Embedded Coder ディクショナリを開く] をクリックします。
例
ストレージ クラスの作成および検証
モデルで、ブロックの状態を含む内部モデル データを、制御できる特性をもつ構造体に集約するストレージ クラスを作成します。その後に、モデルからコードを生成してストレージ クラスを検証します。
次のコマンドを入力して、
RollAxisAutopilot
モデルを開きます。openExample('RollAxisAutopilot');
モデルが Embedded Coder アプリで開かない場合は、アプリを開いて、[C コード] タブをクリックします。
[C コード] タブで [コード インターフェイス]、[Embedded Coder ディクショナリ] を選択します。[Embedded Coder ディクショナリ] ウィンドウには、モデル ファイルに保存されているコード生成定義が表示されます。
左側のペインで、[ストレージ クラス] をクリックします。[ストレージ クラス] セクションで、[作成] をクリックします。
リストの末尾に表示されている新しいストレージ クラス
StorageClass1
を選択します。右側のペインで、次の表にリストされているプロパティ値を設定します。プロパティ 値 名前 InternalStruct
ヘッダー ファイル internalData_$R.h
定義ファイル internalData_$R.c
ストレージ タイプ Structured
[構造体のプロパティ] 、 [タイプ名] internalData_T_$M
[構造体のプロパティ] 、 [インスタンス名] internalData_$M
変更後、下部のペインで、疑似コードのプレビューに想定どおりの内容が反映されているか確認します。
モデル エディターに戻ります。インターフェイス エディターを開くには、キャンバスの下で、[コード マッピング] をダブルクリックします。[データの既定の設定] タブで、[信号] セクションを展開します。[Signals, states, and internal data] 行を選択し、[ストレージ クラス] を
[InternalStruct]
に設定します。[コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成]、[コード配置] ペインで、[ファイル パッケージ化形式] を
[モジュラー]
に設定します。コードを生成します。
Simulink エディターのコード ビューで、
internalData_RollAxisAutopilot.h
ファイルを開いて検査します。このファイルでは、構造体型internalData_T_
を定義しています。そのフィールドはモデル内のブロックの状態を表します。/* Storage class 'InternalStruct', for system '<Root>' */ typedef struct { real32_T FixPtUnitDelay1_DSTATE; /* '<S7>/FixPt Unit Delay1' */ real32_T Integrator_DSTATE; /* '<S1>/Integrator' */ int8_T Integrator_PrevResetState; /* '<S1>/Integrator' */ } internalData_T_;
また、このファイルでは
internalData_
という名前のグローバル構造体変数も宣言しています。/* Storage class 'InternalStruct' */ extern internalData_T_ internalData_;
ファイル
internalData_RollAxisAutopilot.c
を開いて検査します。このファイルでは、internalData_
にメモリを割り当てています。/* Storage class 'InternalStruct' */ internalData_T_ internalData_;
関数カスタマイズ テンプレートの作成
関数テンプレートを使用して、生成されたエントリポイント関数の名前を制御する規則を指定できます。この手法を使うと、エクスポート関数モデルやマルチレートでマルチタスクのモデルなど、多くのエントリポイント関数があるモデルで時間を節約し、保守作業を削減できます。
この例は、命名規則 func_$N_$R
を指定する関数テンプレートを作成する方法を示しています。$N
は生成される各関数のベース名で、$R
は Simulink モデルの名前です。
モデル例
MultirateMultitaskingBareBoard
を開きます。ブロック線図を更新します。このマルチタスク モデルには 2 つの実行レートがあるため、生成されるコードには対応する 2 つのエントリポイント関数が含まれます。
モデルで、モデル コンフィギュレーション パラメーター [システム ターゲット ファイル] を
ert.tlc
に設定します。関数カスタマイズ テンプレートを使用するには、ERT ベースのシステム ターゲット ファイルを使用する必要があります。Simulink エディターで、Embedded Coder アプリを開いて、Embedded Coder ディクショナリを開きます。
Embedded Coder ディクショナリの [関数カスタマイズ テンプレート] タブで [作成] をクリックします。
新しい関数テンプレートに対して、次のプロパティを設定します。
[名前] を
myFunctions
にします。[関数名] を
func_$N_$R
にします。
変更後、疑似コードのプレビューに想定どおりの内容が反映されているか確認します。
モデル ウィンドウで、コード マッピング エディターを開きます。[関数の既定の設定] タブの [初期化/終了] 行と [実行] 行で、
[関数カスタマイズ テンプレート]
を [myFunctions] に設定します。コードを生成します。
コード ビューで、ファイル
MultirateMultitaskingBareBoard.c
を開いて検証します。このファイルでは、2 つの実行関数func_step0_MultirateMultitaskingBareBoard
とfunc_step1_MultirateMultitaskingBareBoard
を定義しています。その名前は、関数テンプレートで指定した規則に準拠しています。
メモリ セクションの作成方法を示す例については、Control Data and Function Placement in Memory by Inserting Pragmasを参照してください。
静的および動的に初期化されたデータで使用するストレージ クラスの作成
この例では、名前がモデル名に依存しているファイルにグローバル変数の定義と宣言を保存するストレージ クラスを作成する方法を示します。ストレージ クラスのコピーを 2 つ作成して、1 つのコピーをパラメーター データ (データ カテゴリ [モデル パラメーター]) で使用し、もう 1 つのコピーを他のデータで使用できるようにします。
通常、生成されたコードは、パラメーター データを関数外で静的に初期化し、他のデータをモデル初期化関数で動的に初期化します。カスタム ストレージ クラス デザイナーまたは Embedded Coder ディクショナリを使用してストレージ クラスを作成する場合は、[データの初期化] プロパティを設定して初期化メカニズムを指定します。
Embedded Coder ディクショナリでは、ストレージ クラスごとに、[静的]
または [動的]
の初期化を選択しなければなりません。ストレージ クラスはパラメーター データ用 ([静的]
) と他のデータ用 ([動的]
) に 1 つずつコピーを作成することを検討してください。
次のコマンドを入力して、
RollAxisAutopilot
モデルを開きます。openExample('RollAxisAutopilot');
[C コード] タブが開いていない場合は、Embedded Coder アプリを開いて、[C コード] タブをクリックします。
[コード インターフェイス] 、 [Embedded Coder ディクショナリ]を選択します。
左側のペインで、[ストレージ クラス] をクリックします。[ストレージ クラス] セクションで、[作成] をクリックします。
新しいストレージ クラスの場合は、次のプロパティを設定します。
[名前] を
SigsStates
にします。[ヘッダー ファイル] を
$R_my_data.h
にします。[定義ファイル] を
$R_my_data.c
にします。[データの初期化] を
[動的]
にします。
変更後、疑似コードのプレビューに想定どおりの内容が反映されているか確認します。
ストレージ クラス [SigsStates] の行にカーソルを合わせて、[コード定義を複製します] をクリックします。新しいストレージ クラス
SigsStates_copy
が表示されます。新しいストレージ クラスの場合は、次のプロパティを設定します。
[名前] を
Params
にします。[データの初期化] を
[静的]
にします。
疑似コードのプレビューに想定どおりの内容が反映されているか確認します。
モデルで、コード マッピング エディターを開きます。モデル キャンバスの下で、[コード マッピング - コンポーネント インターフェイス] をダブルクリックします。
[データの既定の設定] タブで、[パラメーター] 、 [モデル パラメーター] 行の [ストレージ クラス] 列にある
[Params]
を選択します。[信号] 、 [Signals, states, and internal data] の行で、[ストレージ クラス] を
[SigsStates]
に設定します。モデルでいくつかのパラメーター データ要素を構成して、最適化によってこれらの要素が生成されたコードから除去されないようにします。[モデル化] タブで、[設計] 、 [モデル ワークスペース] をクリックします。
モデル エクスプローラーの中央のペインで、モデル ワークスペースの変数
dispGain
、intGain
、rateGain
に対応する 3 つの行を選択します。行の 1 つを右クリックして、
[パラメーター オブジェクトに変換]
をクリックします。モデル データ エディターにより、ワークスペース変数がSimulink.Parameter
オブジェクトに変換されます。dispGain
パラメーター行の [ストレージ クラス] 列で、[構成] をクリックします。モデル ウィンドウのコード マッピング エディターにdispGain
パラメーターの行が強調表示されます。変数ごとに、[ストレージ クラス] 列で、
[Model default:Params]
を選択します。これは、[モデル パラメーター] で指定した既定のストレージ クラスを取得することを表します。[コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成]、[コード配置] ペインで、[ファイル パッケージ化形式] を
[モジュラー]
に設定します。コードを生成します。
コード ビューで、
RollAxisAutopilot_my_data.c
ファイルとRollAxisAutopilot_my_data.h
ファイルを開いて検査します。これらのファイルでは、パラメーター オブジェクトおよび一部のブロックの状態 (BasicRollMode
サブシステム内の Integrator ブロックの状態など) に対応するグローバル変数を定義して宣言します。/* Storage class 'SigsStates' */ real32_T rtFixPtUnitDelay1_DSTATE; real32_T rtIntegrator_DSTATE; int8_T rtIntegrator_PrevResetState; /* Storage class 'Params' */ real32_T dispGain = 0.75F; real32_T intGain = 0.5F; real32_T rateGain = 2.0F;
パッケージ内のコード生成定義の参照
パッケージに保存されているコード生成定義を参照するように Embedded Coder ディクショナリを構成できます (Create Code Definitions for External Data Objectsを参照)。これらの定義は、コード マッピング エディターに選択できる状態で表示されます。この例では、組み込みのパッケージ例 ECoderDemos
内に保存されている定義を参照するように、RollAxisAutopilot
内の Embedded Coder ディクショナリを構成します。
RollAxisAutopilot
の Embedded Coder ディクショナリを開きます。手順については、ストレージ クラスの作成および検証を参照してください。Embedded Coder ディクショナリ ウィンドウの [メモリ] タブで、[パッケージの管理] をクリックします。
[パッケージの管理] ダイアログ ボックスで、[更新] をクリックします。追加オプションが [パッケージの選択] ドロップダウン リストに表示されるまで待ちます。
[パッケージの選択] を
[ECoderDemos]
に設定し、[読み込み] をクリックします。[Embedded Coder ディクショナリ] ウィンドウの [ストレージ クラス] タブのテーブルに、
ECoderDemos
パッケージで定義されたストレージ クラスが表示されます。次に、RollAxisAutopilot
では、コード マッピング エディターの [データの既定の設定] タブでこれらのストレージ クラスを選択できます。パッケージをアンロードするには、[パッケージの管理] ダイアログ ボックスの [パッケージの選択] ドロップダウン リストでパッケージを選択し、[アンロード] をクリックします。
データ ディクショナリを使用してモデル間でコード生成定義を共有する方法を示す例については、Share Code Interface Configuration Between Modelsを参照してください。
共有 Embedded Coder ディクショナリで既定のコード マッピングを構成する方法を示す例については、Configure Default Code Mapping in a Shared Dictionaryを参照してください。
関連する例
- Define Service Interfaces, Storage Classes, Memory Sections, and Function Templates for Software Architecture
- Deploy Code Generation Definitions
- Generate Code to Conform to Software Architecture by Sharing and Copying Default Settings Between Models
- モデルの階層構造の異なるコンテキストに対応する柔軟なストレージ クラス
パラメーター
制限
Embedded Coder ディクショナリで作成するストレージ クラスまたは関数カスタマイズ テンプレートでは、パッケージから読み込むメモリ セクションを使用できません (パッケージ内のコード生成定義の参照を参照)。Embedded Coder ディクショナリで定義されたメモリ セクションを使用します。
[関数]
データ アクセスが設定された Embedded Coder ディクショナリで作成するストレージ クラスは、データ ストア、パラメーター引数調整インターフェイス、測定インターフェイスのストレージ クラスでサポートされません。.mdl
モデル ファイルでコード生成定義を作成できません。
データ ディクショナリ (.sldd
ファイル) の Embedded Coder ディクショナリ内のコード生成定義に関する追加の制限については、Deploy Code Generation Definitionsを参照してください。