Внешняя Интеграция кода Библиотек и Кода C/C++ с Моделями Simulink Real-Time

Факторы для интеграции сторонних библиотек и внешнего кода в Simulink Real-Time

Разработчики, интегрирующие код 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

Путем обновления кода 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

Подходы для Интеграции кода C/C++ в Simulink Real-Time

Существуют преимущества и недостатки к каждому из этих внешних подходов интеграции кода.

Приблизьтесь 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 пути на целевых компьютерах..

Создайте библиотеки из исходного кода для Simulink Real-Time

Чтобы интегрировать внешний код в приложении реального времени, самые гибкие подходы должны создать статические библиотеки или общие объекты из исходного кода. Факторы, которые делают эти подходы гибкими:

  • Рабочий процесс сборки библиотеки похож на рабочий процесс, используемый большинством разработчиков для релиза 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:

  1. Запустите с проекта C++ с CMake как среда сборки. ​

  2. Установите зависимости, такие как заголовки и библиотеки, в вашей модели Simulink. ​

  3. На компьютере разработчика кросс-скомпилируйте библиотеки для Нейтрино QNX RTOS на целевом компьютере. ​

  4. Создайте S-функцию, например, с помощью блока S-Function Builder или рукописной S-функции C-MEX, как основная функция, которая вызывает функции, определяемые C++ в заголовочных файлах и реализованный в скомпилированных библиотеках для Нейтрино QNX RTOS ​.

  5. Создайте приложение реального времени. ​

  6. При помощи SSH или FTP, скопируйте свои кросс-скомпилированные библиотеки в местоположение на целевом компьютере, где они могут быть найдены и загружены во времени выполнения. Рекомендуемыми местоположениями является /lib, /usr/lib, или /usr/local/lib.

  7. Загрузите и запустите приложение реального времени.

Внешняя интеграция кода для S-функций и Simulink Real-Time

Когда вы включаете статические библиотеки или общие объекты в 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);​
    endend
  • Позвольте соединиться для различных конечных файлов.

  • Используйте макросы, такие как SIMULINK_REAL_TIME в вашем исходном коде, чтобы добавить линии во время компиляции для симуляции в реальном времени. SIMULINK_REAL_TIME полезно, чтобы перенести ЛОГАРИФМИЧЕСКИЕ вызовы функции

Когда перекрестная компиляция, используйте макросы, такие как __unix__ и __QNXNTO__ в вашем исходном коде, чтобы добавить линии во время компиляции.

Hello World! Внешняя интеграция кода для Simulink Real-Time

В этом примере показано, как использовать блок 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');

Дополнительный Проект C/C++ для Simulink Real-Time

eCAL Тулбокс для проекта Simulink на MathWorks GitHub показывает полную внешнюю интеграцию кода с Simulink Real-Time, включая обертки S-функции, rtwmakecfg индивидуальная настройка и компиляция общего объекта. Также можно симулировать этот пример на компьютере разработчика.

Похожие темы

Внешние веб-сайты