コード置換ライブラリの開発と使用による生成コードの最適化 - Simulink
コード置換ライブラリを開発および使用して、生成コード内の関数および演算子を置換します。コード置換とは、アプリケーション コードの要件を満たすためにコード ジェネレーターが生成するコードの関数と演算子を変更する手法です。たとえば、生成コードを置き換えて次のような要件を満たすことができます。
特定のターゲット ハードウェアを含むがこれに限定されない、特定のランタイム環境向けの最適化
既存のアプリケーション コードとの統合
AUTOSAR などの規格への準拠
非有限数またはインラインのサポートを有効または無効にするなどのコードの動作の変更
BLAS の使用または
math.h、システム ヘッダー ファイル、memcpyやmemsetの呼び出しの排除などの、アプリケーションまたはプロジェクト固有のコード要件
MathWorks® が提供するコード置換ライブラリをコード ジェネレーターが使用するようにモデルを構成できます。Embedded Coder® ライセンスがある場合は、コード置換ツールまたはプログラムによって、対話的に独自のコード置換ライブラリを開発できます。
この例では、コード置換マッピングをプログラムによって定義するさまざまな方法について説明するモデルを使用します。各モデルには次を行うためのボタンが含まれています。
コード置換ビューアーでコード置換ライブラリ テーブル定義を表示する
エディターでライブラリ テーブル定義ファイルを開く
エディターでライブラリ登録ファイルを開く
モデル コンフィギュレーションを表示する
コードを生成する
詳細については、Define Code Replacement Library OptimizationsおよびRegister Code Replacement Libraryを参照してください。
コード置換ライブラリの開発手順
関数または演算のマッピング、ビルド情報、登録情報に関するコード置換要件を特定します。
コード置換ライブラリの開発の準備をします (たとえばライブラリをテストするモデルの特定または開発)。
コード置換マッピングを定義します。
コード置換のビルド情報を指定します。
コード置換マッピングを登録します。
コード置換を検証します。
ライブラリを展開します。
詳細については、コード置換ライブラリ開発のクイック スタート - Simulinkを参照してください。
数学関数の置換
この例では、数学関数のコード置換マッピングの定義と登録を行います。さまざまな関数についてコード置換マッピングを定義できます (Code You Can Replace From Simulink Modelsを参照)。
モデル CRLMath を開き、モデル ウィンドウの下部にあるボタンを使用して、コード置換ライブラリ マッピングの定義と登録を行うファイルを参照します。
詳細については、Math Function Code Replacementを参照してください。
open_system("CRLMath");

加算および減算演算子の置換
この例では、加算 (+) および減算 (-) の演算用のコード置換マッピングを定義および登録する方法について説明します。加算および減算の演算用のエントリを定義するときに、ライブラリ関数が次のどちらのアルゴリズム (EntryInfoAlgorithm) を実装するかを指定できます。
演算前にキャスト (CBO) (
RTW_CAST_BEFORE_OP)、既定値演算後にキャスト (CAO) (
RTW_CAST_AFTER_OP)
1. モデル CRLAdditionSubtraction を開きます。このモデルは、組み込み整数データ型が次の組み合わせであり、オペランドが 2 つのスカラー加算 (+) および減算 (-) の演算に関して、コード置換マッピングの定義および登録を行う方法を示しています。
int8,uint8int16,uint16int32,uint32
既定のアルゴリズムである CBO を前提にしています。
open_system("CRLAdditionSubtraction");

2. モデル ウィンドウの下部にあるボタンを使用して、コード置換ライブラリ マッピングの定義と登録を行うファイルを参照します。
3. モデル CRLCastOperations を開いて CBO アルゴリズムと CAO アルゴリズムの違いを確認します。モデルには 2 つの SUM ブロックがあり、それぞれが対応するコード置換エントリと一致するアルゴリズム設定の 1 つを表しています。
Cast_before_operation_Subブロックでは、コード ジェネレーターは入力データ型 (int16) よりも小さいアキュムレータ データ型 (int8) で減算演算を計算します。コード ジェネレーターは結果を計算する前に入力を出力データ型に変換するため、これは CBO と等価です。Cast_after_operation_Subブロックでは、コード ジェネレーターは入力データ型 (int16) よりも大きいアキュムレータ データ型 (int32) で減算演算を計算します。コード ジェネレーターは範囲または精度を失わずに結果を計算してから出力データ型に変換することで同じ結果を得るため、これは CAO と等価です。
open_system("CRLCastOperations");

