Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

coder.replace

生成コード内で現在の MATLAB 関数実装をコード置換ライブラリ関数に置換

説明

coder.replace(ifNoReplacement) は、現在の関数実装をコード置換ライブラリ関数に置き換えます。

コード生成中に、MATLAB® 関数で coder.replace を呼び出すと、コード ジェネレーターはコード置換ライブラリのルックアップを実行して関数シグネチャを探します。

[y1_type, y2_type,..., yn_type]=fcn(x1_type, x2_type,...,xn_type)
入力データ型は x1_type, x2_type,...,xn_type で、実装から導出される出力型は y1_type, y2_type,..., yn_type です。登録されているコード置換ライブラリで MATLAB 関数との一致が見つかった場合、MATLAB 関数の内容は破棄され、コード置換ライブラリ関数の呼び出しに置き換えられます。一致が見つからない場合、コードは置換を行わずに生成されます。

coder.replace はコード生成にのみ影響するため、MATLAB コードまたは MEX 関数の生成を変更することはありません。coder.replace は、置換関数の実装と同等の動作を示す MATLAB 関数を置き換えるためのものです。MATLAB 関数本体が空であるか、置換関数の実装と同等でない場合は、生成コードから削除される可能性があります。シミュレーションには置換前の MATLAB 関数が使用されます。置換後のシミュレーションとコード生成の数値結果は自分で検証する必要があります。

すべて折りたたむ

MATLAB 関数をコード置換ライブラリに登録されているカスタム実装に置き換えます。

生成コードでカスタム実装 replacement_calculate_impl.c に置き換える MATLAB 関数 calculate を記述します。

function y = calculate(x)
% Search in the code replacement library for replacement
% and use replacement function if available
% Error if not found
  coder.replace('-errorifnoreplacement');
  y = sqrt(x);
end

calculate を呼び出す MATLAB 関数 top_function を記述します。

function out = top_function(in)
  p = calculate(in);
  out = exp(p);
end

コード置換テーブルの関数エントリを記述する crl_table_calculate.m という名前のファイルを作成します。置換関数 replacement_calculate_impl.c とヘッダー ファイル replacement_calculate_impl.h はパス上になければなりません。

hLib = RTW.TflTable;

%---------- entry: calculate ----------- 
hEnt = RTW.TflCFunctionEntry;
setTflCFunctionEntryParameters(hEnt, ...
  'Key', 'calculate', ...
  'Priority', 100, ...
  'ArrayLayout', 'COLUMN_MAJOR', ...
  'ImplementationName', ...
  'replacement_calculate_impl', ...
  'ImplementationHeaderFile', ...
  'replacement_calculate_impl.h', ...
  'ImplementationSourceFile', ...
  'replacement_calculate_impl.c')
% Conceptual Args

arg = getTflArgFromString(hEnt, 'y1','double');
arg.IOType = 'RTW_IO_OUTPUT';
addConceptualArg(hEnt, arg);

arg = getTflArgFromString(hEnt, 'u1','double');
addConceptualArg(hEnt, arg);

% Implementation Args 

arg = getTflArgFromString(hEnt, 'y1','double');
arg.IOType = 'RTW_IO_OUTPUT';
hEnt.Implementation.setReturn(arg); 

arg = getTflArgFromString(hEnt, 'u1','double');
hEnt.Implementation.addArgument(arg);

addEntry(hLib, hEnt);

rtwTargetInfo ファイルを作成します。

function rtwTargetInfo(tr)
% rtwTargetInfo function to register a code 
% replacement library (CRL) 
% for use with codegen

  % Register the CRL defined in local function locCrlRegFcn
  tr.registerTargetInfo(@locCrlRegFcn);

end % End of RTWTARGETINFO

function thisCrl = locCrlRegFcn

  % Instantiate a CRL registry entry
  thisCrl = RTW.TflRegistry;

  % Define the CRL properties
  thisCrl.Name = 'My calculate Example'; 
  thisCrl.Description = 'Demonstration of function replacement';
  thisCrl.TableList = {'crl_table_calculate'};
  thisCrl.BaseTfl = 'C89/C90 (ANSI)';
  thisCrl.TargetHWDeviceType = {'*'};

end % End of LOCCRLREGFCN

登録情報を更新します。MATLAB コマンド ラインで次のように入力します。

RTW.TargetRegistry.getInstance('reset'); 

xy のデータ型が double であるため、coder.replace はコード置換ライブラリで double = calculate(double) を検索します。一致を見つけると、codegen は次のコードを生成します。

real_T top_function(real_T in)
{
  real_T p;
  p = replacement_calculate_impl(in);
  return exp(p);
}

生成されたコードで、置換関数 replacement_calculate_impl が MATLAB 関数 calculate を置き換えます。

入力引数

すべて折りたたむ

ifNoReplacement 引数では、一致が見つからない場合にコード ジェネレーターがエラーを発行するか警告を発行するかを選択します。この引数を省略すると、コード ジェネレーターはエラーも警告も発行しません。

coder.replace('-errorifnoreplacement') は、現在の関数実装をコード置換ライブラリ関数に置き換えます。一致が見つからない場合、コード生成は停止します。コード置換ライブラリのルックアップに失敗したことを説明するエラー メッセージが生成されます。

coder.replace('-warnifnoreplacement') は、現在の関数実装をコード置換ライブラリ関数に置き換えます。一致が見つからない場合、コードは現在の関数に対して生成されます。コード生成中に、コード置換ライブラリのルックアップに失敗したことを説明する警告が生成されます。

例: coder.replace()

ヒント

  • coder.replace には Embedded Coder® のライセンスが必要です。

  • coder.replace はコード生成関数であるため、MATLAB コードまたは MEX 関数の生成を変更することはありません。

  • coder.replace は、関数内で複数回呼び出すことを目的としていません。

  • coder.replace は、条件式およびループ内で使用することを目的としていません。

  • coder.replace では、コード置換ライブラリのルックアップ中の飽和モードと丸めモードはサポートされません。

  • coder.replace では、varargout はサポートされません。

  • coder.replace では、データ配置を必要とする関数の置換はサポートされません。

  • coder.replace では、可変サイズ入力をもつ MATLAB 関数の置換はサポートされません。

R2012b で導入