Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

コード置換ライブラリの開発と使用による生成コードの最適化 - MATLAB®

コード置換ライブラリを開発および使用して、生成コード内の関数および演算子を置換します。コード置換とは、アプリケーション コードの要件を満たすためにコード ジェネレーターが生成するコードの関数と演算子を変更する手法です。たとえば、生成コードを置き換えて次のような要件を満たすことができます。

  • 特定のターゲット ハードウェアを含むがこれに限定されない、特定のランタイム環境向けの最適化

  • 既存のアプリケーション コードとの統合

  • AUTOSAR などの規格への準拠

  • 非有限数またはインラインのサポートを有効または無効にするなどのコードの動作の変更

  • BLAS の使用または math.h、システム ヘッダー ファイル、memcpymemset の呼び出しの排除などの、アプリケーションまたはプロジェクト固有のコード要件

MathWorks® が提供するコード置換ライブラリを使用するようにコード ジェネレーターを構成できます。Embedded Coder® ライセンスがある場合は、コード置換ツールまたはプログラムによって、対話的に独自のコード置換ライブラリを開発できます。

この例には、コード置換マッピングを定義するさまざまな方法について説明する MATLAB® コードが含まれています。それぞれの MATLAB® 関数の例に加えて、関数および演算子のコード置換をプログラムによって開発する方法について説明する MATLAB® ファイルが含まれています。

追加要件:

  • MATLAB Coder

  • Embedded Coder

  • Fixed-Point Designer

詳細については、What Is Code Replacement Customization?およびDevelop a Code Replacement Libraryを参照してください。

新規フォルダーの作成と関連ファイルのコピー

以下のコードは、現在の作業フォルダー (pwd) 内にサブフォルダーを作成します。この新しいフォルダーには、この例に関連するファイルが含まれています。

currentDir = pwd;
[~,cgDir] = rtwdemodir();
coderdemo_setup('coderdemo_crl');

コード置換ライブラリの開発手順

  1. 関数または演算のマッピング、ビルド情報、登録情報に関するコード置換要件を特定します。

  2. コード置換ライブラリの開発の準備をします (たとえばライブラリをテストするモデルの特定または開発)。

  3. コード置換マッピングを定義します。

  4. コード置換のビルド情報を指定します。

  5. コード置換マッピングを登録します。

  6. コード置換を検証します。

  7. ライブラリを配布します。

詳細については、Develop a Code Replacement Libraryを参照してください。

数学関数の置換

この例では、数学関数のコード置換マッピングの定義と登録を行います。さまざまな関数についてコード置換マッピングを定義できます。詳細については、Code You Can Replace from MATLAB Codeを参照してください。

1. この例の MATLAB® ファイルを開いて参照します。

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','replace_math_fcns.m'))

2. コード置換ライブラリ Function Replacement Examples を使用するようにコード ジェネレーターを構成します。

RTW.TargetRegistry.getInstance('reset');
cfg = coder.config('lib','ecoder',true);
cfg.CodeReplacementLibrary = 'Function Replacement Examples';
cfg.GenerateReport = false;
cfg.LaunchReport = false;

3. ビルドする構成パラメーターを設定し、関数の入力データ型を定義します。

t = single(2); 

4. コード置換テーブル定義ファイルを参照します。

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','crl_table_functions.m'))

5. コード置換ライブラリを指定する構成パラメーターと、codegen コマンドへの入力パラメーターとして手順 3 で定義した入力クラスの例を使用して、MATLAB® プログラムを C ソース ファイルにコンパイルします。

codegen('replace_math_fcns', '-config', cfg, '-args', {t, t});

6. ファイル replace_math_fcns.c を開いて生成されたソース コードを参照します。

open(fullfile('codegen','lib','replace_math_fcns','replace_math_fcns.c'))

7. replace_math_fcns.m を閉じます。

数学関数の置換の詳細については、Math Function Code Replacementを参照してください。

加算および減算演算子の置換

