Если у вас есть 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).