Main Content

C コード生成用のデータ ストアの構成

データ ストアによって、サブシステムや参照モデルは I/O 端子を使用してレベル間でデータの受け渡しを行わなくてもデータを共有することができます (データ ストアの基礎および生成されたコード内のデータ ストアを参照)。データ ストアのタイプには、次の表に示すタイプが含まれます。

データ ストアのタイプ説明
ローカル データ ストアモデルの階層構造において、そのデータ ストアが定義されているレベル以下の任意の場所からアクセスできるデータ ストア。ローカル データ ストアは、Data Store Memory ブロックを含めることにより、モデル内でグラフィカルに定義できます。
共有ローカル データ ストアブロック パラメーター [モデル インスタンス間で共有する] が設定された Data Store Memory ブロック。これらのデータ ストアは、それらが定義されているモデルでのみアクセスできます。データ ストア値は、モデルのインスタンス間で共有されます。
グローバル データ ストアベース ワークスペースまたはデータ ディクショナリの信号オブジェクトで定義されるデータ ストア。アプリケーション内の複数のモデルがこれらのデータ ストアを使用できます。

[Simulink Coder] アプリでモデルを開くと、ローカル データ ストアと共有ローカル データ ストアがコード マッピング エディターに表示され、コード生成用にデータ ストアを構成できます。モデルでグローバル データ ストアを使用している場合は、データ ストア名の右に表示される [Refresh] リンクをクリックすると、それらをコード マッピング エディターで表示できます。このリンクにより、ブロック線図の更新が開始され、モデルで使用しているグローバル データ ストアがエディター ビューに追加されます。

データ ストアを構成すると次のことができます。

  • 生成コードの実行中に操作するためにデータをアクセス可能にする。

  • コード ジェネレーターがデータをメモリ内のどこに配置するかを制御する。

  • 生成コードの可読性とトレーサビリティを高める。

コード生成用に、この例ではモデル ConfigurationRapidPrototypingInterface のデータ ストアを構成する方法を示します。コード マッピング エディター – C またはコード マッピング API (coder.mapping.api.CodeMapping) を使用してコード マッピングを構成できます。

データ ストアのカスタマイズ オプションの選択

既定では、モデルのローカル データ ストアは、生成されたコードでは model_DW という名前のグローバル データ構造体のフィールドとして表示されます。共有ローカル データ ストアは、グローバル データ構造体 model_SharedDSM のフィールドとして表示されます。コード インターフェイスの要件に基づいて、データ ストアのコード生成をカスタマイズするかどうかを決定します。カスタマイズを構成しない場合、コード ジェネレーターは生成されたコード内のデータ ストアの表現を最適化目的で削除するか変更するかを判断します。カスタマイズを構成する場合は、以下を決定します。

  • 既定の構成を設定するかどうか

    プログラム実行中にアクセスできるようにする必要がある特定のカテゴリのデータ ストアがモデルに多数含まれている場合 (たとえば 10 個を超える場合)、既定の設定でデータ ストアを構成し、特殊な場合にその設定をオーバーライドする方が効率的です。ソース、名前付け、または配置に関して固有の要件をもつ特定のカテゴリのデータ ストアがモデルに少ししか含まれていない場合は、データ ストアを個別に構成することを検討します。

  • 生成されたコードでのモデルのデータ ストアの宣言と取り扱いの方法

    • 個別のグローバル変数として

    • 外部コードで定義されたグローバル変数としてデータ ストアから読み取る

    • アクセス関数への呼び出しとして。Embedded Coder® が必要

    これらのオプションの詳細については、生成コードでのデータと関数インターフェイスの制御を参照してください。

モデル パラメーターのその他の考慮事項には、次を実行するかどうかが含まれます。

データ ストアに関連するインターフェイスの要件とそれに対応するストレージ クラスおよびストレージ クラス プロパティのリストについては、データ ストアのストレージ クラスおよびストレージ クラス プロパティの選択を参照してください。

