Main Content

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

外部コード ベースにエクスポートするための共有ライブラリの生成

生成された共有ライブラリについて

Embedded Coder® ソフトウェアを使用している場合、共有ライブラリ、つまり Windows® ダイナミック リンク ライブラリ (.dll)、UNIX® 共有オブジェクト (.so) または Macintosh OS X ダイナミック ライブラリ (.dylib) をモデル コンポーネントから生成できます。自分自身または他のユーザーが、Windows、UNIX または Macintosh OS X 開発用コンピューターで実行されるアプリケーションに共有ライブラリを統合できます。共有ライブラリの用途には次のようなものがあります。

  • システム シミュレーションのためにアプリケーションにソフトウェア コンポーネントを追加する

  • 開発用コンピューターのアプリケーション間でソフトウェア モジュールを再利用する

  • ベンダーと共有するソフトウェアに関連する知的財産を隠す

共有ライブラリの生成時、コード ジェネレーターは次をエクスポートします。

  • データとしての ExportedGlobal 型の変数と信号

  • データとしてのリアルタイム モデル構造体 (model_M)

  • モデル コードの実行に不可欠な関数

ワークフロー

共有ライブラリをモデル コンポーネントから生成し、そのライブラリを使用するには、次の表に示されているタスクを実行してください。

タスクアクション詳細
1外部コードの特性と統合要件の評価を確認します。
2コードを生成するためにモデルを設定します。外部コードの外観に一致するコードの生成およびモデル コンフィギュレーション
3コード ジェネレーター用のモデルを構成して、共有ライブラリを生成し、コード生成を開始します。共有ライブラリの生成
4

生成された共有ライブラリが要件を満たしていることを確認します。たとえば、コード生成レポートをレビューし、ライブラリ内のシンボルのリストを確認します。

  • Windows では、Dependency Walker ユーティリティ (www.dependencywalker.com からダウンロード可能) を使用します。

  • UNIX では、nm -D model.so を使用します。

  • Macintosh OS X では、nm -g model.dylib を使用します。

 
5アプリケーション コードで共有ライブラリを使用します。生成された共有ライブラリを使用するアプリケーション コードの作成
6生成された共有ライブラリを読み込んで使用するアプリケーション コードをコンパイルし、リンクします。Simulink 環境内での統合コードのビルド
7実行可能プログラムの動作と実行が予想どおりであることを確認します。

共有ライブラリの生成

  1. コード生成用のモデルの構成時に、システム ターゲット ファイル ert_shrlib.tlc を選択します。

  2. モデルを作成します。コード ジェネレーターはモデルのソース コードと、そのコードの共有ライブラリ バージョンを生成します。コード ジェネレーターはコード生成フォルダーにソース コードを配置し、現在の作業フォルダーに共有ライブラリ (.dll.so または .dylib ファイル) を配置します。コード ジェネレーターは .lib ファイルも生成し、暗黙的なリンク作成をサポートするためにそのファイルを保持します。

生成された共有ライブラリを使用するアプリケーション コードの作成

このアプリケーション コード例は、例共有ライブラリを使用した開発用コンピューターのシミュレーターへのインターフェイスのために生成されています。

  1. モデルの外部入力および外部出力のための型宣言を含むアプリケーション ヘッダー ファイルを作成します。次に例を示します。

    #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_*/
  2. アプリケーションの 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)); 
    }
  3. アプリケーションの 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) の依存関係を参照してください。

関連するトピック