この例では、加算 (+) および減算 (-) の演算用のコード置換マッピングを定義および登録する方法について説明します。加算および減算の演算用のエントリを定義するときに、ライブラリ関数が次のどちらのアルゴリズム (EntryInfoAlgorithm) を実装するかを指定できます。

  • 演算前にキャスト (CBO) (RTW_CAST_BEFORE_OP)、既定値

  • 演算後にキャスト (CAO) (RTW_CAST_AFTER_OP)

1. この例の MATLAB® ファイルを開いて参照します。

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','addsub_two_int16.m'))
%
% CBO, the default algorithm, is assumed.

2. コード置換ライブラリ Addition & Subtraction Examples を使用するようにコード ジェネレーターを構成します。

RTW.TargetRegistry.getInstance('reset');
cfg = coder.config('lib','ecoder',true);
cfg.CodeReplacementLibrary = 'Addition & Subtraction Examples';
cfg.GenerateReport = false;
cfg.LaunchReport = false;

3. ビルドする構成パラメーターを設定し、演算入力データ型を定義します。

t = int16(2); 

4. コード置換テーブル定義ファイルを参照します。

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','crl_table_addsub.m'))

5. 目的のコード置換ライブラリを指定する構成パラメーターと、codegen コマンドへの入力パラメーターとして手順 3 で定義した入力クラスの例を使用して MATLAB® プログラムを C ソース ファイルにコンパイルします。

codegen('addsub_two_int16','-config', cfg, '-args', {t, t});

6. ファイル addsub_two_int16.c を開いて生成されたソース コードを参照します。

open(fullfile('codegen','lib','addsub_two_int16','addsub_two_int16.c'))

7. addsub_two_int16.m を閉じます。

加算および減算演算子の置換の詳細については、Scalar Operator Code ReplacementおよびAddition and Subtraction Operator Code Replacementを参照してください。

行列演算子の置換

この例では、行列演算 (加算、減算、乗算、転置、共役、エルミート) のコード置換マッピングの定義と登録を行います。

サポートされているデータ型は、以下のとおりです。

  • singledouble

  • int8uint8

  • int16uint16

  • int32uint32

  • csinglecdouble

  • cint8cuint8

  • cint16cuint16

  • cint32cuint32

  • 固定小数点整数

  • 混合データ型 (入力ごとに異なるデータ型)

1. この例の MATLAB® ファイルを開いて参照します。

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','replace_matrix_ops.m'))

2. コード置換ライブラリ Matrix Op Replacement Examples を使用するようにコード ジェネレーターを構成します。

RTW.TargetRegistry.getInstance('reset');
cfg = coder.config('lib','ecoder',true);
cfg.CodeReplacementLibrary = 'Matrix Op Replacement Examples';
cfg.GenerateReport = false;
cfg.LaunchReport = false;

3. ビルドする構成パラメーターを設定し、演算入力データ型を定義します。

t = [1.0 2.0; 3.0, 4.0]; 

4. コード置換テーブル定義ファイルを参照します。

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','crl_table_matops.m'))

5. 目的のコード置換ライブラリを指定する構成パラメーターと、codegen コマンドへの入力パラメーターとして手順 3 で定義した入力クラスの例を使用して MATLAB® プログラムをコンパイルします。

codegen('replace_matrix_ops', '-config', cfg, '-args', {t, t});

6. ファイル replace_matrix_ops.c を開いて生成されたソース コードを参照します。

open(fullfile('codegen','lib','replace_matrix_ops','replace_matrix_ops.c'))

7. replace_matrix_ops.m を閉じます。

行列演算子の置換の詳細については、Small Matrix Operation to Processor Code Replacementを参照してください。

行列乗算の BLAS 用の置換

この例では、Basic Linear Algebra Subroutines (BLAS) サブルーチンである xGEMM および xGEMV 用のコード置換マッピングの定義と登録を行います。次の演算を BLAS サブルーチンにマッピングできます。

  • 行列の乗算

  • 1 つまたは両方の入力の転置を伴う行列の乗算

  • 1 つまたは両方の入力のエルミート演算を伴う行列の乗算

1. この例の MATLAB® ファイルを開いて参照します。

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','replace_matrix_ops_blas.m'))

