Сконфигурируйте Корневой Уровень блоки Inport для генерации кода C

Чтобы использовать код, который вы генерируете из модели, вы вызываете сгенерированные функции точки входа. Среда вызова и сгенерированные функции обмениваются входными и выходными данными, например, как глобальные переменные или аргументы функции. Корневой уровень блоки Inport (импорт) составляет входные данные интерфейса. Чтобы интегрировать и развернуть сгенерированный код в приложения, можно настроить, как генератор кода производит интерфейсный код, включая то, как входные данные объявлены и обработаны. Индивидуальные настройки могут:

  • Минимизируйте модификации, которые необходимо сделать к существующему коду.

  • Сгенерируйте устойчивые интерфейсы, которые не изменяются или минимально изменяются, когда вы вносите изменения в свою модель.

  • Сгенерируйте код, который обменивается данными более эффективно (например, при помощи указателей и аргументов передачи ссылкой для нескалярных данных).

Enable и блоки Trigger (импорт вызова функции) также загружают данные в систему снаружи системы. С точки зрения генерации кода эти элементы моделирования экспортируются функции. Для экспортируемой функции генератор кода производит функцию точки входа, которую можно сконфигурировать. Смотрите Конфигурируют генерацию кода C для Функций Точки входа Модели.

Для генерации кода примеры показывают, как настроить интерфейс импорта для модели rtwdemo_configinterface . Можно сконфигурировать отображения кода при помощи Code Mappings Editor или API отображений кода (coder.mapping.api.CodeMapping).

Выберите Customization Options for Inport Interface

По умолчанию импорт корневого уровня в модели появляется в сгенерированном коде как поля структуры глобальных данных под названием model_ExtU. На основе ваших требований интерфейса кода решите, настроить ли генерацию данных об импорте корневого уровня. Если вы не конфигурируете индивидуальные настройки, генератор кода определяет, устранить ли или изменить представление импорта в сгенерированном коде в целях оптимизации. Если вы конфигурируете индивидуальные настройки, решаете:

  • Настроить ли настройку по умолчанию

    Если модель включает значительное количество (например, больше чем 10) импорта корневого уровня, более эффективно сконфигурировать импорт с настройкой по умолчанию, и затем заменить ту установку для особых случаев. Если модель включает несколько импорта корневого уровня, который имеет уникальный источник, именование, или требования размещения, рассматривает конфигурирование импорта индивидуально.

  • Как объявить и обработать данные об импорте корневого уровня в сгенерированном интерфейсе

    • Как разделяют глобальные переменные

    • Считать входные данные из глобальных переменных, заданных во внешнем коде

    • Для импорта модели, на который ссылаются, как глобальные переменные (void-void)

    • Как вызывает к функциям доступа. Требует Embedded Coder®

    • Как аргументы функции точки входа. Требует 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 удовлетворять эти требования генерации кода.

Сконфигурируйте настройки генерации кода по умолчанию для Корневого Уровня Inports

Настройка генерации кода по умолчанию для импорта корневого уровня может уменьшать усилие по подготовке модели для генерации кода, особенно если модель имеет значительное количество импорта. Выберите параметры конфигурации однажды, и генератор кода применяет те настройки к импорту через модель. Simulink® хранит настройку по умолчанию как часть модели.

Рассмотрите конфигурирующие настройки генерации кода по умолчанию для импорта корневого уровня модели, если ваша модель использует несколько импорта корневого уровня, который не имеет уникальных требований, или использует разделяемый Словарь Embedded Coder.

То В этом примере показано, как использовать Code Mappings Editor, чтобы сконфигурировать настройки по умолчанию для корневого уровня, импортирует для модели rtwdemo_configinterface. Задайте внешний заголовочный файл, который объявляет входные данные. Три из четырех корней импортируют вход чтения из переменных, объявленных в заголовочном файле exInDataLut.h. Установите тот заголовочный файл как входной источник по умолчанию для импорта.

  1. Открытая модель rtwdemo_configinterface в качестве примера. Сохраните копию модели к перезаписываемому местоположению.

    Simulink model to use for learning how to configure signals for code generation.

  2. Откройте приложение Embedded Coder.

  3. Во вкладке C Code выберите Code Interface> Default Code Mappings.

  4. В редакторе Отображений Кода, под Inports and Outports, избранная категория Inports. Установите класс памяти по умолчанию на ImportFromFile.

  5. В Property Inspector, Заголовочном файле набора к exInDataLut.h.

    Code Mappings editor with Data Defaults tab selected, Inports and Outports tree node expanded, and storage class for Inports set to ImportFromFile. Property Inspector with HeaderFile property set to exInDataLut.h

  6. Сохраните модель.

Сконфигурируйте настройки генерации кода для отдельного Корневого Уровня Inports

Можно сконфигурировать отдельный импорт корневого уровня для генерации кода. Например, если модель имеет два импорта корневого уровня, который имеет требования генерации уникального кода, конфигурирует импорт индивидуально. Или, если вы конфигурируете настройки по умолчанию для импорта, конфигурируете отдельный импорт, чтобы использовать настройки по умолчанию или уникальные настройки.

