Для использования кода, создаваемого на основе модели, следует вызвать сгенерированные функции точки входа. Среда вызова и сгенерированные функции обмениваются входными и выходными данными, например, в виде глобальных переменных или аргументов функции. Входные блоки (inports) корневого уровня представляют собой входные данные интерфейса. Для интеграции и развертывания сгенерированного кода в приложениях можно настроить способ создания кода интерфейса генератором кода, включая способ объявления и обработки входных данных. Настройки могут:
Сверните изменения, которые необходимо внести в существующий код.
Создание стабильных интерфейсов, которые не изменяются или минимально изменяются при внесении изменений в модель.
Создание кода, который обеспечивает более эффективный обмен данными (например, с помощью указателей и аргументов передачи по ссылке для нескалярных данных).
Блоки Enable и Trigger (ввод вызова функции) также загружают данные в систему извне системы. С точки зрения создания кода эти элементы моделирования являются экспортируемыми функциями. Для экспортируемой функции генератор кода создает функцию точки входа, которую можно настроить. См. раздел Настройка генерации кода C для функций точек входа модели.
Для создания кода в примерах показано, как настроить интерфейс ввода для модели rtwdemo_configinterface . Можно настроить сопоставления кода с помощью редактора сопоставлений кода или API-интерфейса сопоставлений кода (coder.mapping.api.CodeMapping).
По умолчанию входные данные корневого уровня в модели отображаются в сгенерированном коде как поля глобальной структуры данных с именем . В зависимости от требований к интерфейсу кода решите, следует ли настраивать создание данных ввода на корневом уровне. Если настройки не настроены, генератор кода определяет необходимость исключения или изменения представления входных данных в сгенерированном коде в целях оптимизации. При настройке настроек решите:model_ExtU
Настройка конфигурации по умолчанию
Если модель включает значительное число (например, более 10) входов корневого уровня, более эффективно настроить входы с настройкой по умолчанию, а затем переопределить эту настройку для особых случаев. Если модель включает несколько вводов на корневом уровне, которые имеют уникальные требования к источнику, именованию или размещению, рассмотрите возможность индивидуальной настройки вводов.
Объявление и обработка входных данных корневого уровня в сгенерированном интерфейсе
Как отдельные глобальные переменные
Считывание входных данных из глобальных переменных, определенных во внешнем коде
Для вводов ссылочной модели в качестве глобальных переменных (void-void)
Как вызовы функций доступа. Требуется встроенный кодер ®
В качестве аргументов функции начальной точки. Требуется встроенный кодер
Дополнительные сведения об этих параметрах см. в разделе Управление данными и функциональным интерфейсом в сгенерированном коде.
Другие соображения включают в себя необходимость:
Имена входов в сгенерированном коде с помощью меток блоков ввода, отображаемых в модели, или с помощью уникальных идентификаторов кода.
Включить volatile квалификатор типа в определениях и объявлениях глобальных переменных. Требуется встроенный кодер. См. раздел Защита глобальных данных с помощью квалификаторов типа const и volative.
Поместите данные, считанные в определенную область памяти. Требуется встроенный кодер. См. раздел Управление данными и размещением функций в памяти путем вставки прагматиков.
Список требований к интерфейсам, релевантных для ввода с соответствующими классами хранения и свойствами класса хранения, см. в разделе Выбор класса хранения для управления представлением данных в сгенерированном коде.
Например, модель rtwdemo_configinterface, требования к интерфейсу ввода:
Использовать определение типа проекта DBL_FLOAT определено в файле заголовка exDblFloat.h.
Получение данных для ввода In1 из файла заголовка exInDataMem.h. Данные используются для вычисления значения, которое хранится в памяти, а затем используются в условии if-else кода, сгенерированного для блока Switch.
Получение элементов данных для ввода In2, In3, и In4 из файла заголовка exInDataLut.h. Данные используются в таблицах поиска Table1 и Table2.
Переменные, представляющие входные данные в сгенерированном коде, должны быть названы input1, input2, input3, и input4.
Для этого примера настройте порты ввода в rtwdemo_configinterface в соответствии с этими требованиями к созданию кода.
Настройка генерации кода по умолчанию для входов на корневом уровне может уменьшить усилия по подготовке модели для генерации кода, особенно если модель имеет значительное количество входов. Один раз выберите настройки конфигурации, и генератор кода применит эти настройки к входам в модели. Simulink ® сохраняет конфигурацию по умолчанию как часть модели.
Рекомендуется настроить параметры генерации кода по умолчанию для входов на корневом уровне модели, если модель использует несколько входов на корневом уровне, которые не имеют уникальных требований или используют общий словарь встроенного кодера.
В этом примере показано, как использовать редактор сопоставления кодов для настройки параметров по умолчанию для корневых входов для rtwdemo_configinterface модели. Укажите внешний файл заголовка, объявляющий входные данные. Три из четырех корневых входов считывают входные данные из переменных, объявленных в файле заголовка exInDataLut.h. Задайте этот файл заголовка в качестве источника входных данных по умолчанию для входов.
Открыть пример модели rtwdemo_configinterface. Сохраните копию модели в доступном для записи расположении.

