Можно настроить код, который генератор кода производит для модели путем определения внешнего кода с блоками пользовательского кода или параметрами конфигурации модели.
Поместите код в начале и конце сгенерированного кода для корневой модели.
Поместите объявление, тело и код выхода в сгенерированном функциональном коде для блоков в корневых или невиртуальных подсистемах модели.
Функции, которые можно увеличить с внешним кодом, зависят от функций, которые генератор кода производит для блоков, которые находятся в модели. Например, если подсистема модели или атомарная подсистема включают блоки, которые имеют состояния, можно задать код для запрещать функции. Аналогично, если вам нужен код для блока, чтобы сохранить данные, свободную память, или сбросить целевой компьютер, задайте код для оконечной функции. Для получения дополнительной информации см. Методы Конечного файла Блока.
Чтобы поместить внешний код C or C++ в определенных местоположениях в коде, который генератор кода производит для корневых моделей и подсистем, выполните итерации через задачи, перечисленные в этой таблице.
Задача | Действие | Больше информации |
---|---|---|
1 | Если вы хотите интегрировать внешний код С со сгенерированным Кодом С++ или с другой стороны, измените язык внешнего кода, чтобы совпадать с выбором языка для сгенерированного кода. | Измените язык программирования внешнего кода, чтобы совпадать со сгенерированным кодом |
2 | Рассмотрите свою оценку внешних характеристик кода и требований интегрирования. | Выберите внешний рабочий процесс интеграции кода |
3 | При необходимости перепишите код в C или C++. | |
4 | Выберите подход интегрирования, чтобы добавить внешний код в модель Simulink. | Выберите подход интегрирования |
5 | Задайте представление данных модели для генерации кода. | Обменивайтесь Данными Между Внешним Кодом C/C++ и Типовым кодексом Simulink или Сгенерированным кодом |
6 | Сконфигурируйте модель для генерации кода. | Сгенерируйте код, который совпадает с внешним видом внешнего кода и настройки модели |
7 | Сгенерируйте код и отчет генерации кода. | Генерация кода |
8 | Рассмотрите интерфейс сгенерированного кода и статические метрики кода. | Анализируйте сгенерированный код интерфейсные и статические метрики кода |
9 | Создайте исполняемую программу из модели. | Создайте интегрированный код в окружении Simulink |
10 | Проверьте, что исполняемая программа выполняет как ожидалось. | Числовое профилирование тестирования и выполнения кода эквивалентности |
В среде моделирования Simulink® два подхода доступны для размещения внешнего кода C or C++ в разделы кода, который производит генератор кода:
Добавьте блоки от библиотеки Custom Code до корневой подсистемы модели или атомарной подсистемы.
Установите параметры конфигурации модели на Code Generation> панель Custom Code.
Следующая таблица сравнивает два подхода. Выберите подход, который выравнивается лучше всего с вашими требованиями интегрирования. Для получения дополнительной информации о том, как применить каждый подход, смотрите, Интегрируют Внешний Код при помощи Блоков Пользовательского кода и Интегрируют Внешний Код при помощи Параметров конфигурации Модели.
Требование | Блоки | Параметры конфигурации модели |
---|---|---|
Включайте представление своего внешнего кода в холсте моделирования | ✓ | |
Поместите код в функции, сгенерированные для корневых моделей | ✓ | ✓ |
Поместите код в функции, сгенерированные для атомарных подсистем | ✓ | |
Сохраните размещение кода в наборе конфигурации модели | ✓ | |
Поместите код вверху и внизу заголовка и исходных файлов, сгенерированных для модели | ✓ | ✓ |
Поместите код в объявлении, выполнении и выходных разделах SystemInitialize иSystemTerminate функции, которые создает генератор кода | ✓ | ✓ |
Поместите код в объявлении, выполнении и выходных разделах SystemStart , SystemEnable , SystemDisable , SystemOutputs , SystemUpdate , илиSystemDerivatives функции, которые создает генератор кода | ✓ | |
Добавьте макроопределения препроцессора в сгенерированный код | ✓ | |
Используйте настройки пользовательского кода, которые заданы для цели симуляции | ✓ | |
Сконфигурируйте модель библиотеки, чтобы использовать настройки пользовательского кода родительской модели, с которой соединяется библиотека | ✓ |
Библиотека блоков Пользовательского кода содержит блоки, которые можно использовать, чтобы поместить внешний код C or C++ в определенные местоположения и функции в рамках кода, который производит генератор кода. Библиотека состоит из 10 блоков, которые добавляют ваш код в заголовок модели (model
.h
) и источник (model
.c
или model
.cpp
) файлы, которые производит генератор кода.
Model Header и блоки Model Source добавляют внешний код вверху и внизу заголовка и исходных файлов, которые генератор кода производит для корневой модели. Эти блоки отображают два текстовых поля, в которые можно ввести или вставить код. Одно поле задает код, который вы хотите поместить наверху сгенерированного заголовка или исходного файла. Второе поле задает код, который вы хотите поместить в нижней части файла.
Оставшиеся блоки добавляют внешний код в функции, которые генератор кода производит для корневой подсистемы модели или атомарной подсистемы, которая содержит блок. Блоки отображают текстовые поля, в которые можно ввести или вставить код, который настраивает функции, которые производит генератор кода. Текстовые поля соответствуют объявлению, выполнению и выходным разделам кода для заданной функции.
Настроить код это | Используйте этот блок |
---|---|
Вычисляет непрерывные состояния | System Derivatives |
Отключает состояние | System Disable |
Включает состояние | System Enable |
Состояние сброса | System Initialize |
Produces выход | 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 как модели, на которые ссылаются. Генератор кода игнорирует блоки при создании кода для цели симуляции. При создании кода для цели генерации кода генератор кода включает и компилирует пользовательский код.
В этом примере показано, как использовать блок 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; } }
Для другого примера смотрите, Интегрируют Внешний код С В Сгенерированный код При помощи Блоков Пользовательского кода и Параметров конфигурации Модели.
Параметры конфигурации модели обеспечивают способ поместить внешний код C or C++ в определенные местоположения и функции в рамках кода, который производит генератор кода.
К | Выбрать |
---|---|
Введите внешний код около верхней части сгенерированного или файл | Source file, и вводит внешний код, чтобы вставить. Если вы генерируете код подсистемы в отдельные файлы, тот код не имеет доступа к внешнему коду, который вы задаете параметром Source file. Например, если вы задаете включать файл как установку 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 в диалоговом окне Configuration Parameters. |
Позвольте модели библиотеки использовать настройки пользовательского кода, уникальные от родительской модели, до которой соединяется библиотека | Use local custom code settings (do not inherit from main model) Этот параметр доступен только для моделей библиотеки, которые содержат блоки MATLAB Function, диаграммы Stateflow или блоки Таблицы истинности. |
Чтобы включать заголовочный файл во внешний заголовочный файл, добавьте #ifndef
код. Используя этот код избегает нескольких включений. Например, в rtwtypes.h
, следующий #include
защита добавляется:
#ifndef RTW_HEADER_rtwtypes_h_ #define RTW_HEADER_rtwtypes_h_ ... #endif /* RTW_HEADER_rtwtypes_h_ */
Для получения дополнительной информации о том, как добавить названия и местоположение файлов заголовка, источника, и совместно использовал файлы библиотеки к процессу сборки, смотрите Сборку Интегрированный Код В окружении Simulink.
Примечание
Генератор кода включает внешний код, который вы включаете в конфигурацию модели при генерации кода для программного обеспечения в цикле (SIL) и процессоре в цикле (PIL) симуляции. Однако генератор кода игнорирует внешний код, который вы включаете в конфигурацию модели при создании кода с S-функцией, быстрой симуляцией или системным конечным файлом симуляции.
Для получения дополнительной информации о параметрах Custom Code, смотрите Параметры конфигурации Модели: Пользовательский код Генерации кода. Для примера смотрите, Интегрируют Внешний код С В Сгенерированный код При помощи Блоков Пользовательского кода и Параметров конфигурации Модели.
В этом примере показано, как поместить, внешний код в сгенерированном коде при помощи пользовательского кода блокируется и параметры конфигурации модели.
1. Откройте модель rtwdemo_slcustcode
.
open_system('rtwdemo_slcustcode')
2. Откройте приложение Embedded Coder или Simulink Coder.
3. Откройте диалоговое окно Model Configuration Parameters и перейдите к панели Пользовательского кода.
4. Исследуйте настройки на Исходный файл параметров конфигурации модели и Инициализируйте функцию.
Исходный файл задает комментарий и устанавливает переменную GLOBAL_INT2
к-1.
Инициализируйте функцию, инициализирует переменную GLOBAL_INT2
к 1.
5. Закройте диалоговое окно.
6. Дважды кликните Исходный блок Модели. Верхняя часть параметров блоков Источника Модели указывает, что генератор кода объявляет переменную GLOBAL_INT1
и набор это к 0 наверху сгенерированного файла rtwdemo_slcustcode.c
.
7. Откройте триггируемую подсистему Amplifier
. Подсистема включает блок System Outputs. Генератор кода помещает код, который вы задаете в том блоке в сгенерированном коде для самой близкой родительской атомарной подсистемы. В этом случае генератор кода помещает внешний код в сгенерированный код для Amplifier
подсистема. Внешний код:
Объявляет переменную указателя *intPtr
и инициализирует его значением переменной GLOBAL_INT1
.
Устанавливает переменную указателя на-1 во время выполнения.
Сбрасывает переменную указателя к 0 перед выходом.
8. Сгенерируйте код и отчет генерации кода.
9. Исследуйте код в сгенерированном исходном файле rtwdemo_slcustcode.c
. Наверху файла, после #include
операторы, вы находите следующий код объявления. Пример задает первое объявление с параметром конфигурации Исходного файла и второе объявление с Исходным блоком Модели.
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;
Следующее присвоение появляется в модели, инициализируют функцию точки входа. Пример задает это присвоение с Инициализировать функциональным параметром конфигурации.
GLOBAL_INT2 = 1;