モデル例 ConfigurationRapidPrototypingInterface のデータ ストアの要件は次のとおりです。

  • ローカル データ ストアおよび共有ローカル データ ストアを個別のグローバル変数として表現する。

  • データ ストアを表す変数の名前に接頭辞 ds_ を適用する。

この例では、生成されたコードでのローカル データ ストアおよび共有ローカル データ ストアの既定の表現をグローバル変数として設定します。次に、モデル内のローカル データ ストアについて、既定のストレージ クラスと必須の接頭辞 ds_ を含む一意のコード識別子を使用するように構成します。コード識別子機能によって、モデルの設計を変更することなくコード生成識別子を指定できます。

データ ストアに対する既定のコード生成設定の構成

データ ストアに対する既定のコード生成設定を使用すると、生成されたコードの実行中にアクセスするデータ ストアが多数あるモデルの場合は特に、コード生成用のモデルの準備作業を軽減できます。構成設定を一度選択すると、コード ジェネレーターによってそれらの設定がモデル全体のデータ ストアに適用されます。Simulink® は既定の構成をモデルの一部として保存します。

固有の要件がない特定のカテゴリのデータ ストアをモデルで複数使用する場合は、モデルのデータ ストアについて既定のコード生成設定を構成することを検討します。

この例では、コード マッピング エディター – C を使用してデータ ストアに対する既定の設定を構成する方法を示します。コード マッピング エディターを使用して、モデル ConfigurationRapidPrototypingInterface のローカル データ ストアと共有ローカル データ ストアに対する既定のストレージ クラスを ExportedGlobal に設定します。ストレージ クラス設定をそのようにすると、コード ジェネレーターは、生成されたコードでデータ ストアをグローバル変数として表します。

  1. モデル ConfigurationRapidPrototypingInterface を開きます。書き込み可能な場所にモデルのコピーを保存します。

    Simulink model to use for learning how to configure model data stores for code generation.

  2. Simulink Coder アプリを開きます。

  3. [C コード] タブで、[コード インターフェイス][既定のコード マッピング] を選択します。

  4. ローカル データ ストアの既定のコード マッピングを構成します。コード マッピング エディターの [データの既定の設定] タブで、[信号] ノードを展開します。カテゴリ [Signals, states, and internal data] を選択します。ストレージ クラスを [ExportedGlobal] に設定します。

    Code Mappings editor with Data Defaults tab selected, Signals tree node expanded, and storage class for Signals, states, and internal data set to ExportedGlobal.

  5. 共有ローカル データストアの既定のコード マッピングを構成します。カテゴリ [Shared local data stores] を選択します。ストレージ クラスを [ExportedGlobal] に設定します。

  6. モデルを保存します。

個々のデータ ストアについてのコード生成の構成

コード生成用に個々のデータ ストアを構成できます。たとえば、固有のコード生成要件をもつ同じカテゴリのデータ ストアがモデルに 2 つある場合、データ ストアを個別に構成します。または、データ ストアのカテゴリに対して既定の設定を構成する場合、特定のデータ ストアについてそれらの設定をオーバーライドできます。

モデルが以下の条件のうち少なくとも 1 つを満たす場合、データ ストアに対して個別にコード生成設定を構成することを検討してください。

  • ソース、名前付け、または配置に関して固有の要件をもつ同じカテゴリのデータ ストアを複数使用する。

  • 同じカテゴリのデータ ストアをいくつか使用する。

  • データ ストアのカテゴリに対する既定の構成があり、いくつかの特定の状態についてその構成をオーバーライドする必要がある。