Если ваша модель соответствует по крайней мере одному из этих критериев, рассмотрите настройки генерации кода конфигурирования для импорта корневого уровня индивидуально:

  • Использование несколько импорта, который имеет уникальные требования.

  • Использование небольшое количество импорта.

  • Имеет настройку по умолчанию для импорта, и необходимо заменить настройку для некоторого определенного импорта.

В этом примере показано, как использовать редактор Отображений Кода, чтобы заменить настройку генерации кода по умолчанию для одного из импорта в модели rtwdemo_configinterface. В предыдущем примере вы устанавливаете класс памяти по умолчанию для импорта в ImportFromFile. Модель требует того импорта In1 считайте входные данные из глобальной переменной вместо указателя глобальной переменной.

Пример также показывает, как сконфигурировать идентификаторы, которые генератор кода использует для именования четырех импорта в сгенерированном коде. Можно задать идентификаторы генерации кода, например, для интегрирования, не имея необходимость изменять проект модели.

  1. Если вы уже не сделали так, завершитесь, шаги в Конфигурируют Настройки генерации кода По умолчанию для Корневого Уровня Inports.

  2. В редакторе Отображений Кода кликните по вкладке Inports. Редактор перечисляет имена блоков Inport и элементов шины, которые находятся в модели. Если порт решает к объекту сигнала, решимость сигнализировать, что объектный значок появляется справа от имени элемента. Класс памяти для каждого импорта установлен в Auto, что означает, что генератор кода может устранить или изменить представление соответствующих норм в целях оптимизации. Если оптимизация не возможна, генератор кода применяет настройку по умолчанию модели. В данном примере настройка по умолчанию модели задает класс памяти ImportedFromFile.

    • Чтобы избежать оптимизации и обеспечить генератор кода, чтобы использовать настройку по умолчанию, установите класс памяти на Model default.

    • Чтобы заменить настройку по умолчанию, задайте класс памяти, который удовлетворяет требования генерации кода для того импорта.

  3. Сконфигурируйте генератор кода, чтобы применить установку класса памяти по умолчанию на импорт In2, In3, и In4. Выберите строки для трех импорта. Затем для одного из выбранного импорта, устанавливает класс памяти на Model default: ImportFromFile.

    Code Mappings editor with Inports tab selected, signals In2, In3, and In4 selected, and storage class being set to Model default: ImportFromFile.

    Класс памяти для трех выбранного импорта превращается в Model default: ImportFromFile.

  4. Для импорта In1, замените установку класса памяти по умолчанию. Установите класс памяти на ImportFromFile. В Property Inspector, набор Header File к exInDataMem.h.

    Code Mappings editor with Inports tab selected, signal In1 selected, and storage class being set to ImportFromFile. Property Inspector with HeaderFile property set to exInDataMem.h.

  5. Сконфигурируйте идентификаторы кода для импорта так, чтобы интерфейсные имена аргумента в сгенерированном коде совпадали с интерфейсными именами во внешнем заголовке и файлах определения. В редакторе Отображений Кода выберите строку для каждого импорта. В Property Inspector, набор свойство Identifier к этим значениям.

    InportИдентификатор кода
    In1input1
    In2input2
    In3input3
    In4input4
  6. Сохраните модель.

  7. Сгенерируйте и просмотрите код. Например, в 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;
    }
    

Сконфигурируйте настройки генерации кода для Корневого Уровня Inports программно

Чтобы автоматизировать настройку импорта корневого уровня для генерации кода, используйте интерфейс программирования для отображений кода. Например, при создании библиотек пользовательского блока или части тестовой среды приложения, используйте интерфейс программирования, чтобы автоматизировать настройку данных.

То В этом примере показано, как использовать интерфейс программирования, чтобы сконфигурировать настройки по умолчанию для корневого уровня, импортирует для модели rtwdemo_configinterface. Задайте внешний заголовочный файл, который объявляет входные данные. Три из четырех корневых уровней импортируют вход чтения из переменных, объявленных в заголовочном файле exInDataLut.h. Вы устанавливаете тот файл как заголовочный файл по умолчанию. Затем вы заменяете настройку генерации кода по умолчанию для In1, который требует, чтобы входные данные были считаны из заголовочного файла exInDataMem.h.

