メインコンテンツ

MATLAB コードから生成されたコード内のグローバル変数の宣言および定義の制御

この例では、ストレージ クラスを使用して、MATLAB® コードから生成される C/C++ コード内のグローバル変数の宣言および定義を制御します。ストレージ クラスを使用すると、生成されたコードと外部コードをインターフェイスを介して連携させるのに役立ちます。

この例では、Embedded Coder® ライセンスが必要です。

4 つのグローバル変数を加算する関数 addglobals を記述します。関数内でグローバル変数を宣言します。

function y = addglobals %#codegen
% Define the global variables.
global u;
global v;
global x;
global z;

% Assign the storage classes.
coder.storageClass('u','ExportedGlobal');
coder.storageClass('v','ImportedExtern');
coder.storageClass('x','ImportedExternPointer');
coder.storageClass('z','ExportedDefine');
y = u + v + x + z;
end

インポートされるグローバル変数 u および v を定義および初期化するファイル c:\myfiles\myfile.c を作成します。

#include <stdio.h>

/* Variable definitions for imported variables */ 
double v = 1.0;
double *x = &v;

コード構成オブジェクトを作成します。myfile.c を含めるようにコード生成パラメーターを構成します。出力タイプが 'lib' の場合やソース コードのみを生成する場合は、このファイルを提供せずにコードを生成できます。それ以外の場合は、このファイルを提供する必要があります。

cfg = coder.config('dll','ecoder', true);
cfg.CustomSource = 'myfile.c';
cfg.CustomInclude = 'c:\myfiles';

コードを生成します。この例では、-globals 引数を使用して、グローバル変数 uvx、および z の型と初期値を指定します。代わりに、MATLAB グローバル ワークスペースでグローバル変数を定義することもできます。インポートされるグローバル変数 v および x については、コード ジェネレーターは初期値のみを使用して型を決定します。

codegen -config cfg -globals {'u', 1, 'v', 2, 'x', 3, 'z', 4} addglobals -report

初期値の 123、および 4 から、uvx、および zdouble 型であると codegen で特定されます。codegen により、エクスポートされるグローバル変数 uz が定義および宣言されます。u1.0 に、z4.0 に初期化するコードが生成されます。codegen により、インポートされるグローバル変数 vx が宣言されます。これらの変数は定義されず、これらを初期化するコードも生成されません。vx を定義および初期化するコードは myfile.c から提供されます。

グローバル変数に対して生成されたコードを表示するには、レポートを開きます。[レポートの表示] リンクをクリックします。

addglobals.hExported data define セクション内のエクスポートされるグローバル z の定義を表示します。

/* Definition for custom storage class: ExportedDefine */
#define z                              4.0

エクスポートされるグローバル u の定義と宣言を表示します。

  • uaddglobals.cVariable Definitions セクションで定義されています。

    /* Variable Definitions */
    /* Definition for custom storage class: ExportedGlobal */
    double u;
  • uaddglobals.hVariable Declarations セクションで extern として宣言されています。

    /* Variable Declarations */
    /* Declaration for custom storage class: ExportedGlobal */
    extern double u;
  • uaddglobals_initialize.c で初期化されています。

    /* Include Files */
    #include "addglobals_initialize.h"
    #include "addglobals.h"
    #include "addglobals_data.h"
    
    /* Function Definitions */
    
    /*
     * Arguments    : void
     * Return Type  : void
     */
    void addglobals_initialize(void)
    {
      u = 1.0;
      isInitialized_addglobals = true;
    }

インポートされる外部グローバル v とインポートされる外部グローバル ポインター x の定義と宣言を表示します。

vxaddglobals_data.hVariable Declarations セクションで extern として宣言されています。

/* Variable Declarations */
/* Declaration for custom storage class: ImportedExtern */
extern double v;

/* Declaration for custom storage class: ImportedExternPointer */
extern double *x;

参考

トピック