外部コード ベースにエクスポートするための共有ライブラリの生成
生成された共有ライブラリについて
Embedded Coder® ソフトウェアを使用している場合、共有ライブラリ、つまり Windows® ダイナミック リンク ライブラリ (.dll
)、UNIX® 共有オブジェクト (.so
) または Macintosh OS X ダイナミック ライブラリ (.dylib
) をモデル コンポーネントから生成できます。自分自身または他のユーザーが、Windows、UNIX または Macintosh OS X 開発用コンピューターで実行されるアプリケーションに共有ライブラリを統合できます。共有ライブラリの用途には次のようなものがあります。
システム シミュレーションのためにアプリケーションにソフトウェア コンポーネントを追加する
開発用コンピューターのアプリケーション間でソフトウェア モジュールを再利用する
ベンダーと共有するソフトウェアに関連する知的財産を隠す
共有ライブラリの生成時、コード ジェネレーターは次をエクスポートします。
データとしての
ExportedGlobal
型の変数と信号データとしてのリアルタイム モデル構造体 (
)model
_Mモデル コードの実行に不可欠な関数
ワークフロー
共有ライブラリをモデル コンポーネントから生成し、そのライブラリを使用するには、次の表に示されているタスクを実行してください。
タスク | アクション | 詳細 |
---|---|---|
1 | 外部コードの特性と統合要件の評価を確認します。 | |
2 | コードを生成するためにモデルを設定します。 | |
3 | コード ジェネレーター用のモデルを構成して、共有ライブラリを生成し、コード生成を開始します。 | |
4 | 生成された共有ライブラリが要件を満たしていることを確認します。たとえば、コード生成レポートをレビューし、ライブラリ内のシンボルのリストを確認します。
| |
5 | アプリケーション コードで共有ライブラリを使用します。 | |
6 | 生成された共有ライブラリを読み込んで使用するアプリケーション コードをコンパイルし、リンクします。 | |
7 | 実行可能プログラムの動作と実行が予想どおりであることを確認します。 |
共有ライブラリの生成
コード生成用のモデルの構成時に、システム ターゲット ファイル
ert_shrlib.tlc
を選択します。モデルを作成します。コード ジェネレーターはモデルのソース コードと、そのコードの共有ライブラリ バージョンを生成します。コード ジェネレーターはコード生成フォルダーにソース コードを配置し、現在の作業フォルダーに共有ライブラリ (
.dll
、.so
または.dylib
ファイル) を配置します。コード ジェネレーターは.lib
ファイルも生成し、暗黙的なリンク作成をサポートするためにそのファイルを保持します。
生成された共有ライブラリを使用するアプリケーション コードの作成
このアプリケーション コード例は、例共有ライブラリを使用した開発用コンピューターのシミュレーターへのインターフェイスのために生成されています。
モデルの外部入力および外部出力のための型宣言を含むアプリケーション ヘッダー ファイルを作成します。次に例を示します。
#ifndef _APP_MAIN_HEADER_ #define _APP_MAIN_HEADER_ typedef struct { int32_T Input; } ExternalInputs_rtwdemo_shrlib; typedef struct { int32_T Output; } ExternalOutputs_rtwdemo_shrlib; #endif /*_APP_MAIN_HEADER_*/
アプリケーションの C ソース コードで、共有ライブラリを動的に読み込みます。前処理の条件付きステートメントを使用して、プラットフォームに固有のコマンドを起動します。以下に例を示します。
#if (defined(_WIN32)||defined(_WIN64)) /* WINDOWS */ #include <windows.h> #define GETSYMBOLADDR GetProcAddress #define LOADLIB LoadLibrary #define CLOSELIB FreeLibrary #else /* UNIX */ #include <dlfcn.h> #define GETSYMBOLADDR dlsym #define LOADLIB dlopen #define CLOSELIB dlclose #endif int main() { void* handleLib; ... #if defined(_WIN64) handleLib = LOADLIB("./rtwdemo_shrlib_win64.dll"); #else #if defined(_WIN32) handleLib = LOADLIB("./rtwdemo_shrlib_win32.dll"); #else /* UNIX */ handleLib = LOADLIB("./rtwdemo_shrlib.so", RTLD_LAZY); #endif #endif ... return(CLOSELIB(handleLib)); }
アプリケーションの C ソース コードから、エクスポートされたデータとモデルから生成された関数にアクセスします。コードでは、フックを使用してユーザー定義の初期化、ステップ、終了コードが追加されます。
int32_T i; ... void (*mdl_initialize)(boolean_T); void (*mdl_step)(void); void (*mdl_terminate)(void); ExternalInputs_rtwdemo_shrlib (*mdl_Uptr); ExternalOutputs_rtwdemo_shrlib (*mdl_Yptr); uint8_T (*sum_outptr); ... #if (defined(LCCDLL)||defined(BORLANDCDLL)) /* Exported symbols contain leading underscores when DLL is linked with LCC or BORLANDC */ mdl_initialize = (void(*)(boolean_T))GETSYMBOLADDR(handleLib , "_rtwdemo_shrlib_initialize"); mdl_step = (void(*)(void))GETSYMBOLADDR(handleLib , "_rtwdemo_shrlib_step"); mdl_terminate = (void(*)(void))GETSYMBOLADDR(handleLib , "_rtwdemo_shrlib_terminate"); mdl_Uptr = (ExternalInputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib , "_rtwdemo_shrlib_U"); mdl_Yptr = (ExternalOutputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib , "_rtwdemo_shrlib_Y"); sum_outptr = (uint8_T*)GETSYMBOLADDR(handleLib , "_sum_out"); #else mdl_initialize = (void(*)(boolean_T))GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_initialize"); mdl_step = (void(*)(void))GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_step"); mdl_terminate = (void(*)(void))GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_terminate"); mdl_Uptr = (ExternalInputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_U"); mdl_Yptr = (ExternalOutputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_Y"); sum_outptr = (uint8_T*)GETSYMBOLADDR(handleLib , "sum_out"); #endif if ((mdl_initialize && mdl_step && mdl_terminate && mdl_Uptr && mdl_Yptr && sum_outptr)) { /* user application initialization function */ mdl_initialize(1); /* insert other user defined application initialization code here */ /* user application step function */ for(i=0;i<=12;i++){ mdl_Uptr->Input = i; mdl_step(); printf("Counter out(sum_out): %d\tAmplifier in(Input): %d\tout(Output): %d\n", *sum_outptr, i, mdl_Yptr->Output); /* insert other user defined application step function code here */ } /* user application terminate function */ mdl_terminate(); /* insert other user defined application termination code here */ } else { printf("Cannot locate the specified reference(s) in the shared library.\n"); return(-1); }
制限
ert_shrlib.tlc
システム ターゲット ファイルのコード生成では、次のものをデータとしてエクスポートします。ExportedGlobal
型の変数と信号リアルタイム モデル構造体 (
model
_M)
ert_shrlib.tlc
システム ターゲット ファイルのコード生成では、C 言語のみがサポートされています (C++ ではない)。ert_shrlib.tlc
を選択した場合、[コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成] ペインで言語を選択することはできません。生成された共有ライブラリを使用してモデル シミュレーションを再構成するには、アプリケーションの作成者は、システムと元のアプリケーションの共有ライブラリ関数呼び出しの間でタイミングを維持しなければなりません。シミュレーション結果と統合結果を比較できるように、タイミングは一貫していなければなりません。モデル コンフィギュレーション パラメーターの [サポート: 連続時間] と [1 つの出力/更新関数] を有効にするモデルから共有ライブラリを生成している場合、シミュレーションに関するさらなる考慮事項が適用されます。詳細については、1 つの出力/更新関数 (Simulink Coder) の依存関係を参照してください。