Чтобы использовать код, который вы генерируете из модели, вы вызываете сгенерированные функции точки входа. Среда вызова и сгенерированные функции обмениваются входными и выходными данными, например, как глобальные переменные или аргументы функции. Корневой уровень блоки Inport (импорт) составляет входные данные интерфейса. Чтобы интегрировать и развернуть сгенерированный код в приложения, можно настроить, как генератор кода производит интерфейсный код, включая то, как входные данные объявлены и обработаны. Индивидуальные настройки могут:
Минимизируйте модификации, которые необходимо сделать к существующему коду.
Сгенерируйте устойчивые интерфейсы, которые не изменяются или минимально изменяются, когда вы вносите изменения в свою модель.
Сгенерируйте код, который обменивается данными более эффективно (например, при помощи указателей и аргументов передачи ссылкой для нескалярных данных).
Для генерации кода примеры показывают, как настроить интерфейс импорта для модели rtwdemo_configrpinterface
. Можно сконфигурировать отображения кода при помощи Code Mappings editor или API отображений кода (coder.mapping.api.CodeMapping
).
По умолчанию импорт корневого уровня в модели появляется в сгенерированном коде как поля структуры глобальных данных под названием
. На основе ваших требований интерфейса кода решите, настроить ли генерацию данных об импорте корневого уровня. Если вы не конфигурируете индивидуальные настройки, генератор кода определяет, устранить ли или изменить представление импорта в сгенерированном коде в целях оптимизации. Если вы конфигурируете индивидуальные настройки, решаете:model
_ExtU
Настроить ли настройку по умолчанию
Если модель включает значительное количество (например, больше чем 10) импорта корневого уровня, более эффективно сконфигурировать импорт с настройкой по умолчанию, и затем заменить ту установку для особых случаев. Если модель включает несколько импорта корневого уровня, который имеет уникальный источник, именование, или требования размещения, рассматривает конфигурирование импорта индивидуально.
Как объявить и обработать данные об импорте корневого уровня в сгенерированном интерфейсе
Как разделяют глобальные переменные
Считать входные данные из глобальных переменных, заданных во внешнем коде
Для импорта модели, на который ссылаются, как глобальные переменные (void-void
)
Как вызывает к функциям доступа. Требует Embedded Coder®
Как аргументы функции точки входа. Требует Embedded Coder
Для получения дополнительной информации об этих опциях, смотрите Данные об Управлении и Функциональный Интерфейс в Сгенерированном коде.
Другие факторы включают ли в:
Назовите импорт в сгенерированном коде при помощи меток блока Inport, которые появляются в модели или при помощи идентификаторов уникального кода.
Включайте volatile
введите спецификатор в определениях глобальной переменной и объявлениях. Требует Embedded Coder. Смотрите Защищают Глобальные данные с const и энергозависимыми Спецификаторами Типа (Embedded Coder).
Поместите чтение данных в определенную область памяти. Требует Embedded Coder. Смотрите Данные об Управлении и Функциональное Размещение в Памяти Вставкой Прагм (Embedded Coder).
Для списка интерфейсных требований, которые относятся к импорту с соответствующими классами памяти и свойствами класса памяти, смотрите, Выбирают Storage Class for Controlling Data Representation in Generated Code.
Например, модель rtwdemo_configrpinterface
, интерфейсные требования импорта:
Доберитесь данные для корневого уровня импортируют In1
, In2
, In3
, и In4
от внешнего заголовочного файла. Чтение данных с In1
используемо в вычислениях значение, которое хранится в памяти, и затем используемый в, если еще условие кода сгенерировало для блока Switch. Данные, считанные из других трех импорта, используются в интерполяционных таблицах Table1
и Table2
.
Данные для импорта In1
должен быть передан значением.
Данные для импорта In2
, In3
, и In4
должен быть передан ссылкой.
Переменные, представляющие импорт в сгенерированном коде, нужно назвать input1
, input2
, input3
, и input4
.
В данном примере сконфигурируйте импорт в rtwdemo_configrpinterface
удовлетворять эти требования генерации кода.
Настройка генерации кода по умолчанию для импорта корневого уровня может уменьшать усилие по подготовке модели для генерации кода, особенно если модель имеет значительное количество импорта. Выберите параметры конфигурации однажды, и генератор кода применяет те настройки к импорту через модель. Simulink® хранит настройку по умолчанию как часть модели.
Рассмотрите конфигурирующие настройки генерации кода по умолчанию для импорта корневого уровня модели, если ваша модель использует несколько импорта корневого уровня, который не имеет уникальных требований.
То В этом примере показано, как использовать Code Mappings editor, чтобы сконфигурировать настройки по умолчанию для корневого уровня, импортирует для модели rtwdemo_configrpinterface. Укажите, что импорт считал вход из переменных, объявленных во внешнем заголовочном файле.
Открытая модель rtwdemo_configrpinterface
в качестве примера. Сохраните копию модели к перезаписываемому местоположению.
Откройте приложение Simulink Coder.
Во вкладке C Code выберите Code Interface> Default Code Mappings.
В редакторе Отображений Кода, под Inports and Outports, избранная категория Inports. Установите класс памяти по умолчанию на ImportedExternPointer
.
Сохраните модель.
Можно сконфигурировать отдельный импорт корневого уровня для генерации кода. Например, если модель имеет два импорта корневого уровня, который имеет требования генерации уникального кода, конфигурирует импорт индивидуально. Или, если вы конфигурируете настройки по умолчанию для импорта, конфигурируете отдельный импорт, чтобы использовать настройки по умолчанию или уникальные настройки.
Если ваша модель соответствует по крайней мере одному из этих критериев, рассмотрите настройки генерации кода конфигурирования для импорта корневого уровня индивидуально:
Использование несколько импорта, который имеет уникальные требования.
Использование небольшое количество импорта.
Имеет настройку по умолчанию для импорта, и необходимо заменить настройку для некоторого определенного импорта.
В этом примере показано, как использовать редактор Отображений Кода, чтобы заменить настройку генерации кода по умолчанию для одного из импорта в модели rtwdemo_configrpinterface
. В предыдущем примере вы устанавливаете класс памяти по умолчанию для импорта в ImportedExternPointer
.
Пример также показывает, как сконфигурировать идентификаторы, которые генератор кода использует для именования четырех импорта в сгенерированном коде. Можно задать идентификаторы генерации кода, например, для интегрирования, не имея необходимость изменять проект модели.
Если вы уже не сделали так, завершитесь, шаги в Конфигурируют Настройки генерации кода По умолчанию для Корневого Уровня Inports.
В редакторе Отображений Кода кликните по вкладке Inports. Редактор перечисляет имена блоков Inport и элементов шины, которые находятся в модели. Если порт решает к объекту сигнала, решимость сигнализировать, что объектный значок появляется справа от имени элемента. Класс памяти для каждого импорта установлен в Auto
, что означает, что генератор кода может устранить или изменить представление соответствующих норм в целях оптимизации. Если оптимизация не возможна, генератор кода применяет настройку по умолчанию модели. В данном примере настройка по умолчанию модели задает класс памяти ImportedExternPointer
.
Чтобы избежать оптимизации и обеспечить генератор кода, чтобы использовать настройку по умолчанию, установите класс памяти на Model default
.
Чтобы заменить настройку по умолчанию, задайте класс памяти, который удовлетворяет требования генерации кода для того импорта.
Сконфигурируйте генератор кода, чтобы применить установку класса памяти по умолчанию на импорт In2
, In3
, и In4
. Выберите строки для трех импорта. Затем для одного из выбранного импорта, устанавливает класс памяти на Model default: ImportedExternPointer
.
Класс памяти для трех выбранного импорта превращается в Model default: ImportedExternPointer
.
Для импорта In1
, замените установку класса памяти по умолчанию. Установите класс памяти на ImportedExtern
.
Сконфигурируйте идентификаторы кода для импорта так, чтобы интерфейсные имена аргумента в сгенерированном коде совпадали с интерфейсными именами во внешнем заголовке и файлах определения. В редакторе Отображений Кода выберите строку для каждого импорта. В Property Inspector, набор свойство Identifier к этим значениям.
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
, блок Inport под названием 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. Если у вас есть особые требования, которым не отвечают перечисленные классы памяти, и у вас есть программное обеспечение Embedded Coder, можно задать класс памяти. Смотрите Задают Классы памяти, Разделы Памяти и Шаблоны функций для Программной архитектуры (Embedded Coder).
Для отдельного импорта используйте свойство класса памяти Identifier сконфигурировать имя для переменной, представляющей импорт в сгенерированном коде.
Редактор Отображений кода | coder.mapping.api.CodeMapping