2. コード置換ライブラリ BLAS Replacement Examples を使用するようにコード ジェネレーターを構成します。

RTW.TargetRegistry.getInstance('reset');
cfg = coder.config('lib','ecoder',true);
cfg.CodeReplacementLibrary = 'BLAS Replacement Examples';
cfg.GenerateReport = false;
cfg.LaunchReport = false;

3. ビルドする構成パラメーターを設定し、関数の入力データ型を定義します。

t = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]; 

4. コード置換テーブル定義ファイルを参照します。

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','crl_table_blas.m'))

5. 目的のコード置換ライブラリを指定する構成パラメーターと、codegen コマンドへの入力パラメーターとして手順 3 で定義した入力クラスの例を使用して MATLAB® プログラムをコンパイルします。

codegen('replace_matrix_ops_blas', '-config', cfg, '-args', {t, t});

6. ファイル replace_matrix_ops_blas.c を開いて生成されたソース コードを参照します。

open(fullfile('codegen','lib','replace_matrix_ops_blas','replace_matrix_ops_blas.c'))

7. replace_matrix_ops_blas.m を閉じます。

行列乗算の BLAS 用の置換の詳細については、Matrix Multiplication Operation to MathWorks BLAS Code Replacementを参照してください。

coder.replace を使用した MATLAB 関数の置換

コード置換ライブラリは、組み込みデータ型、複素数データ型、固定小数点データ型のスカラーおよび行列の入出力を備えた MATLAB® 関数の置換をサポートします。

1. この例の MATLAB® ファイルを開いて参照します。

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','coder_replace_fcn.m'))

2. コード置換ライブラリ Coder Replace Examples を使用するようにコード ジェネレーターを構成します。

RTW.TargetRegistry.getInstance('reset');
cfg = coder.config('lib','ecoder',true);
cfg.CodeReplacementLibrary = 'Coder Replace Examples';
cfg.GenerateReport = false;
cfg.LaunchReport = false;

3. ビルドする構成パラメーターを設定し、関数の入力データ型を定義します。

t = [1 2; 3 4];

4. コード置換テーブル定義ファイルを参照します。

edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','crl_table_coder_replace.m'))

5. 目的のコード置換ライブラリを指定する構成パラメーターと、codegen コマンドへの入力パラメーターとして手順 3 で定義した入力クラスの例を使用して MATLAB® プログラムをコンパイルします。

codegen('coder_replace_fcn', '-config', cfg, '-args', {t, t});

6. ファイル coder_replace_fcn.c を開いて生成されたソース コードを参照します。

open(fullfile('codegen','lib','coder_replace_fcn','coder_replace_fcn.c'))

7. coder_replace_fcn.m を閉じます。

詳細については、docid:ecoder_ug.mw_ab7cd3a5-076f-40e4-b8a9-d3357993c100 を参照してください。

ビルド情報

コード置換テーブルの各エントリでは、置換関数用に次のようなビルド情報を指定できます。

  • ヘッダー ファイルの依存関係

  • ソース ファイルの依存関係

  • 追加のインクルード パス

  • 追加のソース パス

  • 追加のリンク フラグ

また、置換コードを生成するために必要なヘッダー、ソースまたはオブジェクト ファイルをコード生成前にビルド フォルダーにコピーするために、RTW.copyFileToBuildDir を指定できます。RTW.copyFileToBuildDir は次の値として設定することで指定できます。

  • setTflCFunctionEntryParameterssetTflCOperationEntryParameters または setTflCSemaphoreEntryParameters 呼び出しの GenCallback プロパティ。

  • registerCFunctionEntryregisterCOperationEntry または registerCSemaphoreEntry 呼び出しの引数 genCallback

メモ: 置換関数の実装は提供されないため、この例のモデルではコード生成のみが構成されています。

置換コードのビルド情報の指定の詳細については、Develop a Code Replacement Libraryを参照してください。

クリーンアップ

ファイルを削除して元のフォルダーに戻ります。

RTW.TargetRegistry.getInstance('reset');
rtwdemoclean;
clear coderdemo_crl
cd ../