4. モデル ウィンドウの下部にあるボタンを使用して、コード置換ライブラリ マッピングの定義と登録を行うファイルを参照します。
加算および減算演算子の置換の詳細については、Replace Addition and Subtraction Operator Codeを参照してください。加算と減算のアルゴリズム (EntryInfoAlgorithm) のオプションの詳細については、setTflCOperationEntryParametersを参照してください。
組み込み整数の乗算および除算演算子の置換
この例では、スカラー乗算 (*) および除算 (/) 演算のコード置換マッピングの定義と登録を行います。これらの演算はオペランドが 2 つで、組み込み整数データ型が次の組み合わせです。
int8,uint8int16,uint16int32,uint32
モデル CRLMultiplicationDivision を開き、モデル ウィンドウの下部にあるボタンを使用して、コード置換ライブラリ マッピングの定義と登録を行うファイルを参照します。
open_system("CRLMultiplicationDivision");

スカラー演算子の置換
この例では、スカラー演算 (加算、減算、乗算、複素共役、キャスト、算術右シフト、算術左シフト) のコード置換マッピングの定義と登録を行います。
サポートされているデータ型は、以下のとおりです。
single、double
int8、uint8
int16、uint16
int32、uint32
csingle、cdouble
cint8、cuint8
cint16、cuint16
cint32、cuint32
固定小数点整数
混合データ型 (入力ごとに異なるデータ型)
モデル CRLScalarOperators を開き、モデル ウィンドウの下部にあるボタンを使用して、コード置換ライブラリ マッピングの定義と登録を行うファイルを参照します。
スカラー演算子の置換の詳細については、スカラー演算子のコード置換を参照してください。
加算および減算演算の既定のアルゴリズムである CBO を前提にしています。
open_system("CRLScalarOperators");

行列演算子の置換
この例では、行列演算 (加算、減算、乗算、転置、共役、エルミート) のコード置換マッピングの定義と登録を行います。
サポートされているデータ型は、以下のとおりです。
single,doubleint8,uint8int16,uint16int32,uint32csingle,cdoublecint8,cuint8cint16,cuint16cint32,cuint32固定小数点整数
混合データ型 (入力ごとに異なるデータ型)
これらの置換の一部を説明するモデル CRLMatrixOperators を開きます。モデル ウィンドウの下部にあるボタンを使用して、コード置換ライブラリ マッピングの定義と登録を行うファイルを参照します。
行列演算子の置換の詳細については、Small Matrix Operation to Processor Code Replacementを参照してください。
加算および減算演算の既定のアルゴリズムである CBO を前提にしています。
open_system("CRLMatrixOperators");

行列乗算の BLAS 用の置換
この例では、Basic Linear Algebra Subroutines (BLAS) サブルーチンである xGEMM および xGEMV 用のコード置換マッピングの定義と登録を行います。次の演算を BLAS サブルーチンにマッピングできます。
行列の乗算
1 つまたは両方の入力の転置を伴う行列の乗算
1 つまたは両方の入力のエルミート演算を伴う行列の乗算
モデル CRLBLASOperations を開き、モデル ウィンドウの下部にあるボタンを使用して、コード置換ライブラリ マッピングの定義と登録を行うファイルを参照します。
行列乗算の BLAS 用の置換の詳細については、Matrix Multiplication Operation to MathWorks BLAS Code Replacementを参照してください。
open_system("CRLBLASOperations");

