• 検索結果がありません。

生成された C コードの理解 コメント元になった MATLAB コードを C コード内にコメントとして追加しておくと その C コードの由来をより簡単に理解できることがよくありま [ 詳細設定 ] [ コード外観 ] を選択 C コードのカスタマイズ より効率的な C コードを生成するベストプラクテ

N/A
N/A
Protected

Academic year: 2021

シェア "生成された C コードの理解 コメント元になった MATLAB コードを C コード内にコメントとして追加しておくと その C コードの由来をより簡単に理解できることがよくありま [ 詳細設定 ] [ コード外観 ] を選択 C コードのカスタマイズ より効率的な C コードを生成するベストプラクテ"

Copied!
5
0
0

読み込み中.... (全文を見る)

全文

(1)

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)

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)

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)

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)

5  再入可能コード/スレッドセーフなコードの生成 この機能を利用する場合は Embedded Coder が必要です。[詳細設定]、 [メモリ] を選択してください。  C++ コードの生成 MATLAB Coder が生成するのは常に C コードです。C++ オプションを 選択している場合でも、MATLAB Coder は C++ コンパイラによってコ ンパイル可能な .cpp 拡張子の C コードを生成します。[詳細設定]、 [すべての設定]、[言語] で [C++] を選択してください。

便利な関数

詳細についてはドキュメントをご覧ください。 coder.ceval 既にもっている外部 C 関数を生成された C コー ドから呼び出す coder.cstructname 使用する MATLAB 構造体用に生成された C 構造 体の名前を指定する coder.inline サブ関数のインライン化を行う MATLAB のサブ 関数内で coder.inline(‘always’) が使われる場 合、対応するコードが生成された C コード内で インライン化される coder.target 予約された変数で、MATLAB インタープリター の実行中は ‘empty’ になる。 コード生成時と MATLAB モードとで異なる処理 を定義できる if isempty(coder.target) % MATLAB 実行時に使用されるコード else % コード生成時に使われるコード end coder.nullcopy 「ゼロ」と定義された変数に対する初期化ステ ートメントの抑止。結果的にコードはやや高速 化するが、読み取り前にすべての変数のスラ イスが書き込まれていることを必ず確認する 必要がある coder.config コマンドラインで “codegen” コマンドにより C コードを生成する場合、設定オブジェクトを作 成して必要なすべてのオプションを設定する

参照

関連したドキュメント

攻撃者は安定して攻撃を成功させるためにメモリ空間 の固定領域に配置された ROPgadget コードを用いようとす る.2.4 節で示した ASLR が機能している場合は困難とな

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

極大な をすべて に替えることで C-Tutte

このように、このWの姿を捉えることを通して、「子どもが生き、自ら願いを形成し実現しよう

このような情念の側面を取り扱わないことには それなりの理由がある。しかし、リードもまた

えて リア 会を設 したのです そして、 リア で 会を開 して、そこに 者を 込 ような仕 けをしました そして 会を必 開 して、オブザーバーにも必 の けをし ます

以上の基準を仮に想定し得るが︑おそらくこの基準によっても︑小売市場事件は合憲と考えることができよう︒

QRされた .ino ファイルを Arduino に‚き1む ことで、 GUI |}した ƒ+どおりに Arduino を/‡((スタンドアローン})させるこ とができます。. 1)