Откройте приложение Embedded Coder.
На вкладке Код C выберите Интерфейс кода > Сопоставления кодов по умолчанию.
В редакторе сопоставлений кодов в разделе «Входы и выходы» выберите категорию «Входы». Задать класс хранения по умолчанию как ImportFromFile.
В инспекторе свойств задайте для параметра «Файл заголовка» значение exInDataLut.h.

Сохраните модель.
Для создания кода можно настроить отдельные входные данные на корневом уровне. Например, если модель имеет два входа на корневом уровне, которые имеют уникальные требования к генерации кода, настройте их по отдельности. При настройке параметров по умолчанию для входов настройте отдельные входы для использования параметров по умолчанию или уникальных параметров.
Если модель удовлетворяет хотя бы одному из этих критериев, рассмотрите возможность настройки параметров генерации кода для вводов на корневом уровне по отдельности:
Использует несколько входов с уникальными требованиями.
Использует несколько входов.
Имеет конфигурацию по умолчанию для портов ввода и необходимо переопределить конфигурацию для некоторых определенных портов ввода.
В этом примере показано, как с помощью редактора сопоставлений кодов переопределить конфигурацию генерации кода по умолчанию для одного из входов в модели. rtwdemo_configinterface. В предыдущем примере класс хранения по умолчанию для входов устанавливается равным ImportFromFile. Для модели требуется ввод In1 считывать входные данные из глобальной переменной вместо указателя глобальной переменной.
В примере также показано, как настроить идентификаторы, используемые генератором кода для присвоения имен четырем входам в сгенерированном коде. Можно указать идентификаторы генерации кода, например, для интеграции, без необходимости изменения конструкции модели.
Если это еще не сделано, выполните действия в разделе Настройка параметров генерации кода по умолчанию для корневых портов ввода.
В редакторе сопоставлений кодов перейдите на вкладку «Inports». Редактор перечисляет имена блоков Inport и элементов шины, которые находятся в модели. Если порт получает разрешение на сигнальный объект, справа от имени элемента появляется значок «resolve-to-signal-object». Класс хранения для каждого порта ввода имеет значение Auto, что означает, что генератор кода может исключить или изменить представление соответствующего кода в целях оптимизации. Если оптимизация невозможна, генератор кода применяет конфигурацию модели по умолчанию. В этом примере конфигурация модели по умолчанию определяет класс хранения ImportedFromFile.
Чтобы избежать оптимизации и заставить генератор кода использовать конфигурацию по умолчанию, задайте для класса хранения значение Model default.
Чтобы переопределить конфигурацию по умолчанию, укажите класс хранения, который соответствует требованиям к созданию кода для этого входа.
Настройка генератора кода для применения значения класса хранения по умолчанию к входам In2, In3, и In4. Выберите строки для трех входов. Затем для одного из выбранных портов ввода установите класс хранения в значение Model default: ImportFromFile.