基本的な演算子における固定小数点演算子の置換
この例では、スカラー加算 (+)、減算 (-)、乗算 (*)、除算 (/) 演算のコード置換マッピングの定義と登録を行います。これらの演算はオペランドが 2 つの固定小数点データ型です。
次に対応するコード置換を定義できます。
入力と出力における傾きスケーリング/バイアス スケーリングの組み合わせ
入力と出力における 2 進小数点スケーリングの組み合わせ
入力と出力間の相対的なスケーリング
入力と出力全体で同じ傾き値とゼロの正味バイアス
モデル CRLFixedPointOperators を開き、モデル ウィンドウの下部にあるボタンを使用して、コード置換ライブラリ マッピングの定義と登録を行うファイルを参照します。
既定ではコード ジェネレーターは、加算および減算演算のコード置換について、置換コードが演算前のキャスト (CBO) アルゴリズムを実装していることを想定します。
モデルで固定小数点データ型を使用するには、Fixed-Point Designer™ のライセンスが必要です。
固定小数点演算子のコード置換の詳細については、固定小数点演算子のコード置換を参照してください。
open_system("CRLFixedPointOperators");

関数の照合と置換プロセスのカスタマイズ
この例では、カスタム エントリのコード置換マッピングの定義と登録を行います。RTW.TflCFunctionEntryML または RTW.TflCOperationEntryML からサブクラス化することによって独自のエントリを作成できます。エントリ クラスは、照合ロジックのカスタマイズまたは一致したエントリの変更を行う do_match メソッドを実装しなければなりません。do_match メソッドは、あらかじめ設定された固定のシグネチャをもたなければなりません。
モデル CRLCustomEntry を開きます。このモデルでは、追加の実装関数の引数として定数を挿入することによって、一致したエントリを変更する方法を説明します。DTC1、Trigonometric Function および Product は、次のカスタム エントリ コード置換を表します。
型から小数部の長さを抽出し、それを実装関数に渡す方法を説明するキャスト演算 -
Out1 = custom_cast(In1, 2, 4)。定数値を実装関数に渡す方法を説明する正弦 -
Out2=custom_sin(In2, 1)。演算の正味傾きを計算して実装関数に渡す方法を説明する乗算演算 -
Out3=custom_multiply_shift_right(In3,In4,3)。
モデル ウィンドウの下部にあるボタンを使用して、コード置換マッピングの定義と登録を行うファイルを参照します。
カスタム エントリの詳細については、Customize Match and Replacement Processを参照してください。
open_system("CRLCustomEntry");

MATLAB 関数の置換
この例では、MATLAB Function ブロックで指定された MATLAB® 関数のコード置換マッピングの定義と登録を行います。内部で coder.replace を指定することで関数の置換を選択できます。この機能は、次の MATLAB 関数の置換をサポートしています。
単一または複数入力
単一または複数出力
スカラーおよび行列の入力と出力
モデル CRLMLFunctionReplacement を開きます。このモデルでは、これらの要件の一部について説明します。サポートされているデータ型は、以下のとおりです。
single,doubleint8,uint8int16,uint16int32,uint32csingle,cdoublecint8,cuint8cint16,cuint16cint32,cuint32固定小数点整数
混合データ型 (入力ごとに異なるデータ型)
モデル ウィンドウの下部にあるボタンを使用して、コード置換マッピングの定義と登録を行うファイルを参照します。
MATLAB 関数の置換の詳細については、coder.replaceを参照してください。
open_system("CRLMLFunctionReplacement");

