主要内容

このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

C调用者ブロックを使用したcコ,ドの統合

C调用者ブロックを使用してS金宝appimulink®に新規または既存のcコ,ドを統合できます。金宝appSimulinkモデルでカスタムブロックを作成するには,C调用者ブロックによって,外部のソースコードおよびライブラリで指定された外部C関数を呼び出すことができます。打电话的人ブロックのメリットには次のものがあります。

  • 単純なc関数の自動化された統合

  • 金宝app仿真软件覆盖™金宝app仿真软件测试™,および金宝appSimulink设计验证器™との統合

  • 金宝app仿真软件编码器™との統合

打电话的人ブロックによりCアルゴリズムをSim金宝appulinkに持込むことができます。動的システムをモデル化するには,代わりにs函数生成器を使用します。次のステップでは,C调用者ブロックを使用してS金宝appimulinkにCコドを統合するワクフロを説明します。

ソ,スコ,ドと依存関係の指定

C関数を含む外部ソスコドファルを指定します。

  1. 金宝appSimulinkルストリップから[コンフィギュレ,ションパラメ,タ,]を開きます。

  2. 左側のペ@ @ンで[シミュレ,ションタ,ゲット]を選択します。

  3. C来电者ブロックによる解析を有効にするには[カスタムコ、ドの、ンポ、ト]ボックスがオンになっていることを確認します。

    ディレクトリとファイルパスは,絶対パスでもモデルディレクトリまたは現在の作業ディレクトリへの相対パスでもかまいません。カスタムコ,ドへの相対パスの指定(Stateflow)を参照してください。

  4. [ヘッダファル]を選択して,ヘッダ,ファ,ルの名前を# includeタグと共に入力します。

  5. [追加のビルド情報]の下で[huawei @ huawei @ huawei @ huawei @ huawei @ huawei]を選択し、ヘッダ、ファ、ルなどの追加のビルド情報が格納されているフォルダ、を入力します。

  6. [ソスファル]を選択して,ソ,スファ,ルのパスと名前を入力します。モデルとソースファイルが異なるディレクトリにある場合,ファイル名の前にソースファイルが含まれているディレクトリを入力します。

メモ

関数がヘッダーファイルで宣言されていてソースコードで実装されていない場合,シミュレーションとモデルのコンパイルのために空のスタブ関数が自動的に生成されます。

メモ

C调用者为每个子系统内ブロックをで使用する,または連続サンプル時間を指定して使用する,あるいは条件付き入力分岐実行でブロックの使用を最適化するには,ブロックによって呼び出されるカスタムコード関数が確定的,つまり同じ入力に対して常に同じ出力を生成しなければなりません。[シミュレ,ションタ,ゲット]ペereplicationンで[確定的な関数]および[関数別に指定]パラメ,タ,を使用して,確定的なカスタムコ,ド関数を特定します。条件付き入力分岐実行の例にいては,使用C调用者块与条件执行を参照してください。

既定の関数配列レ@ @アウトの定義

金宝appSimulinkで行列デ,タが格納される順序を指定できます。C関数へ、または C 関数から渡される行列データは、指定した既定の関数配列レイアウトに変換されます。関数配列レイアウトが指定されていない場合、行列データはC调用者を通じて仿金宝app真软件データと同じ順序で渡され,行優先と列優先の乱れにより計算エラーが発生することがあります。すべてのS金宝appimulinkデタにいて同じ既定の関数配列レアウトに従うようにしてください。

  • 列優先- - - - - -C调用者ブロックはS金宝appimulinkデ,タを列優先の順序で処理します。3行3列の行列があるとします。C调用者ブロックでは,この行列は1列目,2列目,3列目の順序で格納されます。

  • 行優先- - - - - -C调用者ブロックはS金宝appimulinkデ,タを行優先の順序で処理します。3行3列の行列があるとします。C调用者ブロックでは,この行列は1行目,2行目,3行目の順序で格納されます。

  • 任意- - - - - -C调用者ブロックで,列優先および行優先の両方の順序で配列デ,タを格納できます。その結果,列優先および行優先の両方の設定でコ,ドを生成できます。

  • 指定なし—配列のデタは列優先および行優先の両方の順序で格納できます。[任意]設定と比較して,列優先設定でのみコ,ドを生成できます。

