Разработчики, интегрирующие код C/C++ с приложениями Simulink Real-Time, замечают некоторые различия, когда они перемещают код, который они интегрировали с приложениями Simulink Real-Time от релиза R2020a и до R2020b и позже. Эти различия включают:
В релизе R2020a и предыдущий, Вовремя RTOS на целевом компьютере совместно использовал некоторые библиотеки и системные вызовы с Windows®. В релизе R2020b и позже, QNX® Нейтрино® RTOS на целевом компьютере не совместно использует специфичные для Windows библиотеки или системные вызовы.
В релизе R2020a и предыдущий, разработчики могли использовать Microsoft® Visual Studio® скомпилировать библиотеки, чтобы объединяться с приложениями Simulink Real-Time. В релизе R2020b и позже, компилятор Microsoft Visual Studio не может использоваться с этой целью. Можно сконфигурировать Microsoft Visual Studio, чтобы использовать компилятор Нейтрино QNX от целевого пакета поддержки Simulink Real-Time.
В R2020b и позже, разработчики используют кросс-компиляцию, чтобы произвести библиотеки по их компьютеру разработчика для развертывания на их целевом компьютере.
Путем обновления кода C/C++ для интегрирования в приложение Simulink Real-Time вы получаете эту выгоду:
Усильте 64-битное нейтрино QNX и POSIX® совместимый RTOS
Закодируйте непосредственно на C++ или перенесите свой устаревший код С
Используйте редактор кода по вашему выбору.
Например, настройка Кода Visual Studio с исходными файлами и поставленного компилятора QCC от Целевого Пакета поддержки Simulink Real-Time предоставляет подобный опыт полному IDE
Усильте предварительно скомпилированные библиотеки QNX Neutrino и заголовки, которые включены в Simulink Real-Time, чтобы расширить функциональность вашего приложения реального времени
Интегрируйте любое приложение C/C++ на основе современной сборки и программное обеспечение пакета, такое как CMake
Существуют преимущества и недостатки к каждому из этих внешних подходов интеграции кода.
Приблизьтесь 1: Непосредственно Вызов Код C/C++. В этом подходе, вы use C Вызывающая сторона или Функциональные блоки C в модели. Для получения дополнительной информации смотрите, Интегрируют Внешние Алгоритмы C Используя блоки C Function.
Преимущества : нет никакой потребности скомпилировать исходный код прежде, чем создать модель.
Недостатки: Этот подход является hard, чтобы использовать для комплексных проектов со многими файлами и зависимостями . Кроме того, в этом подходе необходимо написать обертку C в Simulink для Кода С++. Для получения дополнительной информации, см., что Методы Класса C++ Вызова Используют Функцию Обертки C-стиля От блока C Function.
Приблизьтесь 2: Создайте, соедините и пользуйтесь статическими библиотеками (.a
файлы)
Преимущества : Все необходимые файлы упаковываются в приложении реального времени файл MLDATX. В этом подходе there не является никакой потребностью установить библиотеки по цели. И, этот подход позволяет вам protect ваша интеллектуальная собственность.
Недостатки : Этот подход является немодульным. Изменение в библиотеке требует восстановления целого приложения реального времени . Кроме того, этот подход имеет тенденцию производить большее приложение реального времени файлы MLDATX.
Приблизьтесь 3: Создайте, разверните и используйте общие объекты (.so
файлы)
Преимущества : Этот подход является модульным. Приложение реального времени и общий объект могут быть созданы независимо . Кроме того, этот подход имеет тенденцию производить меньшее приложение реального времени файлы MLDATX. И этот подход позволяет вам защитить свою интеллектуальную собственность.
Недостатки: In этот подход, необходимо получить доступ к файловой системе целевого компьютера прежде, чем запустить приложение реального времени и установку (копия) общие объекты к любому общему lib
пути на целевых компьютерах..
Чтобы интегрировать внешний код в приложении реального времени, самые гибкие подходы должны создать статические библиотеки или общие объекты из исходного кода. Факторы, которые делают эти подходы гибкими:
Рабочий процесс сборки библиотеки похож на рабочий процесс, используемый большинством разработчиков для релиза R2020a и предыдущих релизов. В тех релизах рабочем процессе сборки библиотеки для целевого компьютера Вовремя RTOS произвел статические библиотеки, созданные с Microsoft Visual Studio, и произвел .lib
файлы.
Лучшее удобство пользования при работе с комплексными проектами C++ со многими зависимостями и файлами исходного кода.
S-функции предлагают лучшую гранулярность при обработке сторонних библиотек в Simulink и позволяют гибкости использовать тот же исходный код S-функции с другими платформами, включая симуляцию на рабочем столе в различной ОС и развертывании и функции в режиме реального времени на целевом компьютере.
Кросс-компиляция компилирует библиотеку для целевой ОС (например, Нейтрино QNX RTOS) на разработке ОС (например, Windows). Некоторые факторы кросс-компиляции для Simulink Real-Time:
Выбор среды разработки важен. Много современных проектов C++ используют среду сборки CMake. Для получения дополнительной информации смотрите веб-сайт CMake.
Расширяемость среды разработки важна. Например, это - установившаяся практика, чтобы расширить наиболее распространенную поддержку CMake Нейтрино QNX RTOS путем усиления общих черт с UNIX® ОС и ее совместимость POSIX.
В ваших библиотеках не забудьте сохранять библиотеки кросс-компиляции, включая зависимости, которые могут быть уже включены в Целевой Пакет поддержки Simulink Real-Time. Эти библиотеки могут быть соединены с другими проектами C++..
Рекомендуемый рабочий процесс для интегрирования комплексных приложений C++ в Simulink Real-Time:
Запустите с проекта C++ с CMake как среда сборки.
Установите зависимости, такие как заголовки и библиотеки, в вашей модели Simulink.
На компьютере разработчика кросс-скомпилируйте библиотеки для Нейтрино QNX RTOS на целевом компьютере.
Создайте S-функцию, например, с помощью блока S-Function Builder или рукописной S-функции C-MEX, как основная функция, которая вызывает функции, определяемые C++ в заголовочных файлах и реализованный в скомпилированных библиотеках для Нейтрино QNX RTOS .
Создайте приложение реального времени.
При помощи SSH или FTP, скопируйте свои кросс-скомпилированные библиотеки в местоположение на целевом компьютере, где они могут быть найдены и загружены во времени выполнения. Рекомендуемыми местоположениями является /lib
, /usr/lib
, или /usr/local/lib
.
Загрузите и запустите приложение реального времени.
Когда вы включаете статические библиотеки или общие объекты в S-функциях для внешней интеграции кода с приложением реального времени, существуют некоторые советы, которые могут упростить вашу разработку.
При создании из Simulink вы должны:
Используйте rtwmakecfg.m
и makeInfo
возразите, чтобы сопоставить библиотеки и заголовочные файлы. Для получения дополнительной информации смотрите Использование rtwmakecfg.m API, чтобы Настроить Сгенерированные Make-файлы.
function makeInfo = rtwmakecfg proj = currentProject; rootPath = proj.RootFolder; makeInfo.linkLibsObjs = {}; sysTarget = get_param(bdroot, 'RTWSystemTargetFile'); switch sysTarget case 'slrealtime.tlc' makeInfo.includePath = '<includePath>'; makeInfo.linkLibsObjs{end+1} = '<libraryPath>'; otherwise error('No rtwmakecfg found for %s target file', sysTarget); end end
Позвольте соединиться для различных конечных файлов.
Используйте макросы, такие как SIMULINK_REAL_TIME
в вашем исходном коде, чтобы добавить линии во время компиляции для симуляции в реальном времени. SIMULINK_REAL_TIME
полезно, чтобы перенести ЛОГАРИФМИЧЕСКИЕ вызовы функции
Когда перекрестная компиляция, используйте макросы, такие как __unix__
и __QNXNTO__
в вашем исходном коде, чтобы добавить линии во время компиляции.
В этом примере показано, как использовать блок S-Function Builder для внешней интеграции кода. Пример добавляет привет сообщение к системному журналу.
Прежде, чем запустить этот пример, установите Целевой Пакет поддержки Simulink Real-Time. Пакет поддержки включает инструменты, которые компилируют код, который работает на целевом компьютере.
Откройте модель
Используйте кнопку Open Model, чтобы открыть helloworld.slx
модель.
open_system('slrt_ex_helloworld_sfunbuilder');
Откройте блок s-function
Дважды кликните helloworld-sfun
Блок s-function. Разработчик S-функции открывает и отображает код S-функции.
/* Includes_BEGIN */
#ifdef SIMULINK_REAL_TIME
#include "slrt_log.hpp"
#endif
/* Includes_END */
/* Externs_BEGIN */
/* extern double func(double a); */
/* Externs_END */
void helloworld_sfun_Start_wrapper(SimStruct *S)
{
/* Start_BEGIN */
/* Start_END */ }
void helloworld_sfun_Outputs_wrapper(const real_T *u0, real_T *y0, SimStruct *S) { /* Output_BEGIN */ // Create custom message static char hellomsg[100]; sprintf(hellomsg,"Hello World! t=%f \n",*u0); // Use macros for platform dependent code #ifdef SIMULINK_REAL_TIME slrealtime::log_info(hellomsg); #else ssPrintf(hellomsg); #endif
// Generic platform independent code *y0 = *u0; /* Output_END */ }
void helloworld_sfun_Terminate_wrapper(SimStruct *S)
{
/* Terminate_BEGIN */
/*
* Custom Terminate code goes here.
*/
/* Terminate_END */
}
Создайте модель и запущенное приложение реального времени
Прежде, чем создать модель, можно запустить модель на рабочем столе и просмотреть выходной сигнал в системном логарифмическом средстве просмотра Simulink Real-Time.
Когда вы готовы создать модель, на вкладке Simulink Editor Real-Time, соединиться с целевым компьютером и нажать Run on Target. Или в командном окне MATLAB введите:
tg = slrealtime; connect(tg); model = 'slrt_ex_helloworld_sfunbuilder'; evalc('slbuild(model)'); load(tg,model); start(tg); pause(20); stop(tg);
Просмотрите сообщение в журнале состояния
Откройте журнал состояния целевого компьютера и просмотрите Hello World!
сообщение. На вкладке Simulink Editor Real-Time выберите Prepare> SLRT Explorer. Затем выберите вкладку System Log Viewer. Или в командном окне MATLAB введите:
slrtLogViewer;
Средство просмотра показывает Hello World!
сообщения в системном журнале.
Закройте все
bdclose('all');
eCAL Тулбокс для проекта Simulink на MathWorks GitHub показывает полную внешнюю интеграцию кода с Simulink Real-Time, включая обертки S-функции, rtwmakecfg
индивидуальная настройка и компиляция общего объекта. Также можно симулировать этот пример на компьютере разработчика.