Можно настроить код, создаваемый генератором кода для модели, указав внешний код с пользовательскими блоками кода или параметрами конфигурации модели.
Поместите код в начало и конец созданного кода для корневой модели.
Поместите объявление, тело и код выхода в сгенерированный код функции для блоков в корневой модели или невиртуальных подсистемах.
Функции, которые можно дополнить внешним кодом, зависят от функций, создаваемых генератором кода для блоков в модели. Например, если модель или атомарная подсистема включает блоки с состояниями, можно указать код для функции отключения. Аналогично, если вам нужен код для блока для сохранения данных, свободной памяти или сброса целевого оборудования, укажите код для функции завершения. Дополнительные сведения см. в разделе Методы блокировки целевых файлов.
Чтобы поместить внешний код C или C++ в определенные места в коде, создаваемом генератором кода для корневых моделей и подсистем, выполните итерацию задач, перечисленных в этой таблице.
| Задача | Действие | Дополнительные сведения |
|---|---|---|
| 1 | Если требуется интегрировать внешний код C с сгенерированным кодом C++ или наоборот, измените язык внешнего кода в соответствии с выбором языка для сгенерированного кода. | Изменение языка программирования внешнего кода в соответствии с сгенерированным кодом |
| 2 | Просмотрите оценку внешних признаков кода и требований к интеграции. | Выбор потока операций интеграции внешнего кода |
| 3 | При необходимости переписайте код на языке C или C++. | |
| 4 | Выберите подход интеграции для добавления внешнего кода в модель Simulink. | Выбор интеграционного подхода |
| 5 | Определите представление данных модели для генерации кода. | Обмен данными между внешним кодом C/C + + и моделью Simulink или сгенерированным кодом |
| 6 | Сконфигурируйте модель для создания кода. | Создание кода, соответствующего внешнему коду и конфигурации модели |
| 7 | Создание кода и отчета о создании кода. | Создание кода |
| 8 | Просмотрите сгенерированный интерфейс кода и метрики статического кода. | Анализ сгенерированного интерфейса кода и статических метрик кода |
| 9 | Создайте исполняемую программу из модели. | Создание интегрированного кода в среде Simulink |
| 10 | Убедитесь, что исполняемая программа работает так, как ожидалось. | Тестирование числовой эквивалентности и профилирование выполнения кода |
В среде моделирования Simulink ® доступны два подхода для размещения внешнего кода C или C++ в разделах кода, которые создает генератор кода:
Добавление блоков из библиотеки пользовательского кода в корневую модель или атомарную подсистему.
Задайте параметры конфигурации модели на панели Создание кода (Code Generation) > Пользовательский код (Custom Code).
В следующей таблице сравниваются два подхода. Выберите подход, который лучше всего соответствует требованиям интеграции. Дополнительные сведения о применении каждого подхода см. в разделах Интеграция внешнего кода с помощью пользовательских блоков кода и Интеграция внешнего кода с помощью параметров конфигурации модели.
| Требование | Блоки | Параметры конфигурации модели |
|---|---|---|
| Включение представления внешнего кода в холст моделирования | ✓ | |
| Размещение кода в функциях, созданных для корневых моделей | ✓ | ✓ |
| Размещение кода в функциях, созданных для атомных подсистем | ✓ | |
| Сохранение размещения кода в наборе конфигурации модели | ✓ | |
| Размещение кода в верхней и нижней частях заголовка и исходных файлов, созданных для модели | ✓ | ✓ |
Поместите код в разделы объявления, выполнения и выхода SystemInitialize иSystemTerminate функции, создаваемые генератором кода | ✓ | ✓ |
Поместите код в разделы объявления, выполнения и выхода SystemStart, SystemEnable, SystemDisable, SystemOutputs, SystemUpdate, илиSystemDerivatives функции, создаваемые генератором кода | ✓ | |
| Добавление определений макросов препроцессора в созданный код | ✓ | |
| Использовать пользовательские параметры кода, указанные для цели моделирования | ✓ | |
| Настройка библиотечной модели для использования пользовательских параметров кода родительской модели, с которой связана библиотека | ✓ |
Библиотека блоков пользовательского кода содержит блоки, которые можно использовать для размещения внешнего кода C или C++ в определенных местоположениях и функциях в коде, создаваемом генератором кода. Библиотека состоит из 10 блоков, добавляющих код в заголовок модели (model.h) и источник (model.c или model.cpp) файлы, которые создает генератор кода.
Блоки Заголовок модели (Model Header) и Источник модели (Model Source) добавляют внешний код в верхней и нижней части заголовков и исходных файлов, создаваемых генератором кода для корневой модели. В этих блоках отображаются два текстовых поля, в которые можно ввести или вставить код. В одном поле указывается код, который требуется поместить в верхней части созданного заголовка или исходного файла. Во втором поле указывается код, который требуется поместить в нижней части файла.
Остальные блоки добавляют внешний код к функциям, создаваемым генератором кода для корневой модели или атомной подсистемы, содержащей блок. В блоках отображаются текстовые поля, в которые можно ввести или вставить код, настраивающий функции, создаваемые генератором кода. Текстовые поля соответствуют разделам описания, выполнения и выхода кода для данной функции.
| Настройка кода | Использовать этот блок |
|---|---|
| Вычисляет непрерывные состояния | Производные системы |
| Отключает состояние | Отключение системы |
| Включает состояние | Включение системы |
| Сброс состояния | Инициализация системы |
| Производит выходные данные | Системные выходы |
| Выполняется один раз | Запуск системы |
| Сохраняет данные, освобождает память, сбрасывает целевое оборудование | Завершение работы системы |
| Требуется обновление на каждом основном шаге времени | Обновление системы |
Блок и его местоположение в модели определяет, где генератор кода размещает внешний код. Например, если блок «Системные выходы» находится на уровне корневой модели, генератор кода помещает код в модель Outputs функция. Если блок находится в запущенной или включенной подсистеме, генератор кода помещает код в подсистему Outputs функция.
Если генератору кода не требуется создавать функцию, соответствующую блоку пользовательского кода, включенному в модель, он выполняет одно из следующих действий.
Пропускает внешний код, указанный в блоке «Пользовательский код».
Возвращает ошибку, указывающую, что модель не включает соответствующий блок. В этом случае удалите блок «Пользовательский код» из модели.
Дополнительные сведения см. в разделе Методы блокировки целевых файлов.
Примечание
Чтобы избежать потенциального несоответствия между результатами моделирования и генерации кода, не используйте пользовательские блоки кода для чтения и записи в глобальные данные Simulink (сигналы, состояния и параметры блоков). Вместо этого используйте соответствующий шаблон моделирования (например, блоки чтения хранилища данных, записи хранилища данных, чтения состояния и записи состояния).
Чтобы добавить в модель блоки библиотеки пользовательского кода, выполните следующие действия.
В браузере библиотеки Simulink откройте библиотеку блоков «Пользовательский код».
Перетащите нужные блоки в модель или подсистему. Перетащите блоки «Заголовок модели» и «Источник модели» только в корневые модели. Перетащите функциональные блоки пользовательского кода в корневые модели или атомарные подсистемы.
В качестве ссылочных моделей можно использовать модели, содержащие блоки пользовательского кода. Генератор кода игнорирует блоки при создании кода для цели моделирования. При создании кода для цели генерации кода генератор кода включает и компилирует пользовательский код.
В этом примере показано, как использовать блок «Запуск системы» для размещения внешнего кода C в коде, создаваемом генератором кода для модели с дискретным фильтром.
Создайте следующую модель.