金宝appSimulinkでの行優先および列優先の配列レeconp,既定の関数配列のレ@ @アウトを参照してください。

  1. [既定の関数配列のレ电子邮箱アウト]の下の配列レ@ @アウトオプションを選択します。

  2. 特定の配列レアウトをコドの関数のいくかに適用する必要がある場合,[関数別に指定]をクリックしてこれらの関数を選択します。

  3. [適用]をクリックして変更を受け入れます。

  4. (好的)をクリックして[コンフィギュレ,ションパラメ,タ,]を閉じます。

C调用者ブロックの呼び出しと端子の指定

金宝app仿真软件キャンバスでC调用者を入力するだけで,仿真软件へのカスタムCコード統合を開始できます。または,C调用者ブロックを[ラaapl . aapl . cn](用户自定义函数)からドラッグします。ブロックをダブルクリックして[ブロックパラメ,タ,]ダesc escアログボックスを開いて,関数の名前と端子の指定を確認します。

  1. [カスタムコ,ドを更新します.]]をクリックしてソスコドとその依存関係をンポトします。

  2. C関数が[関数名]の下に表示されます。関数の完全なリストが表示されない場合は、をクリックしてソスコドを再ンポトします。

  3. ソスファル内の関数定義を表示するには,をクリックします。選択した関数のソ,スコ,ドは,matlab®エディタ,に表示されます。ソスコドが利用できない場合,ヘッダファル内の関数宣言が表示されます。

  4. ソスファルとその依存関係を変更する,または関数配列レアウトを定義して選択するには,[自定义代码设置]をクリックして,[コンフィギュレ,ションパラメ,タ,]の[シミュレ,ションタ,ゲット]タブを開きます。

C関数の引数の金宝app端子へのマッピング

C调用者ブロックの[端子仕様]テブルを使用したり,コマンドランでFunctionPortSpecificationオブジェクトを作成したりすることで,C関数の引数をソースコードから仿真软金宝app件端子にマッピングできます。ソースコードで,ヘッダーファイルには仿真软金宝app件端子に接続されるC関数の引数が含まれています。

extern void mean_filter(const unsigned char* src, unsigned char* dst, unsigned int width, unsigned int height, unsigned int filterSize);

[端子仕様]によって,引数の詳細とそれらがS金宝appimulinkでC调用者ブロックにどのように接続されるかが表示されます。

名前-入力および出力引数の名前を指定します。[名前]は,ソ,スコ,ドからのc関数で定義されている,関数の引数またはパラメ,タ,の名前です。この列は参照目的でのみ使用されます。

スコプ- C関数の引数がSi金宝appmulinkのスコプにどのようにマッピングされるかを指定します。引数には関数の定義により既定のスコープがあり,そのスコープをソースコードの関数定義によって変更できます。

金宝appSimulinkスコ,プ スコ,プからブロックへのマッピング
输入 ブロック入力端子
输出 ブロック出力端子
输入输出 ブロックの入力端子と出力端子
全球 ブロックで使用されるグロ,バル変数
参数 ブロックの調整可能なパラメタ
常数 定数値

ポンタで渡される引数では,Const double *uのような定数の修飾子定義がある場合、引数は输入または参数のみです。定数の修飾子がない場合,引数は既定で输入输出であり,それを输入输出,または参数スコ,プに変更できます。输入または参数スコプの場合,c関数がポンタで示されるメモリを変更しないようにしてください。引数が输出スコ,プである場合,このポ,ンタ,で示される各要素はこの関数の呼び出しのたびに再割り当てされます。