関数実装のデータ配置
この例では、置換関数に渡される行列オペランドのアライメントを指定する方法について説明します。一部のターゲット固有の関数実装では、アプリケーション パフォーマンスを最適化するためにデータを配置する必要があります。関数実装のためにデータ配置を構成するには
テーブル エントリのデータ配置要件を指定します。実装関数引数の配置は個別にまたはまとめて指定することができます。
データ配置機能と構文をコンパイラに指定します。
rtwTargetInfo.mファイル内で指定されている登録エントリのTargetCharacteristicsオブジェクトに、AlignmentSpecificationオブジェクトを付加します。
モデル CRLDataAlignment を開きます。モデルには、次の 3 つのデータ配置コード置換シナリオが示されています。
Add- エクスポートされた信号とインポートされた信号の配置。[信号プロパティ] ダイアログ ボックスで配置の正確な値を指定するか、配置の値を -1 に設定されたままにしてコード ジェネレーターが使用状況に基づいて最適な配置を決定するようにできます。Product- バーチャルなバス型と非バーチャルなバス型の配置。Simulink.Bus オブジェクトの Alignment プロパティに配置の正確な値を指定するか、Alignment プロパティを -1 に設定していても、コード ジェネレーターが使用状況に基づいて最適な配置を決定できるようにできます。EML_MMUL- ローカル変数、グローバル変数およびブロック パラメーターの配置。
モデル ウィンドウの下部にあるボタンを使用して、コード置換マッピングの定義と登録を行うファイルを参照します。このモデルは GCC、Clang、MSVC または MinGW コンパイラを使用するように構成されているので注意してください。
コード置換のデータ配置を指定する方法の詳細については、Data Alignment for Code Replacementを参照してください。
open_system("CRLDataAlignment");

コード置換ライブラリの参照と検証
この例では、コード置換ビューアーについて説明します。コード置換ビューアーは次の目的に使用できます。
どのコード置換ライブラリが使用されるかを確認する
ライブラリ内のテーブルのリストと各テーブルのエントリを確認する
テーブル エントリの指定をレビューする
コード置換の失敗をトラブルシューティングする
次のコマンドは、コード置換ビューアーをコード置換テーブル crl_table_muldiv に対して開きます。
crl = crl_table_muldiv; crviewer(crl);
コード置換ビューアーの詳細については、Verify Code Replacement Libraryを参照してください。
ビルド情報
コード置換テーブルの各エントリでは、置換関数用に次のようなビルド情報を指定できます。
ヘッダー ファイルの依存関係
ソース ファイルの依存関係
追加のインクルード パス
追加のソース パス
追加のリンク フラグ
また、置換コードを生成するために必要なヘッダー、ソースまたはオブジェクト ファイルをコード生成前にビルド フォルダーにコピーするために、RTW.copyFileToBuildDir を指定できます。RTW.copyFileToBuildDir は次の値として設定することで指定できます。
setTflCFunctionEntryParameters、setTflCOperationEntryParametersまたはsetTflCSemaphoreEntryParameters呼び出しのGenCallbackプロパティ。registerCFunctionEntry、registerCOperationEntryまたはregisterCSemaphoreEntry呼び出しの引数genCallback。
メモ: 置換関数の実装は提供されないため、この例のモデルではコード生成のみが構成されています。
ビルド情報の指定の詳細については、Define Code Replacement Library Optimizationsのビルド情報の指定を参照してください。
予約済みの識別子
コード置換テーブル エントリによって定義されている各関数実装の名前は、一意の識別子として予約されます。その他の識別子は、ヘッダー ファイルごとにテーブルで指定できます。追加の予約識別子を指定すると、重複するシンボルやその他の識別子関連のコンパイルとリンクの問題の発生を防ぐことができます。
予約済み識別子の指定の詳細については、予約済み識別子とコード置換を参照してください。
コート置換ライブラリの例の削除
モデル例の利用が終了したら、次のコマンドを使用してコード置換ライブラリの例を削除し、モデル例を終了することができます。
sl_refresh_customizations; close_system("CRLMath",0) close_system("CRLAdditionSubtraction",0) close_system("CRLCastOperations",0) close_system("CRLMultiplicationDivision",0) close_system("CRLScalarOperators",0) close_system("CRLMatrixOperators",0) close_system("CRLBLASOperations",0) close_system("CRLFixedPointOperators",0) close_system("CRLCustomEntry",0) close_system("CRLMLFunctionReplacement",0) close_system("CRLDataAlignment",0) drawnow; if exist("h","var") && ishghandle(h) close(h); end clear h; clear isDaDemoSupported; clear crl;