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

Сведения о сгенерированных общих библиотеках

Если у вас есть 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, выбор языка недоступен на  панели Генерация кода (Code Generation) в диалоговом окне Параметры конфигурации (Configuration Parameters).

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

Похожие темы