coder.ceval
による外部関数呼び出しの置換
関数 coder.ceval
は、MATLAB® コードから生成されたコードから外部 C/C++ 関数を呼び出します。コード置換ソフトウェアでは、coder.ceval
の呼び出しで指定した関数の置換がサポートされます。このコード置換シナリオの用途は、コード置換でさまざまなプラットフォーム用にカスタマイズできる汎用 MATLAB コードを記述することです。コード置換ライブラリでは、関数呼び出しのためにハードウェア固有のコード置換を定義できます。以下を使用して C コードを生成する MATLAB コードで coder.ceval
を使用します。
MATLAB Coder™
Simulink® MATLAB Function ブロックの MATLAB コード
コード置換ライブラリを開発するには、対話的な方法またはプログラムによる方法のいずれかを使用します。詳細については、コード置換ライブラリの開発を参照してください。
サンプル ファイル
対話的なコード置換ライブラリの開発およびプログラムによるコード置換ライブラリの開発の例では、以下が設定されている必要があります。
カスタム C 関数
my_add.c
。/* my_add.c */ #include "my_add.h" double my_add(double in1, double in2) { return in1 + in2; }
カスタム C ヘッダー ファイル
my_add.h
。/* my_add.h */ double my_add(double in1, double in2);
coder.ceval
を使用してmy_add.c
を呼び出す MATLAB 関数call_my_add.m
。function y = call_my_add(in1, in2) %#codegen y=0.0; if ~coder.target('Rtw') % Executing in MATLAB, call MATLAB equivalent of C function my_add y= in1+in2; else % Executing in generated code, call C function my_add y = coder.ceval('my_add', in1, in2); end
call_my_add.m
を呼び出す MATLAB テスト関数call_my_add_test.m
。in1=10; in2=20; y = call_my_add(in1, in2); disp('Output') disp('y =') disp(y);
置換 C 関数
my_add_replacement.c
。/* my_add_replacement.c */ #include "my_add_replacement.h" double my_add_replacement(double in1, double in2) { return in1 + in2; }
置換 C ヘッダー ファイル
my_add_replacement.h
。/* my_add_replacement.h */ double my_add_replacement(double in1, double in2);
対話的なコード置換ライブラリの開発
MATLAB コマンド ラインから次のコマンドを使用して コード置換ツール (crtool) を開きます。
>>crtool
table を作成します。
crtool のメニューから、[ファイル]、[新しいテーブル] を選択します。
右側のペインで、table に
crl_table_coder_cevals_calls
と名前を付けます。[適用] をクリックします。
エントリを作成します。crtool のメニューから、[ファイル]、[新しいエントリ]、[関数] を選択します。
エントリ パラメーターを作成します。[関数] ドロップダウン リストで、
[Custom]
を選択します。関数の情報が crtool に表示されます。この例では、パラメーターをmy_add
として指定します。概念表現を作成します。概念表現は、置換する関数のシグネチャを記述します。crtool の [概念関数] サブセクションで、double の [データ型] およびスカラーの [引数タイプ] をもつ戻り引数
y1
と入力引数u1
およびu2
を指定します。実装表現を作成します。実装表現は最適化関数のシグネチャを記述します。この例では、概念引数と同じ順序およびプロパティをもつ実装引数を指定するために、[概念引数と実装引数のタイプを同じにする] チェック ボックスをオンにします。
[関数プロトタイプ] の下にある置換関数に対して [名前] を指定します。
ビルド情報を指定します。[ビルド情報] タブをクリックして、ビルド要件のペインを開きます。コード ジェネレーターがコード置換に必要なファイル (ソース、ヘッダー、オブジェクト) を指定します。この例では、[実装ヘッダー ファイル] を
my_add_replacement.h
に設定します。table を確認して保存します。[マッピング情報] タブをクリックし、フィールドが以下に示すように入力されていることを確認します。[エントリの検証] をクリックします。crtool のメニューから、[ファイル]、[テーブルの保存]、[保存] を選択します。
コード置換ライブラリを登録します。登録することにより、指定した table で構成されるライブラリが作成されます。[ファイル]、[登録ファイルの作成] を選択します。[登録ファイルの作成] ダイアログ ボックスで、以下のフィールドに入力します。
コード置換ライブラリを使用するには、現在の MATLAB セッションを次のコマンドで更新します。
>>sl_refresh_customizations
コード置換ライブラリを確認します。MATLAB コマンド ラインから、コード置換ビューアーを使用してライブラリを開き、table およびエントリが正しく指定されていることを確認します。詳細については、Verify Code Replacement Libraryを参照してください。コード置換ライブラリを使用するようにモデルを構成し、コードを生成して、その置換が予期したとおりに行われることを確認します。予期しない動作が行われた場合、ヒット ログとミス ログを調べて問題のトラブルシューティングを行います。
プログラムによるコード置換ライブラリの開発
[新規]、[関数] を選択し、[MATLAB] メニューからプログラム インターフェイスを開きます。
table を作成します。
引数をもたず table オブジェクトを返す、コード置換ライブラリ テーブルの名前をもつ関数を作成します。この関数を使用して、コード置換ライブラリ テーブルを呼び出すことができます。
RTW.TflTable
を呼び出して table オブジェクトを作成します。
function hTable = crl_table_coder_cevals_calls() % Create a function to call the code replacement library table %% Create a table object hTable = RTW.TflTable;
エントリを作成します。この例では関数を置き換えるため、エントリ関数
RTW.TflCFunctionEntry
を呼び出して table にコード置換エントリを作成します。function hTable = crl_table_coder_cevals_calls() % Create a code replacement library table %% Create a table object hTable = RTW.TflTable; %% Create an entry hEntry = RTW.TflCFunctionEntry;
エントリ パラメーターを作成します。この例では関数を置き換えるため、関数
setTflCFunctionEntryParameters
を呼び出してエントリ パラメーターを作成します。function hTable = crl_table_coder_cevals_calls() % Create a code replacement library table %% Create a table object hTable = RTW.TflTable; %% Create an entry hEntry = RTW.TflCFunctionEntry; %% Create entry parameters hEntry.setTflCFunctionEntryParameters( ... 'Key', 'my_add', ... 'Priority', 100, ... 'ImplementationName', 'my_add_replacement', ... 'ImplementationHeaderFile', 'my_add_replacement.h', ... 'ImplementationSourceFile', 'my_add_replacement.c');
概念表現を作成します。概念表現は、置換する関数のシグネチャを記述します。引数プロパティを明示的に指定するには、関数
getTflArgFromString
を呼び出します。function hTable = crl_table_coder_cevals_calls() % Create a code replacement library table %% Create a table object hTable = RTW.TflTable; %% Create an entry hEntry = RTW.TflCFunctionEntry; %% Create entry parameters hEntry.setTflCFunctionEntryParameters( ... 'Key', 'my_add', ... 'Priority', 100, ... 'ImplementationName', 'my_add_replacement', ... 'ImplementationHeaderFile', 'my_add_replacement.h', ... 'ImplementationSourceFile', 'my_add_replacement.c'); %% Create the conceptual representation arg = hEntry.getTflArgFromString('y1','double'); arg.IOType = 'RTW_IO_OUTPUT'; hEntry.addConceptualArg(arg); arg = hEntry.getTflArgFromString('u1','double'); hEntry.addConceptualArg(arg); arg = hEntry.getTflArgFromString('u2','double'); hEntry.addConceptualArg(arg);
実装表現を作成します。実装表現は最適化関数のシグネチャを記述します。実装引数が概念引数と同じ順序とプロパティをもつように指定するには、関数
getTflArgFromString
を呼び出します。function hTable = crl_table_coder_cevals_calls() % Create a code replacement library table %% Create a table object hTable = RTW.TflTable; %% Create an entry hEntry = RTW.TflCFunctionEntry; %% Create entry parameters hEntry.setTflCFunctionEntryParameters( ... 'Key', 'my_add', ... 'Priority', 100, ... 'ImplementationName', 'my_add_replacement', ... 'ImplementationHeaderFile', 'my_add_replacement.h', ... 'ImplementationSourceFile', 'my_add_replacement.c'); %% Create the conceptual representation arg = hEntry.getTflArgFromString('y1','double'); arg.IOType = 'RTW_IO_OUTPUT'; hEntry.addConceptualArg(arg); arg = hEntry.getTflArgFromString('u1','double'); hEntry.addConceptualArg(arg); arg = hEntry.getTflArgFromString('u2','double'); hEntry.addConceptualArg(arg); %% Create the implementation representation arg = hEntry.getTflArgFromString('y1','double'); arg.IOType = 'RTW_IO_OUTPUT'; hEntry.Implementation.setReturn(arg); arg = hEntry.getTflArgFromString('u1','double'); hEntry.Implementation.addArgument(arg); arg = hEntry.getTflArgFromString('u2','double'); hEntry.Implementation.addArgument(arg); %% Add the entry to the table hTable.addEntry(hEntry);
ビルド情報を指定します。エントリ パラメーターで、コード ジェネレーターがコード置換に必要なファイル (ソース、ヘッダー、オブジェクト) を指定します。この例では、ビルド情報は必要ありません。
カスタマイズ ファイルを確認して保存します。[MATLAB] メニューから、[ファイル]、[保存] を選択して、このカスタマイズ ファイルを保存します。コマンド ラインから、次のようにしてコード置換ライブラリ テーブルを呼び出し、確認します。
>> hTable = crl_table_coder_cevals_calls
コード置換ライブラリを登録します。登録では、ライブラリ名、コード置換テーブル、その他の情報を定義することにより、コード置換ライブラリが作成されます。以下の仕様を使用して登録ファイルを作成します。
function rtwTargetInfo(cm) cm.registerTargetInfo(@loc_register_crl); end function this = loc_register_crl this(1) = RTW.TflRegistry; this(1).Name = 'CRL for coder.ceval calls to external functions code replacement’; this(1).TableList = {' crl_table_coder_cevals_calls.m'}; % table created in this example this(1).TargetHWDeviceType = {'*'}; this(1).Description = 'Example code replacement library'; end
コード置換ライブラリを使用するには、現在の MATLAB セッションを次のコマンドで更新します。
>>sl_refresh_customizations
コード置換ライブラリを確認します。MATLAB コマンド ラインから、コード置換ビューアーを使用してライブラリを開き、table およびエントリが正しく指定されていることを確認します。詳細については、Verify Code Replacement Libraryを参照してください。コード置換ライブラリを使用するようにモデルを構成し、コードを生成して、その置換が予期したとおりに行われることを確認します。予期しない動作が行われた場合、ヒット ログとミス ログを調べて問題のトラブルシューティングを行います。