この例では、コード マッピング エディターを使用して既定のストレージ クラス設定をモデル ConfigurationInterfaceData Store Memory ブロック mode に適用する方法を示します。この例では、そのデータ ストアに対するコード識別子を構成する方法も示します。

  1. まだ実行していない場合は、データ ストアに対する既定のコード生成設定の構成の手順を完了します。

  2. コード マッピング エディターで [データ ストア] タブをクリックします。[Local Data Stores] を展開します。データ ストア mode のストレージ クラスは Auto に設定されています。これは、コード ジェネレーターが最適化を目的として関連するコードの表現を削除または変更する可能性があることを意味しています。最適化が不可能な場合、コード ジェネレーターはモデルの既定の構成を適用します。この例では、モデルの既定の構成でストレージ クラス ExportedGlobal が指定されます。

    • 最適化を回避し、コード ジェネレーターで既定の構成が強制的に使われるようにするには、ストレージ クラスを [Model default] に設定します。

    • 既定の構成をオーバーライドするには、そのデータ ストアのコード生成に関する要件を満たすストレージ クラスを指定します。

  3. コード マッピング エディターで、ローカル データストア mode を選択します。ストレージ クラスを [Model default:ExportedGlobal] に設定します。

  4. データストアのコード識別子を接頭辞 ds_ を含む名前で構成します。コード マッピング エディターで、共有ローカル データストア mode を選択します。Icon to configure additional code mapping properties アイコンをクリックして、ストレージ クラス プロパティ [識別子]ds_mode に設定します。

    Code Mappings editor with Data Stores tab selected, Shared Local Data Stores tree node expanded, and storage class for data store mode set to Model default: ExportedGlobal. Mapping Inspector shows Identifier property for data store mode set to ds_mode.

  5. モデルを保存します。

  6. コードを生成して表示します。たとえば、ConfigurationRapidPrototypingInterface.c で、データ ストアのデータ定義を見つけます。

    boolean_T ds_mode;                        
    

    ステップのエントリポイント関数で使用されている状態データの場所を見つけます。

    .
    .
    .
      ds_mode = ((input1 > ConfigurationRapidPrototypingInterface_UPPER) || (input1 <
                  ConfigurationRapidPrototypingInterface_LOWER));
    .
    .
    .
      if (ds_mode) {
        output = (real_T)mp_K1 * dout_Table1;
      } else {
        output = dstate_X;
      }
    .
    .
    .
    

データ ストアに対するコード生成設定のプログラムによる構成

コード生成用のデータ ストアの構成を自動化するには、コード マッピングのプログラミング インターフェイスを使用します。たとえば、カスタム ブロック ライブラリまたはアプリケーション テスト環境の一部を作成する場合は、プログラミング インターフェイスを使用してデータの構成を自動化します。

