Если у вас есть программное обеспечение Embedded Coder®, можно сгенерировать разделяемую библиотеку — динамически подключаемую библиотеку Windows® (.dll
), общий объект UNIX® (.so
) или OS X Macintosh динамическая библиотека (.dylib
) — от компонента модели. Вы или другие можете интегрировать разделяемую библиотеку в приложение, которое работает на Windows, UNIX или компьютере разработчика OS X Macintosh. Использование разделяемых библиотек включает:
Добавление компонента программного обеспечения к приложению для системной симуляции
Многократное использование программных модулей среди приложений на компьютере разработчика
Сокрытие интеллектуальной собственности сопоставило с программным обеспечением, которое вы совместно используете с поставщиками
При создании разделяемой библиотеки, экспорта генератора кода:
Переменные и сигналы типа ExportedGlobal
как данные
Структура модели реального времени (
) как данныеmodel_M
Функции, важные для выполнения типового кода
Чтобы сгенерировать разделяемую библиотеку от компонента модели и пользоваться библиотекой, выполните задачи, перечисленные в этой таблице.
Задача | Действие | Больше информации |
---|---|---|
1 | Рассмотрите свою оценку внешних характеристик кода и требований интегрирования. | |
2 | Сконфигурируйте модель для генерации кода. | Сгенерируйте код, который совпадает с внешним видом внешнего кода и настройки модели |
3 | Сконфигурируйте модель для генератора кода, чтобы произвести разделяемую библиотеку и инициировать генерацию кода. | Сгенерируйте разделяемые библиотеки |
4 |
Проверьте, что сгенерированная разделяемая библиотека удовлетворяет требования. Например, рассмотрите отчет генерации кода и просмотрите список символов в библиотеке.
| |
5 | Пользуйтесь разделяемой библиотекой в коде приложения. | Создайте код приложения, который пользуется сгенерированными разделяемыми библиотеками |
6 | Скомпилируйте и соедините код приложения, который загружает и пользуется сгенерированной разделяемой библиотекой. | Создайте интегрированный код вне окружения Simulink |
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
, выбор языка недоступен на панели Генерации кода в диалоговом окне Configuration Parameters.
Чтобы восстановить симуляцию модели при помощи сгенерированной разделяемой библиотеки, автор приложения должен поддержать синхронизацию между системой и совместно использованными вызовами библиотечной функции в исходном приложении. Синхронизация должна быть сопоставимой так, чтобы можно было сравнить результаты симуляции и интегрирования. Факторы дополнительной симуляции применяются при генерации разделяемой библиотеки из модели, которая включает Поддержку параметров конфигурации модели: непрерывное время и функция вывода/обновления Single. Для получения дополнительной информации смотрите, что вывод/обновление Single функционирует (Simulink Coder) зависимости.