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

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

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

Класс хранения для трех выбранных портов ввода изменяется на Model default: ImportedExternPointer.
Для ввода In1, переопределить значение класса хранения по умолчанию. Задайте для класса хранения значение ImportedExtern.

Настройте идентификаторы кода для входов таким образом, чтобы имена аргументов интерфейса в сгенерированном коде совпадали с именами интерфейсов во внешнем заголовке и файлах определений. В редакторе сопоставлений кодов выберите строку для каждого порта ввода. В инспекторе свойств задайте для свойства «Идентификатор» эти значения.
| Inport | Идентификатор кода |
|---|---|
In1 | input1 |
In2 | input2 |
In3 | input3 |
In4 | input4 |
Сохраните модель.
Создайте и просмотрите код. Например, в rtwdemo_configrpinterface.c найти, где переменные input1, input2, input3, и input4 используются в функции начального уровня шага.
void rtwdemo_configrpinterface_step(void)
{
mode = ((input1 > rtwdemo_configrpinterface_UPPER) || (input1 <
rtwdemo_configrpinterface_LOWER));
dout_Table1 = look1_binlc((*input2), (&(mp_Table1.BP[0])),
(&(mp_Table1.Table[0])), 10U);
.
.
.
dout_Table2 = look2_binlc((*input3), (*input4), (&(mp_Table2.BP1[0])),
(&(mp_Table2.BP2[0])), (&(mp_Table2.Table[0])),
(&(rtwdemo_configr_Table2_maxIndex[0])), 3U);
dstate_X = dout_Table2;
}
}Для автоматизации настройки входов корневого уровня для генерации кода используйте интерфейс программирования для отображения кода. Например, при создании пользовательских библиотек блоков или части тестовой среды приложения используйте интерфейс программирования для автоматизации настройки данных.
В этом примере показано, как использовать интерфейс программирования для настройки параметров по умолчанию для вводов на корневом уровне для rtwdemo_configrpinterface модели. Три из четырех входов считывают входные данные из переменных глобального указателя, определенных во внешнем файле. Созданный код для входов настраивается для считывания входных данных из глобальных переменных указателей по умолчанию. Затем переопределите конфигурацию генерации кода по умолчанию для In1, что требует передачи входных данных по значению.
Кроме того, идентификаторы кода для входов настраиваются таким образом, чтобы имена глобальных переменных в сгенерированном коде совпадали с именами переменных, определенными во внешнем файле.
Откройте пример модели.
open_system('rtwdemo_configrpinterface')
Создать объект cm путем вызова функции coder.mapping.api.get. Объект сохраняет конфигурацию создания кода данных для модели. rtwdemo_configrpinterface.
cm = coder.mapping.api.get('rtwdemo_configrpinterface');Настройка параметров по умолчанию для входов путем вызова функции setDataDefault. Для аргументов укажите следующие значения:
Объект, возвращенный coder.mapping.api.get
Inports для категории по умолчанию
Имя свойства StorageClass со значением свойства ImportedExternPointer
setDataDefault(cm,'Inports','StorageClass','ImportedExternPointer')
Проверьте конфигурацию по умолчанию для входов. Выполните вызов getDataDefault который указывает объект, возвращенный coder.mapping.api.get, категория Inports, и StorageClass.
getDataDefault(cm,'Inports','StorageClass')
ans =
'ImportedExternPointer'
Переопределить конфигурацию ввода по умолчанию для ввода In1. Требования к этому вводу отличаются от требований трех других вводов.
По умолчанию Simulink устанавливает класс хранения для отдельных входов в значение Auto. Когда класс хранения данных Auto, генератор кода:
Определяет необходимость исключения данных из созданного кода в целях оптимизации.
При сохранении данных определяет способ эффективного представления данных в сгенерированном коде с учетом настроек конфигурации по умолчанию.
Чтобы управлять конфигурацией класса хранения для порта ввода, настройте параметры для порта ввода с помощью функции setInport. Настройка кода, созданного для ввода In1 для считывания входных данных из глобальных переменных, определенных во внешнем файле, как указано в требованиях. Вызов функции setInport который указывает объект, возвращенный coder.mapping.api.get, Блок ввода с именем In1, имя свойства StorageClass, и значение свойства ImportedExtern.
setInport(cm,'In1','StorageClass','ImportedExtern')
Проверьте конфигурацию для ввода In1 путем вызова функции getInport.
getInport(cm,'In1','StorageClass')
ans =
'ImportedExtern'
Настройка генератора кода для применения параметров ввода по умолчанию к вводам 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_configrpinterface.c найти, где переменные input1, input2, input3, и input4 используются в функции начального уровня шага.
void rtwdemo_configrpinterface_step(void)
{
mode = ((input1 > rtwdemo_configrpinterface_UPPER) || (input1 <
rtwdemo_configrpinterface_LOWER));
dout_Table1 = look1_binlc((*input2), (&(mp_Table1.BP[0])),
(&(mp_Table1.Table[0])), 10U);
.
.
.
dout_Table2 = look2_binlc((*input3), (*input4), (&(mp_Table2.BP1[0])),
(&(mp_Table2.BP2[0])), (&(mp_Table2.Table[0])),
(&(rtwdemo_configr_Table2_maxIndex[0])), 3U);
dstate_X = dout_Table2;
}
}В зависимости от требований к созданию кода выберите один из этих классов хранения, чтобы настроить создание кода для входов на корневом уровне.
| Требования | Класс хранения |
|---|---|
| Активизируйте оптимизацию, потенциально создавая более эффективный код. | Авто (только отдельные сопоставления) |
| Для элементов данных, которые не могут быть оптимизированы, представляют данные как поле стандартной структуры данных. | По умолчанию (только сопоставление по умолчанию) |
| Предотвращение исключения оптимизации хранилища для элемента данных и использование сопоставления по умолчанию для категории элементов данных. | Модель по умолчанию (только отдельные сопоставления), Dictionary Default (Только отдельные сопоставления) |
| Создание определения и объявления глобальной переменной. | ExportedGlobal |
| Создание кода, считывающего и записывающего в глобальную переменную или указатель глобальной переменной, определенный внешним кодом. | ImportedExtern, ImportedExternPointer |
Список доступных классов хранения может включать другие классы хранения для конкретного проекта, определенные в словаре встроенного кодера. При наличии специальных требований, не удовлетворяющих указанным классам хранения, и наличии программного обеспечения Embedded Coder можно определить класс хранения. См. раздел Определение классов хранения, разделов памяти и шаблонов функций для архитектуры программного обеспечения (встроенный кодер).
Для отдельного порта ввода используйте свойство класса хранения Identifier, чтобы настроить имя переменной, представляющей порт ввода в сгенерированном коде.
Редактор сопоставлений кода | coder.mapping.api.CodeMapping