この例では、プログラミング インターフェイスを使用してモデル ConfigurationRapidPrototypingInterface のデータ ストアを構成する方法を示します。生成されたコードでのローカル データ ストアおよび共有ローカル データ ストアの既定の表現をグローバル変数として設定します。次に、Data Store Memory ブロック mode について、既定のストレージ クラスと必須の接頭辞 ds_ を含む一意のコード識別子を使用するように構成します。

  1. モデル例を開きます。

    openExample("ConfigurationRapidPrototypingInterface")
    
  2. 関数 coder.mapping.api.get を呼び出してオブジェクト cm を作成します。オブジェクトは、モデル ConfigurationRapidPrototypingInterface のデータのコード生成構成を保存します。

    cm = coder.mapping.api.get("ConfigurationRapidPrototypingInterface");
    
  3. 関数 setDataDefault を呼び出してローカル データ ストアの既定の設定を構成します。引数には、次の値を指定します。

    • coder.mapping.api.get で返されるオブジェクト

    • 既定のカテゴリの InternalData

    • プロパティ値 ExportedGlobal をもつプロパティ名 StorageClass

    setDataDefault(cm,"InternalData","StorageClass","ExportedGlobal");
    
  4. 関数 setDataDefault を呼び出して共有ローカル データ ストアの既定の設定を構成します。引数には、次の値を指定します。

    • coder.mapping.api.get で返されるオブジェクト。

    • 既定のカテゴリの SharedLocalDataStore

    • プロパティ値 ExportedGlobal をもつプロパティ名 StorageClass

    setDataDefault(cm,"SharedLocalDataStore","StorageClass","ExportedGlobal");
    
  5. ローカル データ ストアおよび共有ローカル データ ストアに対する既定の構成の設定を検証します。coder.mapping.api.get によって返されるオブジェクト、カテゴリ InternalData、およびプロパティ StorageClass を指定する getDataDefault の呼び出しを発行します。2 番目の getDataDefault の呼び出しで、カテゴリを SharedLocalDataStore に置き換えます。

    getDataDefault(cm,"InternalData","StorageClass")
    
    ans =
    
        'ExportedGlobal'
    
    getDataDefault(cm,"SharedLocalDataStore","StorageClass")
    
    ans =
    
        'ExportedGlobal'
    
    getDataDefault(cm,"SharedLocalDataStore","StorageClass")
    
    ans =
    
        'Volatile'
    
  6. ローカル データ ストア mode の既定の構成を適用します。

    既定では、Simulink はデータ ストアのストレージ クラスを Auto に設定します。ストレージ クラスが Auto の場合、コード ジェネレーターは次を行います。

    • 最適化目的で生成されたコードからデータを削除するかどうかを決定する。

    • データを保持する場合、既定の構成設定を考慮して、生成されたコード内でデータを効率的に表す方法を決定する。

    個々のデータ ストアの構成を制御するには、関数 setDataStore を呼び出します。次を指定する setDataStore への呼び出しを発行します。

    • coder.mapping.api.get によって返されるオブジェクト

    • データ ストア名 mode

    • プロパティ StorageClass およびプロパティ値 Model default を使用してデータ ストアについて以前に設定された既定のストレージ クラス。

    • プロパティ Identifier およびプロパティ値 ds_mode

    setDataStore(cm,"mode","StorageClass","Model default","Identifier","ds_mode");
    
  7. 関数 getDataStore を呼び出して構成の変更を検証します。coder.mapping.api.get によって返されるオブジェクト、データ ストアの名前、プロパティ StorageClass またはプロパティ Identifier を指定します。

    getDataStore(cm,"mode","StorageClass")
    
    ans =
    
        'Model default'
    
    getDataStore(cm,"mode","Identifier")
    
    ans =
    
        'ds_mode'
    
  8. モデルを保存します。

  9. コードを生成して表示します。たとえば、ConfigurationRapidPrototypingInterface.c で、データ ストアのデータ定義を見つけます。

    boolean_T ds_mode;                        
    

    ステップ エントリポイント関数内でデータ ストアが使用されている場所を見つけます。

    .
    .
    .
      ds_mode = ((input1 > ConfigurationRapidPrototypingInterface_UPPER) || (input1 <
                  ConfigurationRapidPrototypingInterface_LOWER));
    .
    .
    .
      if (ds_mode) {
        output = (real_T)mp_K1 * dout_Table1;
      } else {
        output = dstate_X;
      }
    .
    .
    .
    

データ ストアのストレージ クラスおよびストレージ クラス プロパティの選択

コード生成の要件に応じて、データ ストアに対してコード生成を構成するストレージ クラスを次から選択します。

要件既定のマッピングのストレージ クラス個別のマッピングのストレージ クラス
より効率的なコードを生成するように、最適化を有効にします。 Auto
最適化できないデータ要素の場合、データを標準のデータ構造体のフィールドとして表します。既定値 
最適化によってデータ要素のストレージが削除されるのを防ぎ、データ要素のカテゴリに対して既定のストレージ クラスを使用します。 Model Default
グローバル変数の定義と宣言を生成します。ExportedGlobalExportedGlobal
外部コードで定義されたグローバル変数またはグローバル変数のポインターに対して読み取りと書き込みを実行するコードを生成します。ImportedExtern、ImportedExternPointerImportedExtern、ImportedExternPointer

使用可能なストレージ クラスのリストには、Embedded Coder ディクショナリで定義された他のプロジェクト固有のストレージ クラスが含まれている可能性があります。リストされているストレージ クラスでは満たされない特別な要件がある場合、Embedded Coder ソフトウェアをお持ちであれば、ストレージ クラスを定義できます。Define Service Interfaces, Storage Classes, Memory Sections, and Function Templates for Software Architecture (Embedded Coder)を参照してください。

個別のデータ ストアについては、[識別子] ストレージ クラス プロパティを使用して、生成されたコードでデータ ストアを表す変数の名前を構成します。

参考

|

関連するトピック