Чтобы использовать код, который вы генерируете из модели, вы вызываете сгенерированные функции точки входа. Среда вызова и сгенерированные функции обмениваются входными и выходными данными, например, как глобальные переменные или аргументы функции. Корневой уровень блоки Inport (импорт) составляет входные данные интерфейса. Чтобы интегрировать и развернуть сгенерированный код в приложения, можно настроить, как генератор кода производит интерфейсный код, включая то, как входные данные объявлены и обработаны. Индивидуальные настройки могут:
Минимизируйте модификации, которые необходимо сделать к существующему коду.
Сгенерируйте устойчивые интерфейсы, которые не изменяются или минимально изменяются, когда вы вносите изменения в свою модель.
Сгенерируйте код, который обменивается данными более эффективно (например, при помощи указателей и аргументов передачи ссылкой для нескалярных данных).
Enable и блоки Trigger (импорт вызова функции) также загружают данные в систему снаружи системы. С точки зрения генерации кода эти элементы моделирования экспортируются функции. Для экспортируемой функции генератор кода производит функцию точки входа, которую можно сконфигурировать. Смотрите Конфигурируют генерацию кода C для Функций Точки входа Модели.
Для генерации кода примеры показывают, как настроить интерфейс импорта для модели rtwdemo_configinterface
. Можно сконфигурировать отображения кода при помощи Code Mappings editor или API отображений кода (coder.mapping.api.CodeMapping
).
По умолчанию импорт корневого уровня в модели появляется в сгенерированном коде как поля структуры глобальных данных под названием
. На основе ваших требований интерфейса кода решите, настроить ли генерацию данных об импорте корневого уровня. Если вы не конфигурируете индивидуальные настройки, генератор кода определяет, устранить ли или изменить представление импорта в сгенерированном коде в целях оптимизации. Если вы конфигурируете индивидуальные настройки, решаете:model
_ExtU
Настроить ли настройку по умолчанию
Если модель включает значительное количество (например, больше чем 10) импорта корневого уровня, более эффективно сконфигурировать импорт с настройкой по умолчанию, и затем заменить ту установку для особых случаев. Если модель включает несколько импорта корневого уровня, который имеет уникальный источник, именование, или требования размещения, рассматривает конфигурирование импорта индивидуально.
Как объявить и обработать данные об импорте корневого уровня в сгенерированном интерфейсе
Как разделяют глобальные переменные
Считать входные данные из глобальных переменных, заданных во внешнем коде
Для импорта модели, на который ссылаются, как глобальные переменные (void-void
)
Как вызывает к функциям доступа. Требует Embedded Coder®
Как аргументы функции точки входа. Требует Embedded Coder
Для получения дополнительной информации об этих опциях, смотрите Данные об Управлении и Функциональный Интерфейс в Сгенерированном коде.
Другие факторы включают ли в:
Назовите импорт в сгенерированном коде при помощи меток блока Inport, которые появляются в модели или при помощи идентификаторов уникального кода.
Включайте volatile
введите спецификатор в определениях глобальной переменной и объявлениях. Требует Embedded Coder. Смотрите Защищают Глобальные данные с const и энергозависимыми Спецификаторами Типа.
Поместите чтение данных в определенную область памяти. Требует Embedded Coder. Смотрите Данные об Управлении и Функциональное Размещение в Памяти Вставкой Прагм.
Для списка интерфейсных требований, которые относятся к импорту с соответствующими классами памяти и свойствами класса памяти, смотрите, Выбирают Storage Class for Controlling Data Representation in Generated Code.
Например, модель rtwdemo_configinterface
, интерфейсные требования импорта:
Используйте определение типа проекта DBL_FLOAT
заданный в заголовочном файле exDblFloat.h
.
Получите данные для импорта In1
от заголовочного файла exInDataMem.h
. Данные используемы в вычислениях значение, которое хранится в памяти, и затем используемый в, если еще условие кода сгенерировало для блока Switch.
Получите элементы данных для импорта In2
, In3
, и In4
от заголовочного файла exInDataLut.h
. Данные используются в интерполяционных таблицах Table1
и Table2
.
Переменные, представляющие импорт в сгенерированном коде, должны быть named input1
, input2
, input3
, и input4
.
В данном примере сконфигурируйте импорт в rtwdemo_configinterface
удовлетворять эти требования генерации кода.
Настройка генерации кода по умолчанию для импорта корневого уровня может уменьшать усилие по подготовке модели для генерации кода, особенно если модель имеет значительное количество импорта. Выберите параметры конфигурации однажды, и генератор кода применяет те настройки к импорту через модель. Simulink® хранит настройку по умолчанию как часть модели.
Рассмотрите конфигурирующие настройки генерации кода по умолчанию для импорта корневого уровня модели, если ваша модель использует несколько импорта корневого уровня, который не имеет уникальных требований, или использует разделяемый Словарь Embedded Coder.
То В этом примере показано, как использовать Code Mappings editor, чтобы сконфигурировать настройки по умолчанию для корневого уровня, импортирует для модели rtwdemo_configinterface. Задайте внешний заголовочный файл, который объявляет входные данные. Три из четырех корней импортируют вход чтения из переменных, объявленных в заголовочном файле exInDataLut.h
. Установите тот заголовочный файл как входной источник по умолчанию для импорта.
Открытая модель rtwdemo_configinterface
в качестве примера. Сохраните копию модели к перезаписываемому местоположению.
Откройте приложение Embedded Coder.
Во вкладке C Code выберите Code Interface> Default Code Mappings.
В редакторе Отображений Кода, под Inports and Outports, избранная категория Inports. Установите класс памяти по умолчанию на ImportFromFile
.
В Property Inspector, Заголовочном файле набора к exInDataLut.h
.
Сохраните модель.
Можно сконфигурировать отдельный импорт корневого уровня для генерации кода. Например, если модель имеет два импорта корневого уровня, который имеет требования генерации уникального кода, конфигурирует импорт индивидуально. Или, если вы конфигурируете настройки по умолчанию для импорта, конфигурируете отдельный импорт, чтобы использовать настройки по умолчанию или уникальные настройки.
Если ваша модель соответствует по крайней мере одному из этих критериев, рассмотрите настройки генерации кода конфигурирования для импорта корневого уровня индивидуально:
Использование несколько импорта, который имеет уникальные требования.
Использование небольшое количество импорта.
Имеет настройку по умолчанию для импорта, и необходимо заменить настройку для некоторого определенного импорта.
В этом примере показано, как использовать редактор Отображений Кода, чтобы заменить настройку генерации кода по умолчанию для одного из импорта в модели rtwdemo_configinterface
. В предыдущем примере вы устанавливаете класс памяти по умолчанию для импорта в ImportFromFile
. Модель требует того импорта In1
считайте входные данные из глобальной переменной вместо указателя глобальной переменной.
Пример также показывает, как сконфигурировать идентификаторы, которые генератор кода использует для именования четырех импорта в сгенерированном коде. Можно задать идентификаторы генерации кода, например, для интегрирования, не имея необходимость изменять проект модели.
Если вы уже не сделали так, завершитесь, шаги в Конфигурируют Настройки генерации кода По умолчанию для Корневого Уровня Inports.
В редакторе Отображений Кода кликните по вкладке Inports. Редактор перечисляет имена блоков Inport и элементов шины, которые находятся в модели. Если порт решает к объекту сигнала, решимость сигнализировать, что объектный значок появляется справа от имени элемента. Класс памяти для каждого импорта установлен в Auto
, что означает, что генератор кода может устранить или изменить представление соответствующих норм в целях оптимизации. Если оптимизация не возможна, генератор кода применяет настройку по умолчанию модели. В данном примере настройка по умолчанию модели задает класс памяти ImportedFromFile
.
Чтобы избежать оптимизации и обеспечить генератор кода, чтобы использовать настройку по умолчанию, установите класс памяти на Model default
.
Чтобы заменить настройку по умолчанию, задайте класс памяти, который удовлетворяет требования генерации кода для того импорта.
Сконфигурируйте генератор кода, чтобы применить установку класса памяти по умолчанию на импорт In2
, In3
, и In4
. Выберите строки для трех импорта. Затем для одного из выбранного импорта, устанавливает класс памяти на Model default: ImportFromFile
.
Класс памяти для трех выбранного импорта превращается в Model default: ImportFromFile
.
Для импорта In1
, замените установку класса памяти по умолчанию. Установите класс памяти на ImportFromFile
. В Property Inspector, набор Header File к exInDataMem.h
.
Сконфигурируйте идентификаторы кода для импорта так, чтобы интерфейсные имена аргумента в сгенерированном коде совпадали с интерфейсными именами во внешнем заголовке и файлах определения. В редакторе Отображений Кода выберите строку для каждого импорта. В Property Inspector, набор свойство Identifier к этим значениям.
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
и блок Inport под названием 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 (Только отдельные отображения) |
Сгенерируйте структуру, которая хранит булевы данные в именованных битовых полях. | Битовое поле (Только отдельные отображения) |
Сгенерируйте определение глобальной переменной и объявление, которые имеют volatile введите спецификатор. | Volatile (См. Const, энергозависимый, и ConstVolatile), |
Сгенерируйте определение глобальной переменной и объявление. | ExportedGlobal |
Сгенерируйте определение глобальной переменной и объявление к заданному файлу. | ExportToFile |
Сгенерируйте код, который взаимодействует с данными путем вызывания пользовательских функций средства доступа. | GetSet |
Сгенерируйте код, который читает из и пишет в указатель глобальной переменной или глобальной переменной, заданный вашим внешним кодом. | ImportedExtern, ImportedExternPointer |
Считайте входные данные для импорта от заданного внешнего заголовочного файла. | ImportFromFile |
Сгенерируйте переменные, которые локальны для функций. | Локализуемый |
Сгенерируйте глобальную структуру, которая имеет имя, которое можно задать. | Struct (Только отдельные отображения) |
Список доступных классов памяти может включать другие специфичные для проекта классы памяти, заданные в Словарь Embedded Coder. Если у вас есть особые требования, которым не отвечают перечисленные классы памяти, и у вас есть программное обеспечение Embedded Coder, можно задать класс памяти. Смотрите Задают Классы памяти, Разделы Памяти и Шаблоны функций для Программной архитектуры.
Для отдельного импорта используйте свойство класса памяти Identifier сконфигурировать имя для переменной, представляющей импорт в сгенерированном коде. С Embedded Coder, в зависимости от класса памяти, который вы выбираете, можно также сконфигурировать эти свойства.
Свойство | Описание | Классы памяти |
---|---|---|
DefinitionFile | Исходный файл определения, который содержит определения для глобальных данных, которые считаны импортом и внешним кодом | ExportToFile и Volatile |
GetFunction | Inport появляется в сгенерированном коде как вызов заданного get функция | GetSet |
HeaderFile | Исходный заголовочный файл, который содержит объявления для глобальных данных, которые считаны импортом и внешним кодом | ExportToFile , GetSet , ImportFromFile , и Volatile |
Memory Section (значение по умолчанию импортирует только настройку), | Раздел Memory, который содержит данные, считанные импортом | Default |
Owner | Генератор кода помещает определение для импорта в коде, сгенерированном для одной из многоуровневых моделей в иерархии модели та доля определения. Необходимо выбрать параметр конфигурации модели Use owner from data object for data definition placement. Смотрите Размещение Управления Определений Глобальных данных и Объявлений в Сгенерированных Файлах. | ExportToFile и Volatile |
PreserveDimensions | Генератор кода сохраняет размерности данных об импорте, которые представлены в сгенерированном коде как многомерный массив. Необходимо установить параметр конфигурации модели Array layout на Row-major . Смотрите размерности заповедника многомерных массивов в сгенерированном коде. | ExportToFile , ImportFromFile , Localizable , и Volatile |
SetFunction | Inport появляется в сгенерированном коде как вызов заданного set функция. | GetSet |
StructName | Назовите для структуры в сгенерированном коде для импорта. | BitField и Struct |
Редактор Отображений кода | coder.mapping.api.CodeMapping