C引数

金宝appSimulinkスコ,プ

関数の戻り

输出

双u

输入参数常数

双u *

双u []

双u [] [2]

双u [2] [3]

输入输出(既定)、输出输入参数

Const double *u

Const double u[]

Const double u[][2]

Const double u[2][3]

输入(既定)、参数

(输入输出)端子を使用して,c関数のポ。(输入输出)端子を使用して作成された端子は,入力端子および出力端子と同じ名前になります。(输入输出)端子を使用すると,入力端子と出力端子のバッファ,の再利用が有効になります。これにより,信号のサaaplズとブロックレaaplアウトに応じてメモリの使用量が最適化されます。

C関数の引数を(输入输出)端子にマッピングするには,関数の定義において変数をポ。

extern void mean_filter(unsigned char* src, unsigned int width, unsigned int height, unsigned int filterSize);

次に,[端子仕様]テ,ブルで输入输出スコ,プに対する端子仕様を選択し,結果として生じる関数出力をカスタム関数の入力変数に代入します。

カスタムコードのグローバル変数を使用して,それらの変数を適切な仿真金宝app软件スコープにマッピングできます。モデルでのグロ,バル変数の使用を有効にするには,[モデル設定][コンフィギュレ,ションパラメ,タ,][シミュレ,ションタ,ゲット]からグロバル変数を関数ンタフェスとして有効にするを選択します。グロ,バル変数をC调用者ブロックの(输入)(输出)(输入输出)または(全球)スコ,プにマッピングできます。これらのスコ,プの可用性は,カスタムコ,ドのグロ,バル変数の仕様によって異なります。

(全球)スコ,プでは,カスタムコ,ドとC调用者ブロック間でデ,タを転送でき,ブロックで計算中にグロ,バル変数を使用できます。(全球)スコプを使用して転送された値はブロックンタフェスで表示できません。次の表は,コ,ド例の抜粋とその既定端子および使用可能な端子を示しています。

コド例 金宝appSimulinkスコ,プ

双数据;Void foo(Void) {int temp = data;}

グロ,バル変数では変数数据のみ読み取ります。次のスコ,プが使用できます。

输入(既定)

全球

双数据;Void bar(Void) {data = 0;}

デ,タはグロ,バル変数に書き込まれます。次のスコ,プが使用できます。

输出(既定)

全球

输入输出

双数据;Void foo2(Void) {data = data + 1;}

デ,タはグロ,バル変数で読み取りと書き込みの両方が実行されます。次のスコ,プが使用できます。

全球(既定)

输入输出

输出

ラベル- 金宝appSimulinkブロックの対応する引数のラベルを示します。既定では,引数のラベルは,変更しない限り引数名と同じです。

金宝appSimulinkスコ,プ 金宝appSimulink端子のラベル

输入输出

端子の名前
输入输出 入力端子と出力端子両方の端子の名
全球 端子名とグロ,バル変数名

参数

パラメ,タ,名

常数

定数値の式。

入力引数の名前のサ@ @ズ式。例:大小(in1, 1)

タereplicationプ- 金宝appSimulinkデタ型とC関数の引数のデタ型との一致を判別します。

