Main Content

コード置換とは

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

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

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

  • AUTOSAR などの規格への準拠

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

  • 以下のようなアプリケーションまたはプロジェクト固有のコード要件

    • math.h の消去

    • システム ヘッダー ファイルの消去

    • memcpy または memset の呼び出しの消去

    • BLAS の使用

    • 特定の BLAS の使用

この手法を適用するには、コード ジェネレーターを構成してコード生成中にコード置換ライブラリ (CRL) を適用します。既定では、コード ジェネレーターはコード置換ライブラリを適用しません。MathWorks® が提供するライブラリ、および Embedded Coder® 製品を使用して作成および登録するライブラリから選択できます。使用可能なライブラリのリストは以下に応じて変わります。

  • インストールされているサポート パッケージ。

  • システム ターゲット ファイル、言語、言語標準、デバイス ベンダー構成。

  • Embedded Coder 製品を使用してライブラリを作成および登録したかどうか。

GNU99 拡張を含むライブラリは、GCC コンパイラと共に使用するためのものです。これらのライブラリのいずれかを別のコンパイラと共に使用すると、生成コードがコンパイルされない場合があります。

コード置換ライブラリ

"コード置換ライブラリ" は、関数と演算子のアプリケーション固有の実装を指定する、1 つ以上のコード置換テーブルから構成されています。たとえば、特定の組み込みプロセッサ用のライブラリは、生成コードをそのプロセッサ用に最適化する関数と演算子の置換を指定します。

"コード置換テーブル" には 1 つ以上の"コード置換エントリ" があり、各エントリは関数または演算子の可能な置換を表します。各エントリによって、関数または演算子の "概念表現""実装表現" と優先順位にマップされます。

テーブル エントリ コンポーネント説明
概念表現

テーブル エントリを識別します。コード ジェネレーター用の一致条件を含みます。以下から構成されます。

  • 関数の名前またはキー。関数名によりほとんどの関数が特定されます。演算子と一部の関数については、キーと呼ばれる一連の文字が関数または演算子を特定します。たとえば、関数名 'cos' や演算子キー 'RTW_OP_ADD' です。

  • コード ジェネレーターによる命名 ('y1', 'u1', 'u2', ...) と対応する I/O の種類 (出力または入力) およびデータ型を観察する概念引数

  • アルゴリズム、固定小数の飽和、丸めモードなどの関数または演算子の一致条件を特定するその他の属性

実装表現

置換コードを指定します。以下から構成されます。

  • 関数名。たとえば、'cos_dbl''u8_add_u8_u8' などです。

  • 対応する I/O の種類 (出力または入力) とデータ型を含む実装引数

  • ヘッダー名、ソース ファイル名およびビルド リソースのパスなどの追加の実装の詳細を示すパラメーター

優先順位

テーブル内のその他のエントリに対するエントリ優先順位を定義します。値は 0 から 100 の範囲で、最も優先順位が高いのは 0 です。複数のエントリの優先順位が同じ場合、コード ジェネレーターはその優先順位の最初に一致するものを使用します。

コード ジェネレーターがコード置換ライブラリ内で一致するものを検索するときに、関数または演算子の概念表現を使用して "呼び出しサイト オブジェクト" が作成され、値が入力されます。一致が存在する場合、コード ジェネレーターは、実装表現により値が入力された、一致したコード置換エントリを使用して、コードを生成します。

コード ジェネレーターは、ライブラリ内のテーブルの順序で一致するものがあるかどうか、コード置換ライブラリ内のテーブルを検索します。コード ジェネレーターによりテーブルで複数の一致が検出された場合、一致は優先順位によって決まります。コード ジェネレーターは、優先順位が低い同様のエントリよりも、優先順位が高いエントリを使用します。

コード置換の用語

用語定義
キャッシュ ヒットコード ジェネレーターが一致を検出した、指定されたコード置換ライブラリで定義されている関数または演算子のコード置換エントリ。
キャッシュ ミスコード ジェネレーターが一致を検出しない関数または演算子の概念表現。
呼び出しサイト オブジェクト コード ジェネレーターが関数または演算子の呼び出しサイトを検出した場合に使用する関数または演算子の概念表現。コード ジェネレーターはこのオブジェクトを使用して、概念表現が一致するかコード置換ライブラリをクエリします。一致が存在する場合、コード ジェネレーターは、概念表現、実装表現および優先順位の値が入力されたコード置換オブジェクトを返し、このオブジェクトを使用して置換コードを生成します。
コード置換ライブラリ関数と演算子のアプリケーション固有の実装を指定する、1 つ以上のコード置換テーブル。コード置換ライブラリを使用するように構成されている場合、コード ジェネレーターは、ライブラリで定義されている条件を使用して、一致を検索します。一致するものが見つかった場合、コード ジェネレーターは既定で生成されたコードを、ライブラリで定義されたアプリケーション固有のコードで置き換えます。
コード置換テーブル1 つ以上のコード置換テーブルのエントリ。異なるライブラリで使用する関連エントリまたは共有エントリをグループ化する方法を提供します。
コード置換エントリ関数または演算子の可能な置換を表します。関数または演算子の概念表現を実装表現および優先順位にマップします。
概念引数置換する関数または演算子の入力引数または出力引数を表します。概念引数は、コード ジェネレーターにとって既知の命名規則 ('y1', 'u1', 'u2', ...) とデータ型を観察します。
概念表現

コード ジェネレーターが置換する関数と演算子の適合性評価に使用する一致条件を表します。以下から構成されます。

  • 関数または演算子の名前またはキー

  • 入力と出力の型、次元および実数/複素数が指定された概念引数

  • アルゴリズム、固定小数点の飽和、丸めモードなどの属性

実装引数C または C++ 置換関数の入力引数または出力引数を表します。実装引数は、C/C++ の名前とデータ型の指定を観察します。
実装表現

C または C++ 置換関数のプロトタイプを指定します。以下から構成されます。

  • 関数名 (たとえば、'cos_dbl' または 'u8_add_u8_u8')

  • 関数の入力および出力の型、型修飾子および実数/複素数を指定する実装引数

  • ヘッダー名、ソース ファイル名およびビルド リソースのパスなどのビルド情報およびコンパイルとリンク フラグを示すパラメーター

キー置換される関数または演算子を指定します。関数名またはキーがコード置換エントリの概念表現で使用されます。キー RTW_OP_ADD は加算演算子を示します。
優先順位コード置換ライブラリ内で名前と概念引数リストが同じである、その他のエントリに対するコード置換エントリの一致優先順位を定義します。優先順位の値は 0 から 100 の範囲で、最も優先順位が高いのは 0 です。既定の設定は 100 です。ライブラリで関数または演算子に 2 つの実装が提供されている場合、優先順位が高い方の実装が低い方よりも優先されます。

コード置換の制限

コード置換検証 — コード置換は想定と異なる動作をする可能性があります。たとえば、コード ジェネレーター入力にみられるデータ型は、コード ジェネレーターが動作中に中間データ型として使用するものと一致しない場合があります。生成コードを調べることでコード置換を検証します。

行列のコード置換 — コード置換ライブラリは、動的およびシンボリック サイズの行列をサポートしません。

関連するトピック