このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
MATLAB Function ブロックの可変サイズ配列での動的メモリ割り当ての使用
この例では、MATLAB Function ブロックの可変サイズ配列に対して動的メモリ割り当てを使用する方法を説明します。動的メモリ割り当てでは、スタックでメモリが静的に割り当てられるのではなく、実行時に必要に応じてヒープでメモリが割り当てられます。動的メモリ割り当ては次のような場合に便利です。
配列の上限がわからない。
大きい配列に対してスタックでメモリを割り当てたくない。
動的メモリ割り当ては、MATLAB Function ブロックにローカルな配列に対してのみ使用できます。
以下に対しては、動的メモリ割り当てを使用できません。
入力信号と出力信号。可変サイズの入力信号と出力信号には上限がなければなりません。
パラメーターまたはグローバル変数。パラメーターおよびグローバル変数は固定サイズでなければなりません。
バス配列のフィールド。バス配列は可変サイズのフィールドをもつことはできません。
MATLAB System ブロックに関連付けられた System object の離散状態プロパティ。
モデルの作成
制限なしの可変サイズ配列を使用する MATLAB Function ブロックをもつこの Simulink モデルを作成します。
Simulink® モデル
mymodel
を作成します。MATLAB Function ブロックをモデルに追加します。
MATLAB Function ブロックで、以下のコードを追加します。
function s = myfcn(n) Z = rand(1,n); s = sum(Z); end
MATLAB Function ブロックの左に Constant ブロックを追加します。
MATLAB Function ブロックの右に Outport ブロックを追加します。
ブロックを結線します。
動的メモリ割り当て用にモデルを構成
MATLAB Function ブロックの可変サイズ配列に対して動的メモリ割り当てが使用されるようモデルを構成しているか確認します。[コンフィギュレーション パラメーター] ダイアログ ボックスの [シミュレーション ターゲット]、[詳細設定パラメーター] カテゴリで、以下を確認します。
[MATLAB Function ブロック内の動的メモリ割り当て] チェック ボックスがオンになっている。
[MATLAB Function ブロック内の動的メモリ割り当てしきい値] パラメーターの既定値が 65536 になっている。
動的メモリ割り当てを使用したモデルのシミュレート
モデルをシミュレートします。
MATLAB Function エディターで、MATLAB® 関数レポートを開くために、[関数レポート] をクリックします。
[変数] タブには、
Z
が 1 行 :? 列の配列であることが示されています。コロン (:) は、2 番目の次元が可変サイズであることを示します。疑問符 (?) は、2 番目の次元が制限なしであることを示します。
シミュレーションでは、Z
の 2 つ目の次元に上限がないため、Z
に動的メモリ割り当てを使用しなければなりません。
制限付き配列に対する動的メモリ割り当ての使用
配列が制限なしの場合、コード ジェネレーターでは動的メモリ割り当てを使用しなければなりません。配列が制限付きの場合、コード ジェネレーターでは、配列サイズ (バイト単位) が動的メモリ割り当てしきい値以上になった場合にのみ動的メモリ割り当てが使用されます。このしきい値の既定の値は 65536 です。
動的メモリには実行時のパフォーマンス コストがあります。その使用を制御することで、実行時の速度を改善できます。
Z
をしきい値を超えるサイズの制限付き可変サイズ配列にする場合、コード ジェネレーターでは Z
に動的メモリ割り当てが使用されます。次に例を示します。
mymodel
で、myfcn
を変更してZ
の上限が 500 になるようにします。function s = myfcn(n) assert(n < 500); Z = rand(1,n); s = sum(Z); end
モデルをシミュレートします。
MATLAB Function レポートには、
Z
が 1 行 :500 列の配列であることが示されています。これは上限が 500 の可変サイズです。動的メモリ割り当てを
4000
以下の値に下げます。この値はZ
のサイズ (バイト単位) です。[コンフィギュレーション パラメーター] ダイアログ ボックスの [シミュレーション ターゲット]、[詳細設定パラメーター] カテゴリで、[MATLAB 関数での動的メモリ割り当てしきい値] パラメーターを 4000 に設定します。モデルのシミュレーションを実行します。
Z
のサイズが動的メモリ割り当てしきい値の 4000 であるため、コード ジェネレーターでは動的メモリ割り当てが使用されます。
動的メモリ割り当てを使用する C コードの生成
Simulink Coder™ をお持ちの場合は、このモデルの C コードを生成できます。次に、コード ジェネレーターでの動的に割り当てられた配列の表し方を確認できます。
固定ステップ ソルバーを使用するようモデルを構成します。[コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインの [ソルバー オプション] で、次のようにします。
[タイプ] には
[固定ステップ]
を選択します。[ソルバー] には
[離散 (連続状態なし)]
を選択します。
コード生成レポートを作成および使用するようにモデルを構成します。[コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成]、[レポート] ペインで、[コード生成レポートを作成] と [レポートを自動的に開く] を選択します。
MATLAB Function ブロックのコードを編集して、次のコードのようにします。
function s = myfcn(n) Z = rand(1,n); s = sum(Z); end
Z
は制限のない可変サイズ配列です。モデルが動的メモリ割り当て用に構成されているか確認します。
[MATLAB Function ブロック内の動的メモリ割り当て] チェック ボックスがオンになっている。
[MATLAB Function ブロック内の動的メモリ割り当てしきい値] パラメーターの既定値が 65536 になっている。
モデルを作成します。
コード生成レポートで、
mymodel.c
を開きます。emxArray
型のemxArray_real_T_mymodel_T
およびemxArray
ユーティリティ関数 (mymodel_emxInit_real_T
など) が示されているため、コード ジェネレーターでZ
に動的メモリ割り当てが使用されていることが分かります。コード ジェネレーターでは、メモリが動的に割り当てられている変数にemxArray
型が使用されます。生成されたコードでは、emxArray
ユーティリティ関数を使用してemxArray
を管理します。
Embedded Coder® がある場合は、emxArray
型とユーティリティ関数の識別子をカスタマイズできます。Identifier Format Control (Embedded Coder)を参照してください。