C引数のデ,タ型 金宝appSimulinkデ,タ型
符号付き文字 int8
符号なし文字 uint8
字符 Int8またはuint8(コンパaapl .ラによる)
int int32
符号なし整数 uint32
int16
Int32またはfixdt(1,64,0)(オペレティングシステムによる)
浮动
int8_t int8
uint8_t int8
int16_t int16
uint16_t uint16
int32_t int32
uint32_t uint32
struct{…** 总线:AStruct
类型定义枚举{..} AnEnum** 枚举:AnEnum

C调用者が整数型を取る場合(例:int16_t),一致する基本データ型の固定小数点型(例:fixdt(3) 1, 16日)に変更できます。

**C调用者同期ボタンによって,C関数によって使用される構造体または列挙型を仿真金宝app软件バスおよび列挙型としてインポートできます。

サereplicationズ—引数のデタの次元を指定します。

C引数の次元 金宝appSimulink端子の次元

双u

スカラ(1)

双u []

双u [] [2]

継承 (-1) (既定)

引数が出力端子用の場合,サ。出力端子のサ@ @ズは継承できません。

双u *

継承 (-1) (既定)

[出力]端子のサesc escズを継承できる場合でも,引数が(输入输出)端子用である場合はサ@ @ズを継承できません。

グロバル変数の場合,サズはスカラ(1)です。

双u [2] [3]

サesc escズは[2,3]. .

FunctionPortSpecificationオブジェクトの作成とC调用者ブロックプロパティの編集

[端子仕様]テ,ブルプロパティをプログラムで変更するには,FunctionPortSpecificationオブジェクトを作成して,そのプロパティを変更します。モデル内の選択されたC调用者ブロック用にFunctionPortSpecificationオブジェクトを作成するには,コマンドラ。

myCCallerConfigObj = get_param(gcb,“FunctionPortSpecification”
myCCallerConfigObj =带有属性的FunctionPortSpecification: CPrototype: 'real_T add(real_T u1, real_T u2);' InputArguments: [1×2 Simulink.Cus金宝apptomCode。FunctionArgument] ReturnArgument: [1×1 金宝appSimulink.CustomCode.]FunctionArgument]GlobalArguments: [1×0 Simulink.CustomCode.FunctionArgument]
CPrototypeプロパティは読み取り専用であり,c関数の入力変数の宣言を示します。InputArgumentプロパティとReturnArgumentプロパティによって作成されるFunctionArgumentオブジェクトは,上記の[端子仕様]テ,ブル用に定義されたル,ルに従って,そのプロパティをさらに編集することができます。詳細にいては,FunctionPortSpecificationを参照してください。

C调用者ブロックでグロ,バル引数を変更するには,getGlobalArgを使用してGlobalArgumentsオブジェクトへのハンドルを作成し,そのプロパティを修正します。

カスタムC Callerラc_callerブラリの作成

ラ@ @ブラリモデルを作成してC调用者ブロックをグル,プ化し,モデルを整理した状態に維持できます。

  1. 新しいラ@ @ブラリモデルを開きます。[シミュレ,ション]タブで,[新規][ラ电子邮箱ブラリ]を選択します。

  2. [モデル化]タブの[設計]で,[シミュレ,ションのカスタムコ,ド]をクリックします。

  3. コ,ドによって[言語]オプションでCまたはc++を選択し,[カスタムコ、ドの、ンポ、ト]ボックスがオンになっていることを確認します。

  4. ソ,スコ,ドと依存関係の指定の説明に従ってソスファルとその依存関係を追加します。

  5. C调用者ブロックを作成してc関数を呼び出します。

