Можно настроить код, который генератор кода производит для модели, задав внешний код с пользовательскими блоками кода или параметрами конфигурации модели.
Поместите код в начало и конец сгенерированного кода для корневой модели.
Поместите объявление, тело и выходной код в сгенерированный код функции для блоков в корневой модели или невиртуальных подсистемах.
Функции, которые можно дополнить внешним кодом, зависят от функций, которые производит генератор кода для блоков, которые находятся в модели. Например, если подсистема модели или атомарная подсистема включает блоки, которые имеют состояния, можно задать код для функции disable. Точно так же, если вам нужен код для блока, чтобы сохранить данные, свободную память или сбросить целевой компьютер, задайте код для функции terminate. Для получения дополнительной информации смотрите Методы блочного файла целевого файла.
Чтобы поместить внешние коды C or C++ в определенные местоположения в коде, который генератор кода производит для корневых моделей и подсистем, повторите задачи, перечисленные в этой таблице.
Задача | Действие | Дополнительная информация |
---|---|---|
1 | Если вы хотите интегрировать внешний код С с сгенерированным кодом С++ или наоборот, измените язык внешнего кода так, чтобы он совпадал с языком, выбранным для сгенерированного кода. | Измените язык программирования внешнего кода, чтобы соответствовать сгенерированному коду |
2 | Проверьте оценку характеристик внешнего кода и требований к интегрированию. | Выберите рабочий процесс интегрирования внешнего кода (Embedded Coder) |
3 | При необходимости перепишите код на C или C++. | |
4 | Выберите интеграционный подход, чтобы добавить внешний код к модели Simulink. | Выбор Интегрирования подхода (Embedded Coder) |
5 | Задайте представление данных моделей для генерации кода. | Обмен данными между внешним кодом C/C + + и моделью Simulink или сгенерированным кодом (Embedded Coder) |
6 | Сконфигурируйте модель для генерации кода. | Сгенерируйте код, который соответствует внешнему виду внешнего кода ( Embedded Coder) и строения модели (Embedded Coder) |
7 | Сгенерируйте код и отчет генерации кода. | Генерация кода (Embedded Coder) |
8 | Проверьте сгенерированный интерфейс кода и статические метрики кода. | Анализируйте сгенерированный код (Embedded Coder) и статические метрики кода (Embedded Coder) |
9 | Создайте исполняемую программу из модели. | Создайте интегрированный код в окружение Simulink (Embedded Coder) |
10 | Проверьте, что исполняемая программа работает должным образом. | Численная проверка эквивалентности (Embedded Coder) и профилирование выполнения кода (Embedded Coder) |
В Simulink® Окружения моделирования доступны два подхода для размещения внешних кодов C or C++ в разделах кода, которые производит генератор кода:
Добавьте блоки из библиотеки Пользовательского кода в корневую подсистему модели или атомарную подсистему.
Установите параметры конфигурации модели на панели Code Generation > Custom Code.
В следующей таблице сравниваются два подхода. Выберите подход, который наилучшим образом соответствует вашим требованиям к интегрированию. Для получения дополнительной информации о том, как применить каждый подход, смотрите Интегрирация Внешнего Кода с Помощью Пользовательских Блоков Кода (Embedded Coder) и Интеграция Внешнего Кода с Использованием Параметров Конфигурации Модели (Embedded Coder).
Требование | Блоки | Параметры конфигурации модели |
---|---|---|
Включите представление внешнего кода в полотно моделирования | ✓ | |
Поместите код в функции, сгенерированные для корневых моделей | ✓ | ✓ |
Поместите код в функции, сгенерированные для атомарных подсистем | ✓ | |
Сохраните размещение кода в набор конфигурации модели | ✓ | |
Поместите код в верхней и нижней части заголовка и исходных файлов, сгенерированных для модели | ✓ | ✓ |
Поместите код в разделы объявления, выполнения и выхода SystemInitialize иSystemTerminate функции, которые создает генератор кода | ✓ | ✓ |
Поместите код в разделы объявления, выполнения и выхода SystemStart , SystemEnable , SystemDisable , SystemOutputs , SystemUpdate , илиSystemDerivatives функции, которые создает генератор кода | ✓ | |
Добавьте определения макросов препроцессора к сгенерированному коду | ✓ | |
Используйте пользовательские настройки кода, которые заданы для цели симуляции | ✓ | |
Сконфигурируйте модель библиотеки, чтобы использовать пользовательские настройки кода родительской модели, с которой связана библиотека | ✓ |
Библиотека блоков Custom Code содержит блоки, которые можно использовать, чтобы поместить внешний код C or C++ в определенные местоположения и функции в коде, который производит генератор кода. Библиотека состоит из 10 блоков, которые добавляют ваш код в заголовок модели (model
.h
) и источник (model
.c
или model
.cpp
) файлы, которые производит генератор кода.
Блоки Model Header и Model Source добавляют внешний код в верхней и нижней части заголовка и исходных файлов, которые генератор кода производит для корневой модели. Эти блоки отображают два текстовых поля, в которые можно вводить или вставлять код. В одном поле указывается код, который необходимо разместить в верхней части сгенерированного заголовка или исходного файла. Второе поле задает код, который необходимо поместить в нижней части файла.
Оставшиеся блоки добавьте внешний код к функциям, которые производит генератор кода для корневой подсистемы модели или атомарной подсистемы, которая содержит блок. Блоки отображают текстовые поля, в которые можно вводить или вставлять код, который настраивает функции, которые производит генератор кода. Текстовые поля соответствуют разделам кода объявления, выполнения и выхода для данной функции.
Как настроить код, который | Использовать этот блок |
---|---|
Вычисляет непрерывные состояния | System Derivatives |
Отключает состояние | System Disable |
Включает состояние | System Enable |
Сбрасывает состояние | System Initialize |
Формирует выход | System Outputs |
Выполняется один раз | System Start |
Сохраняет данные, свободную память, сбрасывает целевой компьютер | System Terminate |
Требуется обновление на каждом крупном временном шаге | System Update |
Блок и его местоположение в модели определяет, где генератор кода помещает внешний код. Например, если блок System Outputs находится на уровне корневой модели, генератор кода помещает код в модель Outputs
функция. Если блок находится в срабатывающей или включенной подсистеме, генератор кода помещает код в подсистему Outputs
функция.
Если генератору кода не нужно генерировать функцию, которая соответствует блоку Custom Code, который вы включаете в модель, генератор кода делает одно из следующего:
Опускает внешний код, указанный в блоке Custom Code.
Возвращает ошибку, указывающую, что модель не включает соответствующий блок. В этом случае удалите блок Custom Code из модели.
Для получения дополнительной информации смотрите Методы блочного файла целевого файла.
Примечание
Чтобы избежать потенциального несоответствия между результатами генерации симуляции и кода, не используйте пользовательские блоки кода для чтения и записи в глобальные данные Simulink (сигналы, состояния и параметры блоков). Вместо этого используйте правильный шаблон моделирования (например, Data Store Read, Data Store Write, State Reader и блоки State Writer.)
Чтобы добавить библиотечные блоки Пользовательского кода к модели:
В браузере библиотеки Simulink откройте библиотеку блоков Пользовательский код.
Перетащите блоки, которые вы хотите, в модель или подсистему. Перетащите Model Header и Model Source блоки только в корневые модели. Перетащите функциональные блоки Custom Code в корневые модели или атомарные подсистемы.
Можно использовать модели, которые содержат блоки Custom Code, как модели-ссылки. Генератор кода игнорирует блоки при создании кода для цели симуляции. При производстве кода для цели генерации кода генератор кода включает и компилирует пользовательский код.
В этом примере показано, как использовать блок System Start для размещения внешнего кода С в коде, который генерирует генератор кода для модели, которая включает дискретный фильтр.
Создайте следующую модель.
Сконфигурируйте модель для генерации кода.
Дважды кликните System Start блок.
В диалоговом окне параметров блоков, в поле System Start Function Declaration Code, введите этот код:
unsigned int *ptr = 0xFFEE;
В поле System Start Function Execution Code введите этот код:
/* Initialize hardware */ *ptr = 0;
Нажмите OK.
Сгенерируйте код и отчет генерации кода.
Просмотрите сгенерированные
файл. Поиск строки model
.cstart function
. Необходимо найти следующий код, который включает внешний код, введенный в шагах 4 и 5.
{ { /* user code (Start function Header) */ /* System '<Root>' */ unsigned int *ptr = 0xFFEE; /* user code (Start function Body) */ /* System '<Root>' */ /* Initialize hardware */ *ptr = 0; } }
Для другого примера смотрите Интеграция внешнего кода С в сгенерированный код при помощи пользовательских блоков кода и параметров конфигурации модели (Embedded Coder).
Параметры конфигурации модели обеспечивают способ поместить внешние коды C or C++ в определенные местоположения и функции в коде, который производит генератор кода.
Кому | Выбрать |
---|---|
Вставьте внешний код в верхней части сгенерированного или файл | Source file и введите внешний код для вставки. Если вы генерируете код подсистемы в отдельные файлы, этот код не имеет доступа к внешнему коду, который вы задаете с параметром Source file. Например, если вы задаете файл include как Source file настройку, генератор кода вставляет |
Вставьте внешний код в верхней части сгенерированного файл | Header file и введите внешний код для вставки. |
Вставьте внешний код внутрь функции инициализации модели в или файл | Initialize function и введите внешний код для вставки. |
Вставьте внешний код внутрь функции завершения модели в или файл | Terminate function и введите внешний код для вставки. Также выберите параметр Terminate function required на панели Interface. |
Добавьте определения макросов препроцессора | Defines и введите разделенный пробелом список определений макросов препроцессора, чтобы добавить к сгенерированному коду. Список может включать простые определения (для примера, -DEF1 ) и определения со значением (для примера, -DDEF2=1 ). Определения могут опускать -D (например, -DFOO=1 и FOO=1 эквивалентны). Если определение включает -D , набор инструментальных средств может переопределить флаг, если набор инструментальных средств использует другой флаг для определения. |
Используйте те же пользовательские настройки параметров кода, что и настройки, заданные для симуляции блоков MATLAB Function, Stateflow® графики и блоки таблицы истинности | Use the same custom code settings as Simulation Target Этот параметр относится к панели Simulation Target в диалоговом окне Параметров конфигурации. |
Включите модель библиотеки, чтобы использовать пользовательские параметры кода, уникальные для родительской модели, с которой связана библиотека | Use local custom code settings (do not inherit from main model) Этот параметр доступен только для библиотечных моделей, которые содержат блоки MATLAB Function, диаграммы Stateflow или блоки Truth Table. |
Чтобы включить заголовочный файл во внешний заголовочный файл, добавьте #ifndef
код. Использование этого кода избегает нескольких включений. Для примера, в rtwtypes.h
, следующая #include
охрана добавлена:
#ifndef RTW_HEADER_rtwtypes_h_ #define RTW_HEADER_rtwtypes_h_ ... #endif /* RTW_HEADER_rtwtypes_h_ */
Для получения дополнительной информации о том, как добавить имена файлов и местоположения заголовков, исходных и общих библиотечных файлов к процессу сборки, смотрите Сборка Интегрированного Кода в Окружение Simulink (Embedded Coder).
Примечание
Генератор кода включает внешний код, который вы включаете в конфигурацию модели при генерации кода для симуляций цикл (SIL) и цикл (PIL). Однако генератор кода игнорирует внешний код, который вы включаете в конфигурацию модели при создании кода с S-функцией, быстрой симуляцией или целевым файлом системы симуляции.
Для получения дополнительной информации о параметрах Custom Code смотрите Параметры конфигурации модели: Пользовательский код генерации кода. Для получения примера смотрите Интеграция внешних Кодов С в сгенерированный код при помощи пользовательских блоков кода и параметров конфигурации модели (Embedded Coder).
В этом примере показано, как поместить внешний код в сгенерированный код с помощью пользовательских блоков кода и параметров конфигурации модели.
1. Откройте модель rtwdemo_slcustcode
.
open_system('rtwdemo_slcustcode')
2. Откройте приложение Simulink Coder или Embedded Coder.
3. Откройте диалоговое окно Model Параметры Конфигурации и перейдите к панели Custom Code.
4. Исследуйте настройки параметров конфигурации модели Исходный файл и функцию Initialize.
Исходный файл задает комментарий и устанавливает переменную GLOBAL_INT2
по -1.
Функция Initialize инициализирует переменную GLOBAL_INT2
по 1.
5. Закройте диалоговое окно.
6. Дважды кликните Исходный блок модели. Параметры блоков Top of Model Source задают, что генератор кода объявляет переменную GLOBAL_INT1
и установите его равным 0 в верхней части сгенерированного файла rtwdemo_slcustcode.c
.
7. Откройте триггируемую подсистему Amplifier
. Подсистема включает блок System Outputs. Генератор кода помещает код, который вы задаете в этом блоке, в сгенерированный код для ближайшей родительской атомарной подсистемы. В этом случае генератор кода помещает внешний код в сгенерированный код для Amplifier
подсистема. Внешний код:
Объявляет переменную указателя *intPtr
и инициализирует его со значением переменной GLOBAL_INT1
.
Устанавливает переменную указателя на -1 во время выполнения.
Устанавливает значение переменной указателя 0 перед выходом.
8. Сгенерируйте код и отчет генерации кода.
9. Исследуйте код в сгенерированном исходном файле rtwdemo_slcustcode.c
. В верхней части файла, после #include
операторы, вы находите следующий код объявления. Пример задает первое объявление с параметром конфигурации исходного файла и второе объявление с блоком Model Source.
int_T GLOBAL_INT2 = -1;
int_T GLOBAL_INT1 = 0;
Область Выходной функции для Amplifier
подсистема включает следующий код, который показывает внешний код, интегрированный с сгенерированным кодом, который применяет коэффициент усиления. Пример задает три строки кода для переменной указателя с блоком System Outputs в Amplifier
подсистема.
int_T *intPtr = &GLOBAL_INT1;
*intPtr = -1;
rtwdemo_slcustcode_Y.Output = rtwdemo_slcustcode_U.Input << 1;
*intPtr = 0;
Следующее назначение появляется в модели initialize функции точки входа. Пример задает это назначение с помощью параметра конфигурации Initialize function.
GLOBAL_INT2 = 1;