Если у вас есть Embedded Coder® программное обеспечение, можно сгенерировать общую библиотеку - Windows® библиотека динамических ссылок (.dll
), UNIX® общий объект (.so
), или динамическая библиотека Macintosh OS X (.dylib
) - из компонента модели. Вы или другие пользователи можете интегрировать общую библиотеку в приложение, работающее на компьютере разработчика Windows, UNIX или Macintosh OS X. Использование общих библиотек включает в себя:
Добавление программного компонента в приложение для системной симуляции
Переиспользуйте программные модули среди приложений на компьютере разработчика
Скрытие интеллектуального свойства, связанной с программным обеспечением, которое вы делитесь с поставщиками
При создании общей библиотеки генератор кода экспортирует:
Переменные и сигналы типа 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
, выбор языка недоступен на панели Генерация кода (Code Generation) в диалоговом окне Параметры конфигурации (Configuration Parameters).
Чтобы восстановить симуляцию модели при помощи сгенерированной общей библиотеки, автор приложения должен поддерживать синхронизацию между вызовами системных и общих библиотечных функций в исходном приложении. Синхронизация должна быть последовательной, чтобы можно было сравнить результаты симуляции и интегрирования. Дополнительные факторы симуляции применяются, если генерируется общая библиотека из модели, которая позволяет параметрам конфигурации модели Поддержка: непрерывное время и Одна функция вывода/обновления. Для получения дополнительной информации смотрите Зависимости одного вывода/обновления функции (Simulink Coder).