Повторное использование кода предлагает бизнес и технологические преимущества. С бизнес-точки зрения повторное использование кода экономит время и ресурсы. С технологической точки зрения повторное использование кода продвигает непротиворечивость и уменьшает требования к памяти. Другие факторы включают:
Модульное исполнение приложения
Многократное использование оптимизированного алгоритма
Взаимодействие через интерфейс с предопределенным набором данных
Разработка вариантов приложения
Примеры допускающего повторное использование аппаратно-независимого алгоритмического кода, чтобы рассмотреть импорт в среду Simulink® для симуляции и генерации кода включают:
Служебные функции
Интерполяционные таблицы
Цифровые фильтры
Специализированные интеграторы
Управляющие модули пропорциональной интегральной производной (PID)
Чтобы вызвать допускающий повторное использование внешний код алгоритма для симуляции и генерации кода, выполните итерации через задачи, перечисленные в этой таблице.
Задача | Действие | Больше информации |
---|---|---|
1 | Рассмотрите свою оценку внешних характеристик кода и требований интегрирования. | Выберите External Code Integration Workflow (Embedded Coder) |
2 | На основе языка программирования внешнего кода выберите подход интегрирования, чтобы добавить внешний код в модель Simulink. | Выберите Integration Approach (Embedded Coder) |
3 | Проверьте поведение алгоритма и производительность путем симуляции модели. | Симуляция (Simulink) |
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 или кода С++ (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®. | Используйте программное обеспечение, чтобы сгенерировать код С. Затем вызовите тот сгенерированный код как внешний код С. |
|
6 | У вас есть C или опыт программирования на C++, и внешний код MATLAB компактен и в основном использует построения C++ или C. | Вручную преобразуйте код MATLAB в C или Код С++. Выберите подход интегрирования для C или Кода С++. | Подходы интегрирования для внешнего C или кода С++ (Embedded Coder) |
7 | Разделы внешнего кода MATLAB сопоставляют со встроенными блоками. | Разработайте алгоритм в контексте модели, с помощью применимых встроенных блоков. |
Чтобы встроить внешний код MATLAB в блок MATLAB function или сгенерировать C или Код С++ из кода MATLAB с программным обеспечением MATLAB Coder, код MATLAB должен использовать функции и классы, поддержанные для генерации кода C/C++.
При большинстве обстоятельств можно интегрировать внешний код, написанный в C или C++ в окружение Simulink путем генерации S-функций и файлов TLC с Legacy Code Tool. Этот инструмент использует спецификации, которые вы предоставляете как код MATLAB, чтобы преобразовать существующие функции MATLAB в S-функции MEX C, которые можно включать в модели Simulink и вызов от сгенерированного кода. Для получения дополнительной информации смотрите, Интегрируют Унаследованный код (Simulink) и Вызовы Импорта Внешнего Кода в Сгенерированный код с Legacy Code Tool (Embedded Coder).
По сравнению с альтернативными подходами Legacy Code Tool является самым оптимальным выбором для генерации кода, оптимизировал достаточно для встраиваемых систем. Рассмотрите альтернативные подходы, если один или несколько следующих условий существует:
Внешний код использует глобальные переменные, чтобы обмениваться данными.
Программирование опыта ограничивается.
Алгоритм должен смоделировать дискретную и непрерывную динамику состояния.
Вы хотите включать интегрированный внешний код в диаграмму Stateflow.
Внешний код требует интерфейса фиксированной точки.
Вы хотите максимальную гибкость для управления, какой код генератор кода производит.
Вы быстро хотите встроить вызов внешнего кода в вызове функции coder.ceval
, которая встраивается в блок MATLAB function, и производительность не является проблемой.
Эта схема и таблица помогают вам выбрать лучший подход интегрирования на основе своих требований интегрирования.
Условие или требование | Действие | Больше информации | |
---|---|---|---|
1 | Вы хотите интегрировать внешний код С со сгенерированным Кодом С++ или с другой стороны | Совпадайте с выбором языка для сгенерированного кода путем изменения языка внешнего кода. | Измените язык программирования внешнего кода, чтобы совпадать со сгенерированным кодом (Embedded Coder) |
2 | Ваш алгоритм включает логику проекта, которая основана на машине состояний и блок-схемах. Или, функция, которую вы хотите интегрировать, должна обмениваться данными с моделью при помощи глобальных переменных. Функция задает глобальные переменные и использует их, чтобы записать, что вывод вместо того, чтобы возвратить значение (возвращается) или запись вывода к аргументу. | Добавьте диаграмму Stateflow в модель. Вызовите внешний код из графика, с помощью C как язык действия. В графике запишите код, который вызывает внешнюю функцию и читает из и пишет в глобальные переменные. Чтобы выполнить вычисления с выводом внешнего кода, модель должна читать из глобальной переменной во время выполнения. | Введите внешний код в диаграммы Stateflow (Embedded Coder) |
3 | Вы хотите включать внешний C или Код С++ в диаграмме Stateflow для симуляции и генерации кода. | Сконфигурируйте модель, которая содержит график, чтобы применить внешний C или Код С++. |
|
4 | Вы быстро хотите встроить вызов внешнего C или Кода С++ в модели. Производительность не является проблемой. | Вызовите 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-функции. При необходимости совершенствуйте сгенерированный код вручную, чтобы соответствовать требованиям к приложению. (Если вы изменяете сгенерированный код, вы теряете изменения, если вы регенерируете 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.
Смотрите Основы S-функции C/C++ (Simulink), Интегрируйте код на языке Фортран (Simulink), S-функции и Генерация кода (Embedded Coder), andFortran Примеры S-функции (Simulink).
Чтобы интегрировать внешний код, который применяется только к графикам библиотеки Stateflow для генерации кода для каждой модели библиотеки, которая вносит график в вашу основную модель, завершите эти шаги. Затем сгенерируйте код.
В редакторе Stateflow выберите Code> C/C++ Code> Code Generation Options.
В диалоговом окне Model Configuration Parameters выберите Code Generation> 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 выберите Code> C/C++ Code> Code Generation Options.
В панели Code Generation снимите флажок Use local custom code settings (do not inherit from main model).
Графики библиотеки наследовали настройки пользовательского кода вашей основной модели.
Нажмите OK.
Сгенерируйте код.
Вызовите существующие, внешние функции от симуляции или от сгенерированного кода при помощи Legacy Code Tool.
Узнать, как к:
Выполните функцию C как часть симуляции модели Simulink®.
Вызовите функцию C из кода, который вы генерируете из модели.
Для получения информации о модели в качестве примера и других примерах в этом ряду, смотрите, Генерируют код С от Алгоритма управления для Встраиваемой системы (Embedded Coder).
Заменяющий процесс
Откройте модель в качестве примера, rtwdemo_PCG_Eval_P4
.
Для многих приложений Модельно-ориентированного проектирования, в дополнение к моделям Simulink®, проект включает набор существующих функций C, которые были протестированы и подтверждены. Можно интегрировать эти функции в модель Simulink® и сгенерировать код, который использует функции.
В этом примере вы создаете пользовательский блок Simulink®, который вызывает существующую функцию C. Вы затем включаете блок в модель и тестируете полную систему посредством симуляции модели в Simulink®.
В модели в качестве примера можно заменить блоки Поиска (интерполяционные таблицы) в контроллерах PI с вызовами существующей функции 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.
Чтобы подтвердить замену блоков Поиска, сравните результаты симуляции, произведенные блоками Поиска с результатами, приведенными новым Блоком 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
.
Для следующего примера в этом ряду смотрите Сборку Интегрированный Код Вне окружения Simulink (Embedded Coder).