Если у вас есть программное обеспечение 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) зависимости.