exponenta event banner

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

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

При наличии ПО 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).

Связанные темы