С Embedded Coder® можно настроить сгенерированные интерфейсы функции C/C++ для Simulink Функциональные и Функциональные блоки Вызывающей стороны. Функциональная настройка интерфейса кода поддерживает более легкое интегрирование сгенерированного кода с функциями или вызовами функции во внешнем коде и индивидуальными настройками для кодирования стандартов или конструктивных требований.
Можно настроить сгенерированные интерфейсы функции C/C++ для:
Функции Global Simulink®
Экспортируемый определил объем функций Simulink
Вы не можете настроить сгенерированный интерфейс функции C/C++ для ограниченного по объему Функционального блока Simulink, который не расположен на корневом уровне модели. Для получения дополнительной информации смотрите Ограниченный по объему и Глобальная переменная Обзор Функциональных блоков Simulink (Simulink).
Путем открытия диалогового окна от выбранного блока Simulink Function или Function Caller можно настроить прототипа функции C/C++, сгенерированного для того блока. Ваши изменения для выбранного блока также обновляют другой соответствующий Simulink Функциональные и Функциональные блоки Вызывающей стороны в модели. Функциональная видимость, глобальная переменная или ограниченный по объему, установленный в функциональной Триггерной Блокировке порта, определяет, какие функциональные атрибуты можно изменить:
Для глобальной функции можно поменять имя функции и имена, ввести спецификаторы и порядок аргументов функции.
Для экспортируемой ограниченной по объему функции можно изменить спецификаторы типа аргумента и порядок аргументов. Вы не можете изменить функцию и имена аргумента.
Ваши изменения графически не изменяют модель и не влияют на прототипа функции Simulink, заданного в блоке.
Embedded Coder поддерживает настройку интерфейса функции Simulink кода для ERT и ERT-выведенных целей, за исключением цели AUTOSAR.
Этот пример показывает, как настроить сгенерированный интерфейс функции C для Функционального блока Simulink для автоматической генерации кода C.
Откройте и сохраните модель rtwdemo_functions
в качестве примера.
Настройте функциональный интерфейс для Функционального блока Simulink путем открытия диалогового окна настройки с помощью одного из этих методов:
Щелкните правой кнопкой по Simulink Function block f3
. В контекстном меню выберите C/C++ Code> Configure C/C++ Function Interface.
Откройте перспективу Кода, перейдите к редактору Отображений Кода и выберите вкладку Entry-Point Functions. В Функции Simulink f3 строка, в соответствии со столбцом Function Preview, нажимают на прототипную гиперссылку.
Диалоговое окно настройки открывается, чтобы отобразить прототипа функции Simulink, заданного в блоке, y = f3(u)
и предварительном просмотре интерфейса функции C/C++, void f3(rtu_u, * rty_y)
. Предварительный просмотр интерфейса C/C++ обновляет динамически, когда вы вносите изменения.
Для моделей, что вы конфигурируете для C multi-instantiable код, интерфейсный предварительный просмотр включает аргумент self
. Аргумент self
является указателем на версию модели реального времени (RT_MODEL
) структура данных, которая хранит данные мультиэкземпляра, сопоставленные с допускающими повторное использование функциями.
Если образцовый параметр конфигурации, Code interface packaging установлен в Reusable function
и Total number of instances allowed per top model, установлен в Multiple
, аргумент появляется как self
, указывая, что генератор кода производит сам структура.
Если образцовый параметр конфигурации, Code interface packaging установлен в Reusable function
или Total number of instances allowed per top model, установлен в Multiple
, аргумент появляется как [self]
, указывая, что аргумент является дополнительным. Генератор кода производит структуру self
, только если вы используете модель в качестве топ-модели, и Code interface packaging установлен в Reusable function
или если вы используете модель в качестве модели, на которую ссылаются, и Total number of instances allowed per top model установлен в Multiple
.
Для получения дополнительной информации о конфигурировании модели для multi-instantiable генерации кода, смотрите, Генерируют Повторно используемый Код от Функциональных блоков Simulink.
Исследуйте настройки диалогового окна на C/C++ Function Name и C/C++ Identifier Name — $N
и rt$I$N$M
.
Образцовый параметр конфигурации Subsystem method arguments задает формат идентификатора по умолчанию (называющий правило) для Аргументов функции Simulink.
rt
является текстовым префиксом. $I
, $N
и $M
являются макросами формата идентификатора. Для получения дополнительной информации смотрите аргументы метода Подсистемы (Simulink Coder).
Измените функцию и имена идентификатора аргумента. Изменения, что вы делаете в переопределении диалогового окна образцовые значения по умолчанию параметра конфигурации.
В поле C/C++ function name, и в столбце C/C++ Identifier Name для каждого аргумента функции Simulink, вводят пользовательское имя или правило именования идентификатора. Задайте допустимые символы C-идентификатора, макросы формата идентификатора или комбинацию. В данном примере назовите функциональный function3
и, для обоих аргументов, введите идентификатор, называющий правило $N$M
.
Чтобы видеть советы о доступных макросах, установите свой курсор на C/C++ function name и C/C++ Identifier Name. Для получения дополнительной информации о правилах именования идентификатора, смотрите Управление форматом Идентификатора.
Для аргумента u
, набор C/C++ Type Qualifier к Pointer to const
.
Переупорядочьте аргументы. Перетащите строку аргумента y
выше строки аргумента u
и отбрасывание.
Нажмите Apply и исследуйте обновленного прототипа функции C/C++: void function3(* y, const * u)
.
Ваши модификации, сделанный ли к Функциональному блоку Simulink или блоку Function Caller, влияют на генерацию кода для Функционального блока Simulink и соответствующих Функциональных блоков Вызывающей стороны в модели.
Опционально, вы могли изменить C/C++ return argument от void
до y
. Получившейся функцией C/C++ является y = function3(const * u)
.
Нажмите OK, чтобы сохранить ваши изменения.
Сгенерируйте код.
Откройте сгенерированный файл rtwdemo_functions.c
и ищите function3
. Сгенерированный функциональный код отражает изменения в сгенерированном прототипе функции C/C++.
void function3(real_T *y, const real_T *u) { rtY.TicToc10 = rtDWork.Delay_DSTATE; rtDWork.Delay_DSTATE = (int8_T)(int32_T)-(int32_T)rtY.TicToc10; adder(rtB.Subtract, rtU.U2, *u, &rtB.FunctionCaller); *y = rtB.FunctionCaller; }
Этот пример показывает вам, как изменить сгенерированный интерфейс функции C/C++ для экспортируемого ограниченного по объему Функционального блока Simulink и сгенерировать код С с заданными изменениями.
Для экспортируемой ограниченной по объему функции можно изменить сгенерированный возвращаемый аргумент, спецификаторы типа аргумента и порядок аргументов. Вы не можете поменять сгенерированное имя функции и имена аргумента.
Откройте модель rtwdemo_functions
. Сохраните его в перезаписываемую рабочую область.
Измените видимость глобального функционального f3
от глобальной переменной до ограниченного по объему. Откройте Функциональный блок Simulink f3
. В функциональном блоке дважды кликните Триггерную Блокировку порта f3
. В диалоговом окне параметров блоков, набор Function visibility к scoped
. Нажмите Apply и OK.
Настройте функциональный интерфейс путем открытия диалогового окна настройки с помощью одного из этих методов:
Щелкните правой кнопкой по Simulink Function block f3
. В контекстном меню выберите C/C++ Code> Configure C/C++ Function Interface.
Откройте перспективу Кода, перейдите к редактору Отображений Кода и выберите вкладку Entry-Point Functions. В Функции Simulink f3 строка, в соответствии со столбцом Function Preview, нажимают на прототипную гиперссылку.
Сконфигурировать диалоговое окно Function Interface C/C++ открывается, чтобы отобразить интерфейс функции Simulink, заданный в блоке, y = f3(u)
, и начальном интерфейсе функции C/C++ по умолчанию, y rtwdemo_functions_f3(rtu_u)
.
Для аргумента u
, набор C/C++ Type Qualifier к Pointer to const
.
Нажмите Apply и исследуйте обновленный интерфейс функции C/C++: y rtwdemo_functions_f3(const * rtu_u)
.
Ваши модификации, сделанный ли к Функциональному блоку Simulink или блоку Function Caller, влияют на генерацию кода для Функционального блока Simulink и соответствующих Функциональных блоков Вызывающей стороны в модели.
Опционально, можно изменить C/C++ return argument от y
до void
. В этом случае функциональным интерфейсом является void = rtwdemo_functions_f3(* rty_y, const * rtu_u)
.
Нажмите OK, чтобы сохранить ваши изменения.
Сгенерируйте код.
Откройте сгенерированный файл rtwdemo_functions.c
и ищите _f3
. Сгенерированный функциональный код отражает изменения в сгенерированном прототипе функции C/C++.
real_T rtwdemo_functions_f3(const real_T *rtu_u) { real_T rty_y_0; rtY.TicToc10 = rtDWork.Delay_DSTATE; rtDWork.Delay_DSTATE = (int8_T)(int32_T)-(int32_T)rtY.TicToc10; adder(rtB.Subtract, rtU.U2, *rtu_u, &rtB.FunctionCaller); rty_y_0 = rtB.FunctionCaller; return rty_y_0; }
Для генерации Кода С++ глобальные функции Simulink несовместимы с интерфейсами класса C++ для образцовых функций точки входа.
Настройка интерфейса функции Simulink кода не поддерживает функции Simulink и функционирует вызывающие стороны в Stateflow®.
Функциональная вызывающая сторона | Функция Simulink