Класс хранения для трех выбранных портов ввода изменяется на Model default: ImportFromFile.
Для ввода In1, переопределить значение класса хранения по умолчанию. Задайте для класса хранения значение ImportFromFile. В инспекторе свойств задайте для параметра «Файл заголовка» значение exInDataMem.h.

Настройте идентификаторы кода для входов таким образом, чтобы имена аргументов интерфейса в сгенерированном коде совпадали с именами интерфейсов во внешнем заголовке и файлах определений. В редакторе сопоставлений кодов выберите строку для каждого порта ввода. В инспекторе свойств задайте для свойства «Идентификатор» эти значения.
| Inport | Идентификатор кода |
|---|---|
In1 | input1 |
In2 | input2 |
In3 | input3 |
In4 | input4 |
Сохраните модель.
Создайте и просмотрите код. Например, в rtwdemo_configinterface.c найти, где переменные input1, input2, input3, и input4 используются в функции начального уровня шага.
void rtwdemo_configinterface_step(void)
{
mode = ((input1 > rtwdemo_configinterface_UPPER) || (input1 <
rtwdemo_configinterface_LOWER));
dout_Table1 = look1_binlc(input2, ((const MYTYPE *)&(Table1.BP[0])), ((
const MYTYPE *)&(Table1.Table[0])), 10U);
.
.
.
dout_Table2 = look2_binlc(input3, input4, ((const MYTYPE *)&(mp_Table2.BP1[0])),
((const MYTYPE *)&(mp_Table2.BP2[0])), ((const MYTYPE *)&(mp_Table2.Table[0])),
((const uint32_T *)&(rtwdemo_configi_Table2_maxIndex[0])), 3U);
dstate_X = dout_Table2;
}
Для автоматизации настройки входов корневого уровня для генерации кода используйте интерфейс программирования для отображения кода. Например, при создании пользовательских библиотек блоков или части тестовой среды приложения используйте интерфейс программирования для автоматизации настройки данных.
В этом примере показано, как использовать интерфейс программирования для настройки параметров по умолчанию для вводов на корневом уровне для rtwdemo_configinterface модели. Укажите внешний файл заголовка, объявляющий входные данные. Три из четырех входов корневого уровня считывают входные данные из переменных, объявленных в файле заголовка exInDataLut.h. Этот файл устанавливается в качестве файла заголовка по умолчанию. Затем необходимо переопределить конфигурацию генерации кода по умолчанию для In1, которая требует, чтобы входные данные считывались из файла заголовка exInDataMem.h.
Кроме того, идентификаторы кода для входов настраиваются таким образом, чтобы имена глобальных переменных в сгенерированном коде совпадали с именами переменных, определенными во внешнем файле.
Откройте пример модели.
open_system('rtwdemo_configinterface')
Создать объект cm путем вызова функции coder.mapping.api.get. Объект сохраняет данные и конфигурацию создания кода функции для модели. rtwdemo_configinterface.
cm = coder.mapping.api.get('rtwdemo_configinterface');Настройка параметров по умолчанию для входов путем вызова функции setDataDefault. Для аргументов укажите следующие значения:
Объект, возвращенный coder.mapping.api.get
Inports для категории по умолчанию
Имя свойства StorageClass со значением свойства ImportFromFile
Имя свойства HeaderFile со значением свойства exInDataLut.h, имя внешнего файла, содержащего входные данные
setDataDefault(cm,'Inports','StorageClass','ImportFromFile','HeaderFile','exInDataLut.h')
Проверьте конфигурацию по умолчанию для входов. Выполните два вызова для getDataDefault которые указывают объект, возвращенный coder.mapping.api.get и категория Inports. В первом вызове укажите третий аргумент как свойство StorageClass. Во втором вызове для третьего аргумента укажите HeaderFile.
getDataDefault(cm,'Inports','StorageClass')
ans =
'ImportFromFile'
getDataDefault(cm,'Inports','HeaderFile')
ans =
'exInDataLut.h'
Переопределить конфигурацию ввода по умолчанию для ввода In1. Требования к этому вводу отличаются от требований трех других вводов.
По умолчанию Simulink устанавливает класс хранения для отдельных входов в значение Auto. Когда класс хранения данных Auto, генератор кода:
Определяет необходимость исключения данных из созданного кода в целях оптимизации.
При сохранении данных определяет способ эффективного представления данных в сгенерированном коде с учетом настроек конфигурации по умолчанию.
Чтобы управлять классом хранения и конфигурацией файла заголовка для порта ввода, настройте параметры для порта ввода с помощью функции setInport. Настройка кода, созданного для ввода In1 считывание входных данных из глобальных переменных, определенных во внешнем файле заголовка exInDataMem.h, как указано в требованиях. Выполните два вызова функции setInport которые указывают объект, возвращенный coder.mapping.api.get и блок ввода с именем In1. В первом вызове также укажите имя свойства StorageClass и значение свойства ImportFromFile. Во втором вызове укажите имя свойства HeaderFile и значение свойства exInDataMem.h.
setInport(cm,'In1','StorageClass','ImportFromFile') setInport(cm,'In1','HeaderFile','exInDataMem.h')
Проверьте конфигурацию для ввода In1 путем вызова функции getInport.
getInport(cm,'In1','StorageClass')
ans =
'ImportFromFile'
getInport(cm,'In1','HeaderFile')
ans =
'exInDataMem.h'Настройка генератора кода для применения параметров ввода по умолчанию к вводам In2, In3, и In4. Для каждого входа вызовите функцию setInport. Укажите объект, возвращенный coder.mapping.api.get, имя блока Inport, имя свойства StorageClass, и значение свойства Model default.
setInport(cm,'In2','StorageClass','Model default') setInport(cm,'In3','StorageClass','Model default') setInport(cm,'In4','StorageClass','Model default')
Проверьте изменения конфигурации для ввода In2, In3, и In4 с вызовами функции getInport.
getInport(cm,'In2','StorageClass')
ans =
'Model default'
getInport(cm,'In3','StorageClass')
ans =
'Model default'
getInport(cm,'In4','StorageClass')
ans =
'Model default'Настройте идентификаторы кода для входов таким образом, чтобы глобальные переменные, представляющие входы в сгенерированном коде, совпадали с именами переменных во внешнем файле определения. Для каждого входа вызовите функцию setInport. Укажите объект, возвращенный coder.mapping.api.get, имя блока Inport, имя свойства Identifierи одно из этих значений свойств.
| Inport | Идентификатор кода |
|---|---|
In1 | input1 |
In2 | input2 |
In3 | input3 |
In4 | input4 |
setInport(cm,'In1','Identifier','input1'); setInport(cm,'In2','Identifier','input2'); setInport(cm,'In3','Identifier','input3'); setInport(cm,'In4','Identifier','input4');
Проверьте изменения конфигурации для входов, используя вызовы для функционирования getInport.
getInport(cm,'In1','Identifier')
ans =
'input1'
getInport(cm,'In2','Identifier')
ans =
'input2'
getInport(cm,'In3','Identifier')
ans =
'input3'
getInport(cm,'In4','Identifier')
ans =
'input4'
Сохраните модель.
Создайте и просмотрите код. Например, в rtwdemo_configinterface.c найти, где переменные input1, input2, input3, и input4 используются в функции начального уровня шага.
void rtwdemo_configinterface_step(void)
{
mode = ((input1 > rtwdemo_configinterface_UPPER) || (input1 <
rtwdemo_configinterface_LOWER));
dout_Table1 = look1_binlc(input2, ((const MYTYPE *)&(Table1.BP[0])), ((
const MYTYPE *)&(Table1.Table[0])), 10U);
.
.
.
dout_Table2 = look2_binlc(input3, input4, ((const MYTYPE *)&(mp_Table2.BP1[0])),
((const MYTYPE *)&(mp_Table2.BP2[0])), ((const MYTYPE *)&(mp_Table2.Table[0])),
((const uint32_T *)&(rtwdemo_configi_Table2_maxIndex[0])), 3U);
dstate_X = dout_Table2;
}
В зависимости от требований к созданию кода выберите один из этих классов хранения, чтобы настроить создание кода для входов на корневом уровне.
| Требования | Класс хранения |
|---|---|
| Включите оптимизацию, потенциально создавая более эффективный код. | Авто (только отдельные сопоставления) |
| Для элементов данных, которые не могут быть оптимизированы, представляют данные как поле стандартной структуры данных. | По умолчанию (только сопоставление по умолчанию) |
| Предотвращение исключения оптимизации хранилища для элемента данных и использование сопоставления по умолчанию для категории элементов данных. | Модель по умолчанию (только отдельные сопоставления), Dictionary Default (Только отдельные сопоставления) |
| Создание структуры, хранящей логические данные в именованных битовых полях. | Bitfield (только отдельные сопоставления) |
Создание определения и объявления глобальной переменной с volatile квалификатор типа. | Volatile (См. Const, Volatile и ConstVolatile) |
| Создание определения и объявления глобальной переменной. | ExportedGlobal |
| Создание определения и объявления глобальной переменной для указанного файла. | ExportToFile |
| Создайте код, который взаимодействует с данными, вызвав пользовательские функции доступа. | GetSet |
| Создание кода, считывающего и записывающего в глобальную переменную или указатель глобальной переменной, определенный внешним кодом. | ImportedExtern, ImportedExternPointer |
| Считывание входных данных для входа из указанного внешнего файла заголовка. | ImportFromFile |
| Создание переменных, локальных для функций. | Локализуемый |
| Создайте глобальную структуру с именем, которое можно указать. | Структура (только отдельные сопоставления) |
Список доступных классов хранения может включать другие классы хранения для конкретного проекта, определенные в словаре встроенного кодера. При наличии специальных требований, не удовлетворяющих указанным классам хранения, и наличии программного обеспечения Embedded Coder можно определить класс хранения. См. раздел Определение классов хранения, разделов памяти и шаблонов функций для архитектуры программного обеспечения.
Для отдельного порта ввода используйте свойство класса хранения Identifier, чтобы настроить имя переменной, представляющей порт ввода в сгенерированном коде. С помощью встроенного кодера в зависимости от выбранного класса хранения можно также настроить эти свойства.
| Собственность | Описание | Классы хранения |
|---|---|---|
DefinitionFile | Файл определения источника, содержащий определения глобальных данных, считываемый входным и внешним кодом | ExportToFile и Volatile |
GetFunction | Inport отображается в сгенерированном коде как вызов указанного get функция | GetSet |
HeaderFile | Исходный файл заголовка, содержащий объявления для глобальных данных, которые считываются входным и внешним кодом | ExportToFile, GetSet, ImportFromFile, и Volatile |
Memory Section(только конфигурация ввода по умолчанию) | Раздел памяти, содержащий данные, считанные входным портом | Default |
Owner | Генератор кода помещает определение для входов в код, созданный для одной из нескольких моделей в иерархии моделей, которые совместно используют определения. Необходимо выбрать параметр конфигурации модели Использовать владельца из объекта данных для размещения определения данных. См. раздел Управление размещением глобальных определений и деклараций данных в созданных файлах. | ExportToFile и Volatile |
PreserveDimensions | Генератор кода сохраняет размеры входных данных, которые представлены в сформированном коде в виде многомерного массива. Необходимо установить параметр конфигурации модели Array layout равным Row-major. См. раздел Сохранение измерений многомерных массивов в сгенерированном коде. | ExportToFile, ImportFromFile, Localizable, и Volatile |
SetFunction | Inport отображается в сгенерированном коде как вызов указанного set функция. | GetSet |
StructName | Имя структуры в созданном коде для ввода. | BitField и Struct |
Редактор сопоставлений кода | coder.mapping.api.CodeMapping