С Embedded Coder®можно настроить сгенерированные интерфейсы функций C и C++ для блоков Simulink Function и Function Caller. Строение интерфейса кода функции поддерживает более лёгкое интегрирование сгенерированного кода с функциями или вызовами функций во внешнем коде и индивидуальными настройками для стандартов кодирования или требований проект.
Можно настроить сгенерированные функциональные интерфейсы C и C++ для:
Глобальный Simulink® функции
Экспортированные функции Simulink
Вы не можете настроить сгенерированный интерфейс функции для масштабированного блока Simulink Function, который не расположен на корневом уровне модели. Для получения дополнительной информации смотрите Обзор Scoped и Global Simulink Function Blocks.
При открытии диалогового окна из выбранного Simulink Function или Function Caller блока можно настроить прототип функции, сгенерированный для этого блока. Ваши изменения для выбранного блока также обновляют другие соответствующие Simulink Function и Function Caller блоки в модели. Видимость функции, глобальная или масштабированная, заданная в функции Trigger Port блоке, определяет, какие атрибуты функции можно изменить:
Для глобальной функции можно изменить имя функции и имена, типы квалификаторов и порядок аргументов функции.
Для экспортированной функции области видимости можно изменить типы аргументов и порядок аргументов. Вы не можете изменить функцию и имена аргумента.
Ваши изменения не изменяют модель графически и не влияют на прототип функции Simulink, заданный в блоке.
Embedded Coder поддерживает строение функционального кода Simulink для моделей, сконфигурированных с системными целевыми файлами на основе ERT, за исключением системных целевых файлов AUTOSAR.
В этом примере показано, как настроить интерфейс функции C, который генератор кода производит для блока глобального Simulink Function.
Откройте пример модели rtwdemo_functions
. Сохраните копию модели в месте с возможностью записи.
В галерее Apps откройте приложение Embedded Coder.
На вкладке C Code выберите Code Interface > Individual Element Code Mappings.
В редакторе Отображения перейдите на вкладку Functions.
В строке для Simulink Function:f3
щелкните гиперссылку для предварительного просмотра функции. Диалоговое окно C/C + + Function Interface показывает Simulink function prototype следующим y = f3(u)
и C/C++ function prototype как void f3(rtu_u, * rty_y)
. Предварительный просмотр C/C++ function prototype обновляется по мере внесения изменений.
Сконфигурируйте имя функции и аргументы.
Измените имена идентификаторов функций и аргументов. Параметр конфигурации <reservedrangesplaceholder1> модели определяет правило именования по умолчанию для Simulink Function аргументов. Изменения, которые вы вносите в диалоговом окне Интерфейс функции C/C + +, переопределяют правило именования по умолчанию.
В поле 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. Ваши модификации, сделанные в блок Simulink Function или Function Caller блок, влияют на генерацию кода для блока Simulink Function и соответствующих блоков Function Caller в модели.
Вы можете изменить C/C++ return argument с void
на y
. В этом случае прототип функции C y = function3(const * u)
.
Сохраните изменения, нажав OK.
Сохраните модель.
Убедитесь, что блок Simulink Function не выбран. Затем сгенерируйте код для модели.
В представлении Code откройте сгенерированный файл rtwdemo_functions.c
и поиск function3
. Сгенерированный код функции отражает изменения в сгенерированном прототипе функции С.
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, который генератор кода производит для экспортированного, масштабированного Simulink Function блока.
Для экспортированной, масштабированной функции можно изменить сгенерированный возвращаемый аргумент, классификаторы типов аргументов и порядок аргументов. Вы не можете изменить имя сгенерированной функции и имена аргумента.
Откройте модель rtwdemo_functions
. Сохраните его в месте с возможностью записи.
Измените видимость глобальной функции f3
от глобального до масштабируемого. Откройте блок Simulink Function f3
. Внутри функционального блока дважды кликните Trigger Port блок f3
. В диалоговом окне параметров блоков установите Function visibility равным scoped
. Нажмите Apply и OK.
В галерее Apps откройте приложение Embedded Coder.
На вкладке C Code щелкните вкладку Code Mappings - C.
В редакторе Отображения перейдите на вкладку Functions.
В строке для функции f3
щелкните гиперссылку для предварительного просмотра функции. Диалоговое окно C/C + + Function Interface показывает Simulink function prototype следующим y = f3(u)
и C/C++ function prototype как y = rtwdemo_functions_f3(rtu_u)
. Предварительный просмотр C/C++ function prototype обновляется по мере внесения изменений.
Для моделей, которые вы конфигурируете для кода с несколькими экземплярами C, предпросмотр интерфейса для масштабированных функций Simulink включает в себя self
аргумент. The 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
.
Для получения дополнительной информации о конфигурировании модели для генерации кода с несколькими экземплярами, смотрите Сгенерируйте входящий код из функциональных блоков Simulink.
Настройте аргументы. В данном примере сконфигурируйте u
аргумент. Установите C/C++ type Qualifier значение Pointer to const
.
Проверьте свое изменение, проверив предварительный просмотр прототипа функции.
Нажмите Apply. Ваши модификации, сделанные в блок Simulink Function или Function Caller блок, влияют на генерацию кода для блока Simulink Function и соответствующих блоков Function Caller в модели.
Вы можете изменить C/C++ return argument с y
на void
. В этом случае прототип функции C void = rtwdemo_functions_f3(* rty_y, const * rtu_u)
.
Сохраните изменения, нажав OK.
Сохраните модель.
Убедитесь, что блок Simulink Function не выбран. Затем сгенерируйте код для модели.
В представлении Code откройте сгенерированный файл rtwdemo_functions.c
и поиск rtwdemo_functions_f3
. Сгенерированный код функции отражает изменения в сгенерированном прототипе функции С.
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; }
В этом примере показано, как настроить интерфейс функции C++, который генерирует генератор кода для экспортированного блока Simulink Function.
Для экспортированной функции области видоизменения можно изменить сгенерированный возвращаемый аргумент, определители типа аргумента и порядок аргументов. Вы не можете изменить имя сгенерированной функции и имена аргумента.
Откройте модель rtwdemo_functions
. Сохраните его в рабочей области с возможностью записи.
Измените видимость глобальной функции f3
от глобального до масштабируемого. Откройте блок Simulink Function f3
. Внутри функционального блока дважды кликните Trigger Port блок f3
. В диалоговом окне параметров блоков установите Function visibility равным scoped
. Нажмите Apply и OK.
В галерее Apps откройте приложение Embedded Coder.
Установите параметр конфигурации модели Language равным C++
.
Откройте диалоговое окно Configure C/C + + Function Interface. Щелкните правой кнопкой мыши блок Simulink Function f3
. В контекстном меню выберите C/C++ Code > Configure C/C++ Function Interface. Диалоговое окно показывает Simulink function prototype следующим y = f3(u)
и C/C++ function prototype как y = rtwdemo_functions_f3(rtu_u)
. Предварительный просмотр C/C++ function prototype обновляется по мере внесения изменений.
Настройте аргументы. В данном примере сконфигурируйте u
аргумент. Установите C/C++ type Qualifier значение Pointer to const
.
Нажмите Apply. Ваши модификации, сделанные в блок Simulink Function или Function Caller блок, влияют на генерацию кода для блока Simulink Function и соответствующих блоков Function Caller в модели.
Вы можете изменить C/C++ return argument с y
на void
. В этом случае прототип функции C++ void = rtwdemo_functions_f3(* rty_y, const * rtu_u)
.
Сохраните изменения, нажав OK.
Сохраните модель.
Убедитесь, что блок Simulink Function не выбран. Затем сгенерируйте код для модели.
В представлении Code откройте сгенерированный файл rtwdemo_functions.cpp
и поиск функциональных f3
. Сгенерированный код функции отражает изменения сгенерированного прототипа функции C++.
real_T rtwdemo_functionsModelClass::f3(const real_T *rtu_u) { real_T rty_y_0; rtY.TicToc10 = rtDWork.Delay_DSTATE; rtDWork.Delay_DSTATE = static_cast<int8_T>(static_cast<int32_T> (-static_cast<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®.