  6. ライブラリモデルから仿真金宝app软件モデルにブロックを挿入するには,単純にブロックをモデルにドラッグします。

カスタムコ,ド用のデバッグシンボルの生成

外部のデバッガーをMATLABプロセスに追加し,外部Cコードをデバッグするには,次を使用してデバッグシンボルを生成します。

金宝appSimulink.CustomCode.debugSymbols (“上”
この設定をオンにしてモデルを更新したら,デバッグシンボルが生成され,外部のデバッガーをMATLABプロセスに追加できます。

次を使用して,この設定をオフにします。

金宝appSimulink.CustomCode.debugSymbols (“关闭”

別のプロセスでカスタムコ,ドのシミュレ,ションを行う

カスタムのCまたはc++コードを含むモデルのシミュレーションを実行する場合,MATLAB外の別のプロセスでカスタムコードを実行できるオプションがあります。このオプションは,カスタムコ,ドをデバッグする場合に役立,ます。別のプロセスで実行すると,カスタムコードの問題が原因でMATLABがクラッシュすることがなくなり,問題のデバッグと解決が簡単に実行できます。カスタムコードの予期しない例外または仿真金宝app软件とカスタムコード間のインターフェイスにおけるエラーが原因で問題が生じる可能性があります。

このオプションを有効にするには,モデルコンフィギュレ,ションパラメ,タ,で,[シミュレ,ションタ,ゲット]ペereplicationンの[カスタムコ,ドのシミュレ,ションを別のプロセスで行う]を選択します。このオプションは,以下のブロックのいずれかを使用してモデルに統合されたカスタムのC / c++コードに適用されます。

  • C调用者

  • C函数

  • MATLAB函数

  • MATLAB系统

  • Stateflow®チャト

“配置参数”对话框的“模拟目标”窗格。该窗格显示了“在单独的进程中模拟自定义代码”参数的复选框。

たとえば,このモデルに,adderObjと呼ばれるオブジェクトにアクセスする関数加法器()を呼び出すC调用者ブロックが含まれるとします。関数を呼び出す前にオブジェクトを作成しなければなりません。オブジェクトを作成するには、モデル コンフィギュレーション パラメーターの[シミュレ,ションタ,ゲット]ペereplicationンの[初期化関数]からinitAdder ()を呼び出します。

Simulink金宝app模型画布的一部分,包括在块图标上带有“加法器”的C调用者块

静态加器* adderObj = nullptr;int加器(int增量){adderObj->add_one(增量);返回adderObj - > get_val ();} void initAdder() {adderObj = new Adder();}

加法器()の前にinitAdder ()が呼び出されない場合,加法器()は初期化されていないポ。[カスタムコ,ドのシミュレ,ションを別のプロセスで行う]パラメーターが選択されていない場合,モデルをシミュレートするときに,この例外によってMATLABがクラッシュする可能性があります。ただし,このパラメーターが選択されている場合,モデルをシミュレートすると,金宝app模型内にエラーメッセージが示されます。

错误消息文本

次に,[開く]をクリックして外部デバッガ,を起動し,エラ,の原因となっている問題を解決します。

外部调试器显示设置了断点的自定义C代码

デバッガーが起動すると,シミュレーションが再開し,カスタム関数エントリのブレークポイントで自動的に停止します。

カスタムコ,ドが完全にデバッグされたら,[別のプロセスでカスタムコ,ドのシミュレ,ションを行う]をオフにしてシミュレ,ション時間を高速化できます。

制限

  • グロ,バル変数—関数の入出力としてのグロ,バル変数は,多次元配列をサポ,トしません。

  • カスタムコド設定の初期化/終了——カスタムコードにメモリを割り当てたり割り当て解除したりする必要がある場合は,カスタムコード設定の[初期化関数]および[終了関数]フィ,ルドに割り当ておよび割り当て解除を挿入するか,C函数ブロックを使用します。

  • 複素数デ,タのサポ,ト- - - - - -C调用者ブロックはS金宝appimulinkの複素数デ,タ型をサポ,トしません。

  • 可変引数- cの可変引数はサポトされません(たとえば,sprintf(char *str, const char *format,…))。

  • c++構文- - - - - -C调用者ブロックはネc ++構文を直接サポc ++トしません。c++コードとインターフェイスする C 関数ラッパーを記述する必要があります。

C调用者ブロックを含むモデルをテストする場合は,测试集成C代码(金宝app仿真软件测试)を参照してください。

メモ

モデルにカスタムコードが含まれる場合,モデルが更新または実行されると,読み込まれたカスタムコードのシミュレーション実行可能ファイルが原因でslprjフォルダ,がロックされる場合があります。フォルダ,はロックされると削除できません。実行可能ファルをアンロドして,slprjフォルダ,のロックを解除するには,清晰的墨西哥人コマンドを使用します。清晰的を参照してください。

参考

||||||||

関連するトピック