Повторное использование кода предлагает деловые и технологические преимущества. С точки зрения бизнеса, повторное использование кода экономит время и ресурсы. С технологической точки зрения повторное использование кода способствует согласованности и уменьшает требования к памяти. Другие факторы включают:
Модуляризация приложения
Повторное использование оптимизированного алгоритма
Взаимодействие с предопределенным набором данных
Разработка вариантов приложения
Примеры переиспользуемого независимо от оборудования алгоритмического кода, чтобы рассмотреть возможность импорта в Simulink® окружение для симуляции и генерации кода включают:
Служебные функции
Интерполяционные таблицы
Цифровые фильтры
Специализированные интеграторы
Пропорционально-интегрально-производные (ПИД) модули управления
Чтобы вызвать переиспользуемый код внешнего алгоритма для симуляции и генерации кода, повторите задачи, перечисленные в этой таблице.
Задача | Действие | Дополнительная информация |
---|---|---|
1 | Проверьте оценку характеристик внешнего кода и требований к интегрированию. | Выберите рабочий процесс интегрирования внешнего кода (Embedded Coder) |
2 | На основе языка программирования внешнего кода выберите интеграционный подход, чтобы добавить внешний код к модели Simulink. | Выбор Интегрирования подхода (Embedded Coder) |
3 | Проверьте поведение и эффективность алгоритма путем симуляции модели. | Симуляция |
4 | Задайте представление данных моделей для генерации кода. | Обмен данными между внешним кодом C/C + + и моделью Simulink или сгенерированным кодом (Embedded Coder) |
5 | Сконфигурируйте модель для генерации кода. | Сгенерируйте код, который соответствует внешнему виду внешнего кода ( Embedded Coder) и строения модели (Embedded Coder) |
6 | Сгенерируйте код и отчет генерации кода. | Генерация кода (Embedded Coder) |
7 | Проверьте сгенерированный интерфейс кода и статические метрики кода. | Анализируйте сгенерированный код (Embedded Coder) и статические метрики кода (Embedded Coder) |
8 | Создайте исполняемую программу из модели. | Создайте интегрированный код в окружение Simulink (Embedded Coder) |
9 | Проверьте, что исполняемая программа работает должным образом. | Численная проверка эквивалентности (Embedded Coder) |
10 | Проверьте, что исполняемая программа работает должным образом. | Профилирование выполнения кода (Embedded Coder) |
Для интеграции переиспользуемого алгоритмического кода в окружение Simulink для генерации кода доступно несколько подходов. Некоторые подходы интегрируют внешний код непосредственно. Другие подходы преобразуют внешний код в Simulink или Stateflow® моделирование элементов для симуляции и позже для генерации кода из смоделированного проекта. Подход к интегрированию, который вы выбираете, зависит от:
Язык программирования внешнего кода - MATLAB®, C, C++ или Фортран
Ваш языковой опыт и выборы программирования
Требования к эффективности
Должен ли алгоритм моделировать непрерывную динамику времени, или вы интегрируете алгоритм в приложение, которое использует дискретное и непрерывное время
Хотите ли вы воспользоваться преимуществами Модельно-ориентированное проектирование
Уровень контроля, необходимый для кода, который производит генератор кода
Чтобы выбрать подход для переиспользуемого алгоритма, смотрите подразделы, которые соответствуют языку программирования вашего кода внешнего алгоритма.
Интегрирование подходы к внешнему коду MATLAB (Embedded Coder)
Интегрирование подходы к внешним Кодам C or C++ ( Embedded Coder)
Интегрирование подходы к внешним Кодам на языке Фортран ( Embedded Coder)
Для интеграции внешнего кода MATLAB в окружение Simulink доступно несколько подходов. Следующая схема и таблица помогают вам выбрать оптимальный подход к интегрированию для вашего приложения на основе требований к интегрированию.
Условие или требование | Действие | Дополнительная информация | |
---|---|---|---|
1 | Алгоритм должен смоделировать непрерывную динамику состояний. | Напишите S-функцию MATLAB и, для генерации кода, соответствующий файл TLC для алгоритма. Добавьте S-функцию к своей модели. | |
2 | Внешний код соответствует коду MATLAB для подмножества генерации кода, и вы хотите вызвать код MATLAB из модели Simulink. | Добавьте блок MATLAB Function к модели. Встройте код MATLAB в этот блок. | |
3 | Внешний код соответствует коду MATLAB для подмножества генерации кода, вы хотите вызвать код MATLAB из модели Simulink, и ваш алгоритм включает итерационные расчеты, которые обрабатывают большие потоки данных. | Добавьте блок MATLAB System к модели. Встройте код MATLAB в этот блок как системный object™. | |
4 | Внешний код соответствует коду MATLAB для подмножества генерации кода, вы хотите вызвать код MATLAB из модели Simulink, и ваш алгоритм включает проект себя логику, которая основана на машинах состояний и графиках потока. | Добавьте диаграмму Stateflow к модели. Вызовите внешний код из графика, используя MATLAB в качестве языка действий. |
|
5 | Вы хотите использовать parfor функция для параллельных вычислений или типов данных интерфейса, которые доступны для MATLAB Coder™, Simulink Coder и Embedded Coder®. Использовать parfor Необходимо установить Parallel Computing Toolbox™. | Используйте программное обеспечение для генерации кода С. Затем вызовите этот сгенерированный код как внешний Код С. | |
6 | У вас есть опыт программирования на C или C++, и внешний код MATLAB компактен и в основном использует конструкции C или C++. | Вручную преобразуйте код MATLAB в код C or C++. Выберите интегрирование подход для кода C or C++. | Интегрирование подходы к внешним Кодам C or C++ ( Embedded Coder) |
7 | Разделы внешнего кода MATLAB сопоставлены со встроенными блоками. | Разрабатывайте алгоритм в контексте модели, используя применимые встроенные блоки. |
Чтобы встраивать внешний код MATLAB в блок MATLAB Function или сгенерировать код C or C++ из кода MATLAB с помощью программного обеспечения MATLAB Coder, код MATLAB должен использовать функции и классы, поддерживаемые для генерации кода C/C + +.
В большинстве случаев можно интегрировать внешний код, написанный на C или C++, в окружение Simulink, сгенерировав S-функции и файлы TLC с помощью Legacy Code Tool. Этот инструмент использует спецификации, которые вы поставляете в качестве кода MATLAB, чтобы преобразовать существующие функции MATLAB в S-функции C MEX, которые можно включить в модели Simulink и вызвать из сгенерированного кода. Для получения дополнительной информации смотрите Реализация Алгоритмов с использованием Legacy Code Tool и Импорт Вызовов во Внешний Код в Сгенерированный Код с помощью Legacy Code Tool (Embedded Coder).
По сравнению с альтернативными подходами, Legacy Code Tool является наиболее оптимальным выбором для генерации кода, оптимизированного достаточно для встраиваемых систем. Рассмотрите альтернативные подходы, если существует одно или несколько из следующих условий:
Внешний код использует глобальные переменные для обмена данными.
Опыт программирования ограничен.
Алгоритм должен смоделировать дискретную и непрерывную динамику состояний.
Необходимо включить интегрированный внешний код в диаграмму Stateflow.
Внешний код требует интерфейса с фиксированной точкой.
Вы хотите максимальную гибкость для управления тем, какой код производит генератор кода.
Вы быстро хотите встраивать вызов к внешнему коду в вызов к coder.ceval
функция, которая встроена в блок MATLAB Function, и эффективность не является проблемой.
Эта схема и таблица помогают вам выбрать оптимальный подход к интегрированию, основанный на ваших требованиях к интегрированию.
Условие или требование | Действие | Дополнительная информация | |
---|---|---|---|
1 | Вы хотите интегрировать внешний код С с сгенерированным кодом С++ или наоборот | Соответствие языковому выбору сгенерированного кода путем изменения языка внешнего кода. | Измените язык программирования внешнего кода, чтобы соответствовать сгенерированному коду (Embedded Coder) |
2 | Ваш алгоритм включает проект себя логику, которая основана на машинах состояний и графиках потока. Или функция, которую вы хотите интегрировать, должна обмениваться данными с моделью с помощью глобальных переменных. Функция задает глобальные переменные и использует их для записи выхода, а не для возврата значения (return) или записи выхода в аргумент. | Добавьте диаграмму Stateflow к модели. Вызовите внешний код из графика, используя C в качестве языка действий. На графике напишите код, который вызывает внешнюю функцию и читает и записывает в глобальные переменные. Чтобы выполнить вычисления с выходом внешнего кода, модель должна считываться с глобальной переменной во время выполнения. | Вставка внешнего кода в диаграммы Stateflow (Embedded Coder) |
3 | Вы хотите включить внешние коды C or C++ в диаграмму Stateflow для симуляции и генерации кода. | Сконфигурируйте модель, которая содержит график, чтобы применить внешний код C or C++. |
|
4 | Вы быстро хотите встраивать вызов внешних кодов C or C++ в модель. Эффективность не является проблемой. | Вызовите код C or C++ с помощью coder.ceval функция из блока MATLAB Function. | |
5 | Приложение требует больше функций точки входа, чем обычно производит генератор кода - например, больше, , , и . Вы хотите максимальную гибкость для управления тем, какой код производит генератор кода. | Вручную запишите S-функцию и файл TLC. |
|
6 | Вы хотите симулировать и сгенерировать внешний код для приложения дискретного времени. Оптимизация сгенерированного кода необходима. Вы хотите простоты использования с умеренной гибкостью для управления тем, какой код производит генератор кода. У вас есть опыт программирования на C или C++, но вы предпочитаете генерировать файлы для добавления кода к модели. | Сгенерируйте S-функции и файлы TLC с помощью Legacy Code Tool. При необходимости доработайте сгенерированный код вручную в соответствии с требованиями приложения. (Если вы измените сгенерированный код, вы потеряете изменения, если регенерируете файлы S-функции и TLC.) Для простых алгоритмов, написанных на C, рассмотрите использование блока Simulink C Caller. | |
7 | Алгоритм должен смоделировать дискретную и непрерывную динамику состояний для симуляции и быстрого прототипирования. Внешний код требует интерфейса с фиксированной точкой. Опыт программирования ограничен. Вы хотите простоты использования с основной гибкостью для управления тем, какой код производит генератор кода для быстрого прототипирования. | Сгенерируйте файлы S-функции и TLC с помощью S-Function Builder. При необходимости доработайте сгенерированный код вручную в соответствии с требованиями приложения. (Если вы измените сгенерированный код, вы потеряете изменения, если регенерируете файлы S-функции и TLC.) |
Чтобы интегрировать внешний код С с сгенерированным кодом С++ или наоборот, измените язык внешнего кода, чтобы соответствовать выбору языка программирования для сгенерированного кода. Опции для соответствия языка программирования включают:
Запись или перезапись внешнего кода на языке выбора для сгенерированного кода.
Если вы генерируете код С++, а внешний код является кодом С, для каждой функции C создайте заголовочный файл, который прототипирует функцию. Использовать следующий формат:
#ifdef __cplusplus extern "C" { #endif int my_c_function_wrapper(); #ifdef __cplusplus } #endif
Прототип служит оберткой функции. Если ваш компилятор поддерживает код С++, значение __cplusplus
задан. Спецификация редактирования extern "C"
задает редактирование C без управления именами.
Если вы генерируете код С, а внешний код является кодом С++, включите extern "C"
спецификация редактирования в каждом .cpp
файл. Например, в следующем примере показан код С++ в файле my_func.cpp
:
extern "C" { int my_cpp_function() { ... } }
Чтобы интегрировать внешний код Фортран, запишите S-функцию и соответствующие файлы TLC.
См. Основы C/C + + S-Function, Реализация алгоритмов с использованием кода на языке Фортран, S-функций и генерации кода (Embedded Coder), и Примеры S-Function Фортран.
Чтобы интегрировать внешний код, который применяется только к библиотеке Stateflow графиков для генерации кода, для каждой библиотечной модели, которая вносит график в вашу главную модель, выполните эти шаги. Затем сгенерируйте код.
В редакторе Stateflow откройте диалоговое окно Model Параметры Конфигурации. Выберите Use local custom code settings (do not inherit from main model) параметра,
Модель библиотеки сохраняет свои собственные пользовательские настройки кода во время генерации кода.
Укажите свой пользовательский код в подпанелях.
Следуйте инструкциям в разделе «Задание относительных путей к пользовательскому коду» (Stateflow).
Если вы задали пользовательские настройки кода для симуляции, можно применить эти настройки к генерации кода. Чтобы избежать ввода одной и той же информации дважды, выберите Use the same custom code settings as Simulation Target.
Нажмите OK.
Завершив эти шаги для каждой модели библиотеки, сгенерируйте код.
Чтобы интегрировать внешний код, который применяется ко всем графикам для генерации кода:
Задайте пользовательские опции кода для генерации кода вашей основной модели.
В диалоговом окне Model Configuration Parameters выберите Code Generation > Custom Code.
В текстовых полях пользовательского кода укажите свой пользовательский код.
Следуйте инструкциям в разделе «Задание относительных путей к пользовательскому коду» (Stateflow).
Если вы задали пользовательские настройки кода для симуляции, можно применить эти настройки к генерации кода. Чтобы избежать ввода одной и той же информации дважды, выберите Use the same custom code settings as Simulation Target.
Сконфигурируйте генерацию кода для каждой библиотечной модели, которая вносит вклад в график вашей основной модели. В редакторе Stateflow откройте диалоговое окно Model Параметры Конфигурации. Очистить Use local custom code settings (do not inherit from main model) параметра. Библиотека графиков наследовать пользовательские настройки кода вашей основной модели. Нажмите OK.
Сгенерируйте код.
Вызовите существующие, внешние функции из симуляции или из сгенерированного кода с помощью Legacy Code Tool.
Узнать, как:
Оцените функцию C как часть симуляции модели Simulink ®.
Вызовите функцию C из кода, который вы генерируете из модели.
Для получения информации о модели примера смотрите Подготовьте модель алгоритма управления для генерации кода C (Embedded Coder).
Процесс замены
Откройте модель примера, rtwdemo_PCG_Eval_P4
.
Для многих приложений Модельно-ориентированное проектирование, в дополнение к моделям Simulink ®, проект включает набор существующих функций C, которые были протестированы и проверены. Можно интегрировать эти функции в модель Simulink ® и сгенерировать код, который использует функции.
В этом примере вы создаете пользовательский блок Simulink ®, который вызывает существующую функцию C. Затем вы включаете блок в модель и тестируете общую систему посредством симуляции модели в Simulink ®.
В модели примера можно заменить Интерполяционные блоки (интерполяционные таблицы) в ПИ-контроллеры вызовами существующей функции C. Функция определяется в файлах SimpleTable.c
и SimpleTable.h
.
Создайте блок, который вызывает функцию C
Чтобы задать вызов существующей функции C, используйте блок S-Function. Можно автоматизировать создание блока S-Function с помощью Legacy Code Tool. В инструменте вы сначала задаете интерфейс для существующей функции C. Затем инструмент использует этот интерфейс, чтобы создать блок S-Function.
Используйте Legacy Code Tool, чтобы создать блок S-Function для существующей функции C в SimpleTable.c
.
1. Создайте структуру, которая будет содержать определение интерфейса функции.
def = legacy_code('initialize')
Можно использовать структуру def
для определения интерфейса функции к существующему коду С
legacy_code('sfcn_cmex_generate',def)
legacy_code('compile',def)
legacy_code('slblock_generate',def)
Сгенерированный блок S-Function вызывает функцию C в SimpleTable.c
. Теперь можно использовать этот блок S-Function в моделях.
legacy_code('sfcn_tlc_generate',def)
Эта команда создает файл TLC, который является компонентом S-Функции, которая задает, как сгенерировать код для блока.
Валидация внешнего кода посредством симуляции
Когда вы интегрируете существующий код С в модель Simulink ®, проверьте сгенерированный блок S-Function .
Чтобы подтвердить замену блоков Lookup, сравните результаты симуляции, произведенные блоками Lookup, с результатами, полученными новым блоком S-Function.
Блок Sine Wave производит выходные значения из [-2: 2].
Входная область значений интерполяционной таблицы от [-1: 1].
Интерполяционная таблица выводит абсолютное значение входа.
Интерполяционная таблица отсекает выход на входе пределов.
2. Запустите модель валидации.
Рисунок показывает результаты валидации. Существующий код С и блок таблицы Simulink ® выдают одинаковые выходные значения .
Проверьте код С как часть модели Simulink ®
После проверки существующего кода функции C как автономного компонента проверьте S-функцию в модели. Чтобы завершить валидацию, используйте модель тестовой обвязки.
2. Запустите тестовую обвязку.
Результаты симуляции совпадают с золотыми значениями.
Вызов функции C из сгенерированного кода
Генератор кода использует файл TLC, чтобы обработать блок S-Function, как и любой другой блок. Генератор кода может реализовать складывание выражения с блоком S-Function, операцией, которая объединяет несколько расчеты в одно выходное вычисление.
2. Исследуйте сгенерированный код в PI_Control_Reusable.c
.
Сгенерированный код теперь вызывает SimpleTable
Функция C.
Рисунки показывают сгенерированный код до и после интегрирования кода С. Перед интегрированием код вызывает сгенерированную стандартную программу поиска. После интегрирования сгенерированный код вызывает функцию C SimpleTable
.