Embedded Coder ディクショナリ
モデル データおよび関数のコード生成を制御するためのコード定義を作成します。
説明
Embedded Coder® ディクショナリは、コード インターフェイス構成の格納と制御に使用するファイルです。インターフェイス構成で、生成コードが展開先のターゲット プラットフォーム ソフトウェアと対話する方法を定義するカスタム コード インターフェイス定義を作成します。構成をモデルに適用することで、特定のソフトウェア アーキテクチャに既定で準拠するコードを生成できます。たとえば、独自のストレージ クラスを作成して、そのクラスをルートレベルの入力などのモデル データのカテゴリ、またはパラメーターなどの個々のデータ要素に既定で適用できます。
ディクショナリには、次のタイプのインターフェイス構成のいずれか 1 つのみが含まれます。
データ インターフェイス構成 — ターゲット デバイスで実行することを目的としたプログラムがコード ジェネレーターで作成されます。定義したデータ インターフェイスが生成コードで使用されます。
サービス インターフェイス構成 — より大きなアプリケーション内で展開することを目的としたアルゴリズムがコード ジェネレーターで作成されます。プラットフォーム ミドルウェアでアルゴリズムのコードが呼び出され、ターゲット デバイス向けのサービスが提供されます。サービス インターフェイス構成の定義に従って生成コードでサービスが呼び出されます。サービス インターフェイス構成を作成するには、Simulink® データ ディクショナリに格納された Embedded Coder ディクショナリを使用する必要があります。
インターフェイス構成では、次のタイプのコード インターフェイス定義を作成できます。
ストレージ クラス。モデル データ用に生成されたコードを制御します。
関数カスタマイズ テンプレート。
などのモデルのエントリポイント関数の命名を制御します。テンプレートでは、メモリ セクションもエントリポイント関数に適用します。model_stepメモリ セクション。メモリにおけるデータおよび関数の配置を制御します。生成コードには、プラグマなどの、指定した構文をもつカスタムの装飾が含まれます。
サービス。データ転送サービスやタイマー サービスなど、ターゲット プラットフォーム ソフトウェアで提供されるサービスを生成コードで呼び出す方法を制御します。サービスの定義はサービス インターフェイス構成でのみ使用できます。
コード生成定義の作成に関する一般的な詳細については、Define Service Interfaces, Storage Classes, Memory Sections, and Function Templates for Software Architectureを参照してください。

Embedded Coder ディクショナリには、コード定義の各タイプのペインがあります。右側のペインを使用して各定義のプロパティを設定します。プロパティを構成したときに結果を確認するには、疑似コードのプレビューを使用します。
コード マッピング エディターを使用して、ディクショナリで作成した定義をモデル要素に適用できます (Configure Default C Code Generation for Categories of Data Elements and Functionsを参照)。コード マッピング エディター外で使用できるストレージ クラスとメモリ セクションを作成するには、カスタム ストレージ クラス デザイナーを使用します (Create Code Definitions for External Data Objectsを参照)。
Embedded Coder ディクショナリ を開く
Embedded Coder ディクショナリを開くには、モデル ウィンドウの [アプリ] ギャラリーを開き、[Embedded Coder] をクリックして Embedded Coder アプリを開きます。[C コード] タブで [コード インターフェイス]、[Embedded Coder ディクショナリ] を選択します。Embedded Coder ディクショナリ ウィンドウに、ディクショナリに格納されているコード インターフェイス構成が表示されます。
Simulink データ ディクショナリで Embedded Coder ディクショナリを開くには、モデル エクスプローラーの [モデルの階層構造] ペインで、次の操作を行います。
ディクショナリ ノードの下で、[Embedded Coder] ノードを選択します。
ノードが表示されない場合は、ディクショナリ ノードを右クリックして [空のセクションを表示] を選択します。
[ダイアログ] ペイン (右側のペイン) で、[Embedded Coder ディクショナリを開く] をクリックします。
例
ストレージ クラスの作成および検証
モデルで、ブロックの状態を含む内部モデル データを、制御できる特性をもつ構造体に集約するストレージ クラスを作成します。その後に、モデルからコードを生成してストレージ クラスを検証します。
MATLAB® コマンド ウィンドウで以下を入力して、モデル
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を定義しています。その名前は、関数テンプレートで指定した規則に準拠しています。
関数カスタマイズ テンプレートを使用して、生成された C 関数名をカスタマイズする方法の詳細については、Customize Generated Entry-Point C Function NamesおよびCustomize C Functions Generated from Global Simulink Functionsを参照してください。
静的および動的に初期化されたデータで使用するストレージ クラスの作成
この例では、名前がモデル名に依存しているファイルにグローバル変数の定義と宣言を保存するストレージ クラスを作成する方法を示します。ストレージ クラスのコピーを 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
- モデルの階層構造の異なるコンテキストに対応する柔軟なストレージ クラス
- Customize Generated Entry Point C Functions
- Customize C Functions Generated from Simulink Functions
コード定義のプロパティ
制限
Embedded Coder ディクショナリで作成するストレージ クラスまたは関数カスタマイズ テンプレートでは、パッケージから読み込むメモリ セクションを使用できません (パッケージ内のコード生成定義の参照を参照)。Embedded Coder ディクショナリで定義されたメモリ セクションを使用します。
[関数]データ アクセスが設定された Embedded Coder ディクショナリで作成するストレージ クラスは、データ ストア、パラメーター引数調整インターフェイス、測定インターフェイスのストレージ クラスでサポートされません。.mdlモデル ファイルでコード生成定義を作成できません。
データ ディクショナリ (.sldd ファイル) の Embedded Coder ディクショナリ内のコード生成定義に関する追加の制限については、Deploy Code Generation Definitionsを参照してください。