Сконфигурируйте модель для создания кода.
Дважды щелкните на блоке «Пуск системы».
В диалоговом окне параметров блока в поле System Start Function Declaration Code введите следующий код:
unsigned int *ptr = 0xFFEE;
В поле Код выполнения функции запуска системы введите следующий код:
/* Initialize hardware */ *ptr = 0;
Нажмите кнопку ОК.
Создание кода и отчета о создании кода.
Просмотр созданного файл. Поиск строки 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;
}
}
Другой пример см. в разделе Интеграция внешнего кода C в сгенерированный код с помощью пользовательских блоков кода и параметров конфигурации модели.
Параметры конфигурации модели обеспечивают способ размещения внешнего кода C или C++ в определенных местоположениях и функциях в коде, создаваемом генератором кода.
| Кому | Выбрать |
|---|---|
Вставка внешнего кода в верхней части созданного или файл | Исходный файл и введите внешний код для вставки. При создании кода подсистемы в отдельные файлы этот код не имеет доступа к внешнему коду, указанному с помощью параметра «Исходный файл». Например, если в качестве параметра «Исходный файл» указан файл включения, генератор кода вставляет |
Вставка внешнего кода в верхней части созданного файл | Файл заголовка и введите внешний код для вставки. |
Вставка внешнего кода в функцию инициализации модели в или файл | Инициализируйте функцию и введите внешний код для вставки. |
Вставка внешнего кода в функцию завершения модели в или файл | Завершите функцию и введите внешний код для вставки. Также выберите обязательный параметр Terminate function на панели Interface. |
| Добавление определений макросов препроцессора | Определяет и вводит разделенный пробелами список определений макросов препроцессора для добавления в созданный код. Список может включать простые определения (например, -DEF1и определения со значением (например, -DDEF2=1). Определения могут пропускать -D (например, -DFOO=1 и FOO=1 эквивалентны). Если определение включает -D, блок инструментов может переопределить флаг, если в блоке инструментов используется другой флаг для определений. |
| Использовать те же настройки пользовательских параметров кода, что и настройки, заданные для моделирования функциональных блоков MATLAB, диаграмм Stateflow ® и блоков таблицы истинности | Использовать те же параметры пользовательского кода, что и для цели моделирования Этот параметр ссылается на панель Цель моделирования (Simulation Target) в диалоговом окне Параметры конфигурации (Configuration Parameters). |
| Разрешить модели библиотеки использовать пользовательские параметры кода, уникальные для родительской модели, с которой связана библиотека | Использовать локальные пользовательские настройки кода (не наследовать от основной модели) Этот параметр доступен только для библиотечных моделей, содержащих функциональные блоки MATLAB, диаграммы потока состояний или блоки таблицы истинности. |
Чтобы включить файл заголовка во внешний файл заголовка, добавьте #ifndef код. Использование этого кода позволяет избежать множественных включений. Например, в rtwtypes.h, следующее #include добавляются охранники:
#ifndef RTW_HEADER_rtwtypes_h_ #define RTW_HEADER_rtwtypes_h_ ... #endif /* RTW_HEADER_rtwtypes_h_ */
Дополнительные сведения о добавлении имен файлов и расположений заголовков, исходных файлов и файлов общей библиотеки в процесс построения см. в разделе Создание интегрированного кода в среде Simulink.
Примечание
Генератор кода включает внешний код, который включается в набор конфигурации при создании кода для моделирования программного обеспечения в цикле (SIL) и процессора в цикле (PIL). Однако генератор кода игнорирует внешний код, который включается в набор конфигурации при создании кода с помощью S-функции, быстрого моделирования или целевого файла системы моделирования.
Дополнительные сведения о параметрах пользовательского кода см. в разделе Параметры конфигурации модели: пользовательский код создания кода. Пример см. в разделе Интеграция внешнего кода C в сгенерированный код с помощью пользовательских блоков кода и параметров конфигурации модели.
В этом примере показано, как поместить внешний код в созданный код с помощью пользовательских блоков кода и параметров конфигурации модели.
1. Открытие модели rtwdemo_slcustcode.
open_system('rtwdemo_slcustcode')

2. Откройте приложение Simulink Coder или Embedded Coder.
3. Откройте диалоговое окно Параметры конфигурации модели (Model Configuration Parameters) и перейдите на панель Пользовательский код (Custom Code).
4. Проверьте настройки параметров конфигурации модели Source file и Initialize function.
Исходный файл указывает комментарий и задает переменную GLOBAL_INT2 до -1.
Функция инициализации инициализирует переменную GLOBAL_INT2 на 1.
5. Закройте диалоговое окно.
6. Дважды щелкните блок «Источник модели». Параметр блока «Верх источника модели» указывает, что генератор кода объявляет переменную GLOBAL_INT1 и установите значение 0 в верхней части созданного файла rtwdemo_slcustcode.c.
7. Откройте запускаемую подсистему Amplifier. Подсистема включает в себя блок системных выходов. Генератор кода помещает код, указанный в этом блоке, в созданный код для ближайшей родительской атомной подсистемы. В этом случае генератор кода помещает внешний код в созданный код для Amplifier подсистема. Внешний код:
Объявляет переменную указателя *intPtr и инициализирует его значением переменной GLOBAL_INT1.
Задает переменной указателя значение -1 во время выполнения.
Сбрасывает переменную указателя на 0 перед выходом.
8. Создание кода и отчета о создании кода.
9. Проверьте код в созданном исходном файле rtwdemo_slcustcode.c. В верхней части файла, после #include , вы находите следующий код объявления. В примере указывается первое объявление с параметром конфигурации Source file и второе объявление с блоком Model Source.
int_T GLOBAL_INT2 = -1;
int_T GLOBAL_INT1 = 0;
Функция вывода для Amplifier подсистема включает в себя следующий код, который показывает внешний код, интегрированный с сгенерированным кодом, который применяет усиление. Пример задает три строки кода для переменной указателя с блоком «Системные выходы» в Amplifier подсистема.
int_T *intPtr = &GLOBAL_INT1;
*intPtr = -1;
rtwdemo_slcustcode_Y.Output = rtwdemo_slcustcode_U.Input << 1;
*intPtr = 0;
Следующее назначение появляется в функции начальной точки инициализации модели. В примере это назначение указывается с помощью параметра конфигурации Initialize function.
GLOBAL_INT2 = 1;