Main Content

グローバル変数を含むコードの固定小数点への変換

この例では固定小数点コンバーター アプリを使用してグローバル変数を含む MATLAB® アルゴリズムを固定小数点に変換する方法について説明します。

  1. ローカルの書き込み可能なフォルダーで関数 use_globals.m を作成します。

    function y = use_globals(u)
    %#codegen
    % Declare AR and B as global variables
    global AR;
    global B;
    AR(1) = u + B(1);
    y = AR * 2;

  2. 同じフォルダーに関数を呼び出すテスト ファイル use_globals_tb.m を作成します。

    u = 55;
    global AR B;
    AR = ones(4);
    B=[1 2 3];
    y = use_globals(u);

  3. MATLAB ツールストリップの [アプリ] タブの [コード生成] で、[固定小数点コンバーター] アプリ アイコンをクリックします。

  4. エントリポイント関数 use_globals.m をプロジェクトに追加するために、[ソース ファイルの選択] ページでファイルを参照して [開く] をクリックします。[次へ] をクリックします。

  5. [入力の型を定義] ページでテスト ファイルとして use_globals_tb.m を追加します。[入力の型の自動定義] をクリックします。

    テスト ファイルから、u の入力型を double(1x1) とすることを決定します。

  6. [このコードはグローバル変数を使用していますか?] の隣の [はい] を選択します。既定では固定小数点コンバーター アプリは、プロジェクト内の最初のグローバル変数に g という名前を付けます。

  7. コード内のグローバル変数の名前を入力します。グローバル変数 AR の右にあるフィールドで、型を double(4x4) のように指定します。

  8. グローバル変数 B は関数 use_globals の中で代入されていません。この変数をグローバル定数として定義するには、この定数の右にあるフィールドをクリックして [定数値の定義] を選択します。テスト ファイル内で定義されているように B の値を [1 2 3] と入力します。アプリは B に値 [1 2 3] があることを示しています。アプリは AR が初期化されていないことを示しています。

  9. [次へ] をクリックします。エントリポイント MATLAB 関数用にインストルメント化された MEX 関数がアプリによって生成されます。[固定小数点に変換] ページで [シミュレーション] をクリックし、関数のシミュレーションを実行して範囲情報を収集し、推奨されるデータ型を取得します。

  10. [変換] をクリックし、推奨されたデータ型を受け入れて関数を固定小数点に変換します。

    生成された固定小数点コード内で、グローバル変数 ARAR_g になります。

    ラッパー関数には 3 つのグローバル変数 ARAR_g および B が含まれます。AR_g は固定小数点にキャストされた AR と等しく設定され、AR は double にキャストされた AR_g と等しく設定されます。グローバル変数 B は定数のため固定小数点コード内に別の変数はありません。

    function y = use_globals_fixpt(u)
    %#codegen
    % Declare AR and B as global variables
    fm = get_fimath();
    
    global AR_g;
    global B;
    AR_g(1) = fi(u + B(1), 0, 6, 0, fm);
    y = fi(AR_g * fi(2, 0, 2, 0, fm), 0, 7, 0, fm);
    end
    
    
    function fm = get_fimath()
    	fm = fimath('RoundingMethod', 'Floor',...
     'OverflowAction', 'Wrap', 'ProductMode', 'FullPrecision',...
     'MaxProductWordLength', 128, 'SumMode', 'FullPrecision',...
     'MaxSumWordLength', 128);
    end
    

関連するトピック