1
MATLAB コードを使用し
た
C コードの生成
クイック
スタート ガイド
(R2012a)
MATLAB Coder を使用することで MATLAB コード から C コードを生成 できます。MATLAB 内での動作に必要なインターフェイスが含まれ るスタンドアロン ANSI-C コードまたは C コードを、コンパイル済み MEX ファイルとして生成できます。本クイック スタート ガイドは、 スタンドアロン ANSI-C コードの生成方法について説明します。規則 に準拠した MATLAB コードの記述方法については、『MATLAB Coder 用 MATLAB コードの準備: クイック スタート ガイド』 [1] を参照して ください。
スタンドアロン
C コードの生成手順
スタンドアロン C コードを生成する場合、最初の手順として必ず MEX ファイルを生成します。そのファイルの動作を MATLAB 上で確 認してから、スタンドアロン C コードを生成します。MEX ファイル にはさまざまなチェックが含まれているため、実行時エラーの検出 と修正をより簡単に行うことができます。詳細については [1] を参照 してください。 MEX ファイルの生成と動作の検証 [1] 最初のスタンドアロン C コードの生成 外部 C プロジェクトにおいて生成された C コードの理解 生成された C コードのカスタマイズ 生成された C コードの実装最初のスタンドアロン
C コードの生成
スタンドアロン C コードを生成するには、MATLAB Coder のペインを [ビルド] に切り替えて [C/C++ スタティック ライブラリ]、[C/C++ ダイ ナミック ライブラリ] または [C/C++ 実行ファイル] のいずれかを選択 します。 スタティック ライブラリ、ダイナミック ライブラリ、実行 ファイルはどう違うのでしょうか? 生成される C コードに関する限り、違いはありません。 スタティック/ ダイナミック ライブラリ MATLAB Coder は C 言語ベースのプロジェクトにお いてリンク可能なスタティック/ダイナミック ライ ブラリをビルドします。 場所: codegen/lib/<最上位レベル名> (dll) 実行ファイル メイン関数を指定する必要があります。その上 で、MATLAB Coder は生成されたコードを呼び出す 実行ファイルをビルドします。 場所: codegen/exe/<最上位レベル名>2
生成された
C コードの理解
コメント 元になった MATLAB コードを C コード内にコメントとして追加して おくと、その C コードの由来をより簡単に理解できることがよくあ ります。 [詳細設定]、[コード外観] を選択。 メモリの割り当て MATLAB Coder では配列は 3 つのタイプに区別されます。 固定サイズの配列 (例: 12 行 3 列) MATLAB Coder ではメモリは常にスタック上に割 り当てられる。スタックに空きがない場合は静 的メモリとして割り当てられる 最大サイズが既知 でありサイズが不 明の配列 (‘max-size arrays’) サイズがまったく不明の配列がコードに含まれ ていない場合は動的メモリ割り当てを使用しな いように選択可能。動的割り当ては、すべての 配列が可変サイズの場合、または次の手順で指 定したサイズより大きい配列のみに使用され る。[詳細設定]、[メモリ] を選択 (下図参照) サイズがまったく 不明の配列 (最大 サイズが不明) サイズがまったく不明の配列のメモリへの割り 当ては、実行時に常に発生 (emxEnsureCapacity の呼び出しによる動的なメモリ割り当て)C コードのカスタマイズ
より効率的な C コードを生成するベストプラクティスを次に示しま す。 すべての配列にサイズの上限があることを確認する (該当する場 合) 必要に応じて配列のサイズ情報を追加します。 例: assert(N < 25); y = zeros(1,N); 別のベスト プラクティスとして後述の「インデックスの最適化」も 参照してください。 生成されたコードが参照により引数を渡すことを確認する C では引数は常に参照により渡されます。場合によっては、MATLAB Coder は変数をサブ関数に渡す前にそのコピーをローカルに作成し ておく必要が生じます。 ヒント: インプレース構文 “a = foo(a)” を呼び出し側と関数宣 言の両方で使用すれば、ローカルでコピーを作成する必要は なくなります。3 x = foo(x,b) … function a = foo(a,b) …. y = foo(x,b) … function a = foo(a,b) …. 入出力名が呼び出し側と関数宣 言の両方で同一。 MATLAB Coder は ‘x’ のローカル コピーを作成する必要がなく、 これを参照により正しく渡す 呼び出し側で入出力変数に 2 つ の異なる名前を使用。したがっ て、‘foo’ への呼出し後に変数 ‘x’ および ‘y’ の両方が存在する。 MATLAB Coder はメモリをコピー しなければならない 論理配列のインデックスを控えめに使用する 論理配列インデックスとは、配列のサブ要素の操作を論理インデッ クスに基づいて実行する機能です。たとえば、次によって 255 より 大きいすべての要素を切り取ることができます。 x(x>255) = 255; 通常は次のように書き換えることで、より優れたコードになります。 for ii=1:numel(x), if (x(ii)>255), x(ii) = 255; end, end
インデックスの最適化
MATLAB Coder では固定長 10 をもつ (i:i+9) は認識されない可能性が あります。これを “i + (0:9)” と書き換えることで MATLAB Coder に必 要な情報を与えることができます。 スカラー入力の強化 MATLAB Coder では ‘x’ がスカラーであることを認識できない場合が あります。たとえば、‘a’ は常に少なくとも 1 つの正の要素をもつと 認識されます。つまり、x = find(a>0, 1,'first') はスカラーですが、 MATLAB Coder はこれが空にならないことを認識できないため、‘:1’ として入力します。 スカラー入力を強化するには、この行を次のように変更しま す。 x = find(a>0, 1,'first'); x = x(1);
外部
C プロジェクトへのコードの実装
使用するファイル すべての .c および .h ファイルを対象ディレクトリから取得します (スタティック ライブラリの例: codegen/lib/<最上位レベル名>)。 た いていの場合、すべてのファイルで処理が必要ということになりま す。 メモリのレイアウト MATLAB の行列順序では列が優先されます。2 次元行列の連続要素が 1 つの列の要素にそれぞれ対応します。一方、C 言語は行優先です。 MATLAB Coder が生成する C コードは MATLAB の動作を模倣します。 そのため、入力 (出力の場合も) 引数に複数次元 (2 次元以上) の行列 がある場合、外部 C のテストベンチに一致するよう入力 (または出 力) の転置が必要になる場合があります。 引数の型 入力引数および返り値は、以下の C 関数に対応します。 固定サイズ配列 配列 へのポインター: x[10] 最大サイズ配列 (動的割り当ては しない) 実際の実行時の配列サイズをもつ配列へのポイ ンター: x_data[10] および x_sizes[2] 動的に割り当てら “emxArrays”。生成された .h ファイルで定義され4 れた配列 る特別な型。 MATLAB Coder はこれらの配列の作成、破棄を行 う補助関数を提供しています。詳細について は、"原子" デモを次の手順にしたがって、ドキ ュメンテーションから参照してください。 [MATLAB Coder]、[デモ]、[MATLAB コードからの C コードの生成] で [原子のシミュレーションへ の動的なメモリ割り当ての使用] を選択
よくある質問と答え
Embedded Coder が必要でしょうか? Embedded Coder を使用して、スタンドアロンのターゲット用に生成 された C コードをカスタマイズできます。Embedded Coder の主な特 長は次に示す機能です。 - 組み込みターゲットに応じた固有の置き換え関数 (TFL) の絞 り込み - 特定ターゲット用のコード生成 (TI DSP) および IDE とのコシ ミュレーション - 再入可能コードの生成 - 変数の名前ルールの定義などのコード スタイルのカスタマ イズ ファイル I/O サポートについてMATLAB Coder では ‘load’ や ‘fopen’を直接にはサポートしていません。 一部のファイル入出力に対する直接サポート (オーディオおよびビデ オ ファイル リーダー System object) については、汎用ファイルから の読み取りおよび書き込み方法の例として “coder.opaque” の例をご 確認ください。 コマンドラインからの実行 コード生成およびすべてのオプションの設定はコマンドラインから 行うことができます。“codegen” と “coder.config” を参照してくださ い。 複数の関数のコード生成を行う場合の関数名の競合について 複数の関数について個々にコード生成を行う場合、MATLAB Coder は、 名前は同じでもいくつかのサブ関数の動作が異なる C 関数を生成す る場合があります。これは、ファイルをマージしてすべての関数を 1 つのディレクトリに入れようとした場合、競合を招く可能性があ ります。 解決法: 複数の関数に対して同時にコードを生成する場合、 MATLAB Coder は設計の他の全部位について認識した上で C コードを生成し、クラッシュを回避します。そのまま "複数 のエントリ ポイント ファイル" 機能を使うことで、複数の 上位レベル関数がプロジェクトに定義付けられます。 ターゲット固有ライブラリの使用 MATLAB Coder では個々のターゲットに合わせた実装により、演算子 や関数の置き換えが行われます。この機能については、「ターゲッ ト関数ライブラリ (TFL)」の項目の下で説明されています。また、ご 利用の際には Embedded Coder が必要です。
5 再入可能コード/スレッドセーフなコードの生成 この機能を利用する場合は Embedded Coder が必要です。[詳細設定]、 [メモリ] を選択してください。 C++ コードの生成 MATLAB Coder が生成するのは常に C コードです。C++ オプションを 選択している場合でも、MATLAB Coder は C++ コンパイラによってコ ンパイル可能な .cpp 拡張子の C コードを生成します。[詳細設定]、 [すべての設定]、[言語] で [C++] を選択してください。