Кроме того, вы конфигурируете идентификаторы кода для импорта так, чтобы имена глобальной переменной в сгенерированном коде совпадали с именами переменных, заданными во внешнем файле.

  1. Откройте модель в качестве примера.

    open_system('rtwdemo_configinterface')
    
  2. Создайте объект cm путем вызывания функции coder.mapping.api.get. Объектно-ориентированная память данные и функциональная настройка генерации кода для модели rtwdemo_configinterface.

    cm = coder.mapping.api.get('rtwdemo_configinterface');
  3. Сконфигурируйте настройки по умолчанию для импорта путем вызывания функции setDataDefault. Для аргументов задайте эти значения:

    • Объект, возвращенный coder.mapping.api.get

    • Inports для категории по умолчанию

    • Имя свойства StorageClass со значением свойства ImportFromFile

    • Имя свойства HeaderFile со значением свойства exInDataLut.h, имя внешнего файла, который содержит входные данные

    setDataDefault(cm,'Inports','StorageClass','ImportFromFile','HeaderFile','exInDataLut.h')
  4. Проверьте свою настройку по умолчанию для импорта. Издайте два приказа к getDataDefault это задает объект, возвращенный coder.mapping.api.get и категория Inports. В первом вызове задайте третий аргумент как свойство StorageClass. Во втором вызове, для третьего аргумента, задают HeaderFile.

    getDataDefault(cm,'Inports','StorageClass')
    
    ans =
    
        'ImportFromFile'
    
    getDataDefault(cm,'Inports','HeaderFile')
    
    ans =
    
        'exInDataLut.h'
    
  5. Замените настройку импорта по умолчанию для импорта 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')
  6. Проверьте свою настройку для импорта In1 путем вызывания функции getInport.

    getInport(cm,'In1','StorageClass')
    
    ans =
    
        'ImportFromFile'
    
    getInport(cm,'In1','HeaderFile')
    
    ans =
    
        'exInDataMem.h'
  7. Сконфигурируйте генератор кода, чтобы применить ваши настройки импорта по умолчанию к импорту 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')
    
  8. Проверьте свои изменения конфигурации для импорта 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'
  9. Сконфигурируйте идентификаторы кода для импорта так, чтобы глобальные переменные, которые представляют импорт в сгенерированном коде, совпадали с именами переменных во внешнем файле определения. Для каждого импорта вызовите функцию setInport. Задайте объект, возвращенный coder.mapping.api.get, имя блока Inport, имя свойства Identifier, и одни из этих значений свойств.

    InportИдентификатор кода
    In1input1
    In2input2
    In3input3
    In4input4
    setInport(cm,'In1','Identifier','input1');
    setInport(cm,'In2','Identifier','input2');
    setInport(cm,'In3','Identifier','input3');
    setInport(cm,'In4','Identifier','input4');
    
  10. Проверьте свои изменения конфигурации для импорта при помощи вызовов функции 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'
    
  11. Сохраните модель.

  12. Сгенерируйте и просмотрите код. Например, в 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;
    }
    

Выберите Storage Class и Storage Class Properties for Root-Level Inports

В зависимости от ваших требований генерации кода примите решение из этих классов памяти сконфигурировать генерацию кода для импорта корневого уровня.

ТребованияКласс памяти
Включите оптимизацию, потенциально генерируя более эффективный код.Автоматический (Только отдельные отображения)
Для элементов данных, которые не могут быть оптимизированы, представляйте данные как поле стандартной структуры данных.Значение по умолчанию (Значение по умолчанию, сопоставляющее только)
Препятствуйте тому, чтобы оптимизация устранила устройство хранения данных для элемента данных, и используйте отображение значения по умолчанию для категории элемента данных.Значение по умолчанию модели (Только отдельные отображения), Dictionary Default (Только отдельные отображения)
Сгенерируйте структуру, которая хранит булевы данные в именованных битовых полях.Битовое поле (Только отдельные отображения)
Сгенерируйте определение глобальной переменной и объявление, которые имеют volatile введите спецификатор.Volatile (См. Const, энергозависимый, и ConstVolatile),
Сгенерируйте определение глобальной переменной и объявление.ExportedGlobal
Сгенерируйте определение глобальной переменной и объявление к заданному файлу.ExportToFile
Сгенерируйте код, который взаимодействует с данными путем вызывания пользовательских функций средства доступа.GetSet
Сгенерируйте код, который читает из и пишет в указатель глобальной переменной или глобальной переменной, заданный вашим внешним кодом.ImportedExtern, ImportedExternPointer
Считайте входные данные для импорта от заданного внешнего заголовочного файла.ImportFromFile
Сгенерируйте переменные, которые локальны для функций.Локализуемый
Сгенерируйте глобальную структуру, которая имеет имя, которое можно задать.Struct (Только отдельные отображения)

Список доступных классов памяти может включать другие специфичные для проекта классы памяти, заданные в Словарь Embedded Coder. Если у вас есть особые требования, которым не отвечают перечисленные классы памяти, и у вас есть программное обеспечение Embedded Coder, можно задать класс памяти. Смотрите Задают Классы памяти, Разделы Памяти и Шаблоны функций для Программной архитектуры.

Для отдельного импорта используйте свойство класса памяти Identifier сконфигурировать имя для переменной, представляющей импорт в сгенерированном коде. С Embedded Coder, в зависимости от класса памяти, который вы выбираете, можно также сконфигурировать эти свойства.

СвойствоОписаниеКлассы памяти
DefinitionFileИсходный файл определения, который содержит определения для глобальных данных, которые считаны импортом и внешним кодомExportToFile и Volatile
GetFunctionInport появляется в сгенерированном коде как вызов заданного 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
SetFunctionInport появляется в сгенерированном коде как вызов заданного set функция.GetSet
StructNameНазовите для структуры в сгенерированном коде для импорта.BitField и Struct

Смотрите также

|

Похожие темы