Сгенерируйте разделяемую библиотеку для экспорта во внешнюю кодовую базу

О сгенерированных разделяемых библиотеках

Если у вас есть программное обеспечение Embedded Coder®, можно сгенерировать разделяемую библиотеку — динамически подключаемую библиотеку Windows® (.dll), общий объект UNIX® (.so) или OS X Macintosh динамическая библиотека (.dylib) — от компонента модели. Вы или другие можете интегрировать разделяемую библиотеку в приложение, которое работает на Windows, UNIX или компьютере разработчика OS X Macintosh. Использование разделяемых библиотек включает:

  • Добавление компонента программного обеспечения к приложению для системной симуляции

  • Многократное использование программных модулей среди приложений на компьютере разработчика

  • Сокрытие интеллектуальной собственности сопоставило с программным обеспечением, которое вы совместно используете с поставщиками

При создании разделяемой библиотеки, экспорта генератора кода:

  • Переменные и сигналы типа ExportedGlobal как данные

  • Структура модели реального времени (model_M) как данные

  • Функции, важные для выполнения типового кода

Рабочий процесс

Чтобы сгенерировать разделяемую библиотеку от компонента модели и пользоваться библиотекой, выполните задачи, перечисленные в этой таблице.

ЗадачаДействиеБольше информации
1Рассмотрите свою оценку внешних характеристик кода и требований интегрирования.
2Сконфигурируйте модель для генерации кода.Сгенерируйте код, который совпадает с внешним видом внешнего кода и настройки модели
3Сконфигурируйте модель для генератора кода, чтобы произвести разделяемую библиотеку и инициировать генерацию кода.Сгенерируйте разделяемые библиотеки
4

Проверьте, что сгенерированная разделяемая библиотека удовлетворяет требования. Например, рассмотрите отчет генерации кода и просмотрите список символов в библиотеке.

  • На Windows используйте Зависимость утилита Уокера, загружаемая под эгидой www.dependencywalker.com

  • На UNIX используйте nm -D model.so

  • На OS X Macintosh используйте 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, выбор языка недоступен на  панели Генерации кода в диалоговом окне Configuration Parameters.

  • Чтобы восстановить симуляцию модели при помощи сгенерированной разделяемой библиотеки, автор приложения должен поддержать синхронизацию между системой и совместно использованными вызовами библиотечной функции в исходном приложении. Синхронизация должна быть сопоставимой так, чтобы можно было сравнить результаты симуляции и интегрирования. Факторы дополнительной симуляции применяются при генерации разделяемой библиотеки из модели, которая включает Поддержку параметров конфигурации модели: непрерывное время и функция вывода/обновления Single. Для получения дополнительной информации смотрите, что вывод/обновление Single функционирует (Simulink Coder) зависимости.

Похожие темы