Сконфигурируйте генерацию кода C по умолчанию для категорий данных модели и функций

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

Можно установить настройку генерации кода по умолчанию для:

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

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

Можно задать настройки по умолчанию в интерактивном режиме в среде редактирования моделей Simulink® от Code Mapping Editor или программно.

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

Задавать настройки генерации кода по умолчанию для данных модели и функционирует в интерактивном режиме в среде редактирования моделей Simulink, используйте Code Mapping Editor и Property Inspector. Когда вы используете Редактор Simulink в перспективном режиме кода, редактор и инспектор доступны. После подготовки модели для генерации кода инструмент Embedded Coder Quick Start помещает модель в перспективный режим кода. Также можно включить перспективный режим кода из Редактора Simulink путем выполнения одного из следующих действий:

  • Щелкните перспективное управление в нижнем правом углу редактирования моделей разделяют на области и выбирают Code.

  • Выберите Code> C/C++ Code> Configure Model in Code Perspective.

Код, Сопоставляющий Редактор, появляется ниже диаграммы модели. Отображение редактора состоит из трех таблиц с вкладками: Entry-Point Functions, Data Defaults и Function Defaults. Используйте таблицу Data Defaults, чтобы сопоставить категории элементов данных модели с классами памяти. Используйте таблицу Function Defaults, чтобы сопоставить функции с функциональными шаблонами настройки. Когда вы выбираете строку в одной из таблиц, раздел Code Property Inspector показывает настройки свойства для того элемента данных или функциональной категории.

Если вы закрываете Код, Сопоставляющий Редактор, окно Simulink Editor остается в перспективном режиме кода. Чтобы вновь открыть Код, Сопоставляющий Редактор, выберите View> Code Mappings.

После того, как вы будете включать перспективный режим кода или будете использовать значение по умолчанию, сопоставляющее программируемый интерфейс, чтобы сконфигурировать одну или несколько категорий данных, и функции для модели, устанавливая раздел memory и параметры конфигурации модели Shared utilities identifier format не имеет никакого эффекта. Кроме того, когда вы включаете перспективный режим кода, Simulink перемещает образцовые настройки параметра конфигурации на Код, Сопоставляющий Редактор. При необходимости, как часть миграции, Simulink конфигурирует Словарь Embedded Coder, который модель использует, как описано в Разделе Migrate Memory и Разделяемых Служебных Настройках от Параметров конфигурации до Редактора Отображений Кода.

Сконфигурируйте генерацию кода по умолчанию для данных

Вы конфигурируете генерацию кода по умолчанию для категорий элементов данных в модели путем соединения категорий с разделами storage classes и memory. Элементы данных сгруппированы в эти категории.

Категория элемента моделиОписание
InportsВходные порты корневого уровня модели.
Выходные портыВыходные порты корневого уровня модели.
Глобальные параметрыПараметры, которые заданы в базовом рабочем пространстве или в словаре данных. Многоуровневые модели в приложении могут использовать эти параметры.
Локальные параметрыПараметры, которые заданы в модели, такой как параметры в рабочем пространстве модели. Исключает образцовые аргументы.
Аргументы параметраПараметры блоков в рабочем пространстве модели, которые сконфигурированы в качестве образцовых аргументов. Эти параметры представлены в блоке модели, чтобы позволить каждому образцовому экземпляру обеспечивать свое собственное значение. Чтобы задать параметр в качестве образцового аргумента, установите флажок Argument на вкладке Parameters в Model Data Editor.
Разделяемые локальные хранилища данныхБлоки памяти Хранилища данных с параметрами блоков Share across model instances установлены. Эти хранилища данных доступны только в модели, где они заданы. Значение хранилища данных совместно используется через экземпляры модели.
Хранилища глобальных данныхХранилища данных, которые заданы объектом сигнала в базовом рабочем пространстве или в словаре данных. Многоуровневые модели в приложении могут использовать эти хранилища данных.
Внутренние данныеЛокальные данные, такие как хранилища данных, дискретные состояния блока, блокируют выходные сигналы и сигналы пересечения нулем.
КонстантыБлок постоянного значения вывод и постоянные параметры в модели.

Code Mapping Editor представляет допустимые опции класса памяти для данной категории. Опции могут включать:

  • Незаданный класс памяти (Default). Генератор кода помещает код для категории элементов данных в стандартных структурах, таких как B_, ExtY_, ExtU_, DW_ и P_. Смотрите Стандартные Структуры данных в Сгенерированном коде.

  • Соответствующий встроенный класс памяти, такой как ExportedGlobal.

  • Соответствующий класс памяти в доступном пакете, таком как ImportFromFile.

  • Класс памяти задан в Словаре Embedded Coder.

Прежде, чем сконфигурировать настройки генерации кода по умолчанию для данных, рассмотрите:

ФакторСмотрите
Какие категории относятся к вашей модели?Категории элемента модели в предыдущей таблице
Модель использует несколько экземпляров данных, которые находятся в категории? Если ответ да, применение отображений по умолчанию выгодно. Если ответ не, рассмотрите генерацию кода конфигурирования для каждого элемента данных индивидуально при помощи Model Data Editor.Сконфигурируйте свойства данных при помощи Model Data Editor (Simulink), примените классы памяти к отдельному сигналу, состоянию и элементам данных параметра, и примените пользовательские классы памяти к отдельному сигналу, состоянию и элементам данных параметра
Какой класс памяти выравнивается с вашими требованиями генерации кода для каждой категории? Выберите Storage Class for Controlling Data Representation in Generated Code
Вы хотите данные модели, которые будут структурированы? Например, если вы сконфигурировали модель для генерации кода мультиэкземпляра, структуры могут повысить эффективность кода и удобочитаемость.Организуйте данные в структуры в сгенерированном коде
Категории требуют, чтобы генератор кода хранил данные в определенных областях памяти? Например, рассмотрите, хранить ли данные об инициализации в медленной памяти и алгоритмические или вычислительные данные в быстродействующей памяти.Задайте классы памяти, разделы памяти и шаблоны функций для программной архитектуры и управляйте данными и функциональным размещением в памяти вставкой прагм
Вы хотите препятствовать тому, чтобы оптимизация устранила определенные данные из кода? Устранение параметров и других внутренних данных оптимизацией
Есть ли элементы данных, для которых необходимо заменить параметры конфигурации по умолчанию? Пример ниже.
Необходимо ли задать новые классы памяти, которые можно выбрать в Коде, Сопоставляющем Редактор?Задайте классы памяти, разделы памяти и шаблоны функций для программной архитектуры и создайте пользовательские классы памяти при помощи Custom Storage Class Designer

Этот пример показывает, как использовать Code Mapping Editor, чтобы задать требования генерации кода для данных модели. Модель использует несколько уровней выполнения и сконфигурирована для использования одно экземпляра.

В этом примере, требованиях генерации кода для данных:

  • Используйте определение типа проекта DBL_FLOAT, заданный в заголовочном файле exDblFloat.h.

  • Получите элемент данных ex_input1 от заголовочного файла exInDataMem.h. Данные используются для вычисления значения, сохраненного в памяти, и затем использовали в если еще условие блока switch.

  • Получите элементы данных ex_input2, ex_input3 и ex_input4 от заголовочного файла exInDataLut.h. Данные используются в интерполяционных таблицах Table1 и Table2.

  • Данные, импортированные в модель от заголовочных файлов exInDataMem.h и exInDataLut.h, имеют тип DBL_FLOAT, стандарт проекта.

  • Параметр K1 должен быть настраиваемым, чтобы включить калибровку.

  • mode хранилища данных задает данные, которые совместно используются в модели. Блок Logical Operator пишет в хранилище данных, и блок Rate Transition читает из хранилища данных.

  • Элемент данных X представляет задержку блока Unit Delay.

  • Храните данные, которые являются внутренними к модели, такими как задержка, которую X, в разделе памяти маркировал internalDataMem.

  • Экспортируйте объявления выходных данных в заголовочный файл exSysOut.h и определения exSysOut.c.

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

Настройте среду в качестве примера

  1. Скопируйте их внешний источник и заголовочные файлы от matlabroot/toolbox/rtw/rtwdemos до перезаписываемой рабочей папки. Эти файлы задают и объявляют внешний тип данных и данные, которые использует сгенерированный код.

    ФайлОписание
    exDblFloat.h

    Задает псевдоним типа данных проекта для double, DBL_FLOAT. Simulink использует коллбэк PreLoadFcn, заданный для модели, чтобы проанализировать этот заголовочный файл и создать соответствующий объект Simulink.AliasType.

    exInDataMem.c

    Включает exInDataMem.h и задает переменную ex_input1.

    exInDataMem.h

    Включает exDbFloat.h и объявляет переменную ex_input1.

    exInDataLut.c

    exInDataLut.c включает exInDataLut.h и задает переменные ex_input2, ex_input3 и ex_input4.

    exInDataLut.h

    Включает exDbFloat.h и объявляет переменные ex_input2, ex_input3 и ex_input4.

    rtwdemo_configdefaults.slx

    Модель Example.

  2. Откройте свою копию модели rtwdemo_configdefaults в качестве примера.

  3. Чтобы получить доступ к Коду, Сопоставляющему Редактор, включите перспективный режим кода. Выберите Code> C/C++ Code> Configure Model in Code Perspective.

Сконфигурируйте настройки по умолчанию для данных Inport

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

  1. Под Code Mappings - C, во вкладке Data Defaults, избранная категория Inports. Установите класс памяти на ImportFromFile.

  2. В Property Inspector, набор Header File к exInDataLut.h.

    Отображения по умолчанию для модели хранятся как часть модели.

Замените настройки по умолчанию для Inport In1

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

  1. Откройте Model Data Editor.

  2. В столбце Source выберите In1.

  3. Установите класс памяти для In1 к ImportFromFile.

  4. Установите Header File на inDataMem.h.

  5. Возвратитесь к Редактору Отображений Кода путем нажатия на вкладку Code Mappings - C.

Сконфигурируйте настройки по умолчанию для локальных параметров

Сконфигурируйте параметры UPPER, LOWER, K1 и K2. Те параметры являются локальными параметрами, для которых объекты параметра хранятся в рабочем пространстве модели. Сопоставьте категорию Local parameters с классом памяти ExportedGlobal, который заставляет объекты параметра появиться в сгенерированном коде как настраиваемые глобальные переменные.

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

Препятствуйте тому, чтобы оптимизация генератора кода устранила K1 из сгенерированного кода. Требования к данным указывают, что K1 должен быть настраиваемым. Чтобы предотвратить потенциальное устранение переменной из сгенерированного кода, в представлении Code Model Data Editor, находят параметр рабочего пространства модели для K1. Установите класс памяти на Model default. Для получения дополнительной информации смотрите Устранение Параметров и Других Внутренних Данных Оптимизацией.

Раздел Define Memory для внутренних данных

Задайте раздел memory для хранения единичной задержки X, данные, которые являются внутренними к модели.

  1. Возвратитесь к редактору отображений кода.

  2. Откройте Словарь Embedded Coder путем нажатия.

  3. Кликните по вкладке Memory Sections.

  4. Нажмите Add.

  5. В новой строке в нижней части таблицы назовите новый раздел memory internalDataMem. Также набор:

    • Pre Statement к #pragma start INTERNALDATA

    • Post Statement к #pragma end INTERNALDATA

    • Statements Surround к Group of variables

  6. Закройте словарь.

Сконфигурируйте раздел Default Memory для внутренних данных

В Коде, Сопоставляющем Редактор, сконфигурируйте генератор кода, чтобы поместить внутренние данные в раздел memory internalDataMem.

  1. Выберите категорию Internal data.

  2. В Property Inspector, набор Memory Section к internalDataMem.

Сконфигурируйте настройки по умолчанию для данных о выходном порте

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

  1. Сопоставьте категорию Outports с классом памяти ExportToFile.

  2. В Property Inspector, набор Header File к exSysOut.h и Definition File к exSysOut.c.

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

Сгенерируйте и проверьте код

В представлении Code:

  • Откройте файл rtwdemo_configdefaults_private.h. Используйте поле Search, чтобы найти операторы #include, которые включают заголовочные файлы, которые объявляют внешние входные данные.

    #include "exInDataMem.h"
    #include "exInDataLut.h"
    

  • Откройте файл rtwdemo_configdefaults.c. Код инициализирует переменную K1 усиления и использует переменную в образцовой ступенчатой функции exFast_step1.

    DBL_FLOAT K1 = 2.0;
    .
    .
    .
    void exFast_step1(void)
    {
      DBL_FLOAT rtb_Gain;
      
      rtb_Gain = K1 * look1_binlc(ex_input2, rtCP_Table1_bp01Data, 
        rtCP_Table1_tableData, 10U);
      .
      .
      .
    }
  • В файле rtwdemo_configdefaults.c ищите строки управления #pragma. Найдите строки управления pragma, которые задают разделы памяти для локального хранилища данных, единичная задержка и константы.

    #pragma start INTERNALDATA
    BlockIO_rtwdemo_configdefaults B;
    #pragma end INTERNALDATA
    
    #pragma start INTERNALDATA
    D_Work_rtwdemo_configdefaults DWork;
    #pragma end INTERNALDATA
    
    #pragma start INTERNALDATA
    RT_MODEL_rtwdemo_configdefaults M_;
    #pragma end INTERNALDATA
    
    #pragma start INTERNALDATA
    RT_MODEL_rtwdemo_configdefaults *const M = &M_;
    #pragma end INTERNALDATA
    
  • Откройте файл exSysOut.c. Файл включает экспортируемое определение данных для Out1.

    #include "rtwtypes.h"
    #include "rtwdemo_dataconfig_types.h"
    
    DBL_FLOAT Out1;
    
  • Откройте совместно используемый файл exSysOut.h. Файл объявляет Out1. Чтобы получить доступ к Out1, внешний код может включать этот заголовочный файл.

    extern DBL_FLOAT Out1;
    

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

Сконфигурируйте генерацию кода по умолчанию для категории функций при помощи Code Mapping Editor, чтобы сопоставить категорию с функциональным шаблоном настройки.

Образцовая функциональная категорияОписание
Инициализировать/ОтключитьИнициализация и код функции завершения, такой как model_initialize и model_terminate.
ВыполнениеКод выполнения для модели, такой как model_step и model_reset.
Разделяемая утилитаКод для разделяемых служебных функций.

Функциональный шаблон настройки задает, как генератор кода производит код для категории функций. Для функциональной категории можно задать:

  • Правило для именования функций

  • Местоположение в памяти для функциональных определений (раздел memory)

По умолчанию генератор кода использует идентификатор, называющий правило $R$N, чтобы назвать функции точки входа. $R является именем корневой модели. $N является именем функции генератора кода по умолчанию, например, initialize, step и terminate. Чтобы интегрировать сгенерированный код с существующим внешним кодом или выполнить именование стандартов или инструкций, можно настроить правило именования значения по умолчанию. Корректировка правила именования значения по умолчанию может сэкономить время, специально для многоскоростных моделей, для которых генератор кода производит уникальную функцию step для каждого уровня.

Если кто-то не задал функциональные шаблоны настройки для модели, Код, Сопоставляющий Редактор, представляет Default как единственную опцию шаблона. Чтобы задать шаблон, используйте Словарь Embedded Coder. Можно открыть словарь путем нажатия.

Прежде, чем сконфигурировать настройки генерации кода по умолчанию для функций, рассмотрите эти вопросы.

ФакторСмотрите
Какие категории относятся к вашей модели?Сконфигурируйте генерацию кода для образцовых функций точки входа
У вас есть требования именования функции? Если ответ да, каковы они? К которым категориям применяются требования?Сконфигурируйте генерацию кода для образцовых функций точки входа и управления форматом идентификатора
Модель использует несколько экземпляров функций, которые находятся в категории? Если ответ да, применение отображений по умолчанию выгодно. Если ответ не, рассмотрите генерацию кода конфигурирования для каждой функции отдельно, как описано в процитированных темах.Настройте сгенерированные интерфейсы функции C и настройте интерфейсы функции точки входа для Simulink функциональные и функциональные блоки вызывающей стороны
Ваше приложение требует, чтобы генератор кода сохранил функциональный код в определенной области памяти?Задайте классы памяти, разделы памяти и шаблоны функций для программной архитектуры и управляйте данными и функциональным размещением в памяти вставкой прагм
Необходимо ли задать новые функциональные шаблоны настройки, чтобы включать как опции в Коде, Сопоставляющем Редактор?Задайте классы памяти, разделы памяти и шаблоны функций для программной архитектуры
Что функциональный шаблон настройки выравнивает с требованиями генерации кода для каждой категории? Задайте функциональные шаблоны настройки и Embedded Coder Dictionary

Этот пример показывает, как использовать Code Mapping Editor, чтобы задать требования генерации кода для образцовых функций. Модель использует несколько уровней выполнения и сконфигурирована для использования одно экземпляра. Генератор кода производит, инициализируют, выполнение, и отключают функции точки входа. Поскольку модель использует несколько уровней, генератор кода производит функцию выполнения для каждого уровня.

В этом примере, требованиях генерации кода для функций точки входа:

  • Сгенерированное хранилище инициализирует и отключает функции в разделе memory functionSlowMem и функции выполнения в разделе memory functionFastMem.

  • Используйте правило именования exSlow_$N, чтобы назвать initialize и функции точки входа terminate. Используйте правило именования exFast_$N, чтобы назвать функции выполнения.

Чтобы сконфигурировать настройки генерации кода по умолчанию для функций, используйте Embedded Coder Dictionary и Code Mapping Editor.

Открытая модель

Откройте копию модели rtwdemo_configdefaults в качестве примера, которую вы ранее создали.

Задайте разделы памяти

Задайте два раздела памяти: functionSlowMem для инициализирует и отключает функции и functionFastMem для функций выполнения.

  1. Откройте Словарь Embedded Coder путем нажатия на Code> C/C++ Code> Embedded Coder Dictionary.

  2. Кликните по вкладке Memory Sections.

  3. Нажмите Add.

  4. В новой строке в нижней части таблицы назовите новый раздел memory functionFastMem. Затем набор:

    • Pre Statement к #pragma start FASTMEM

    • Post Statement к #pragma end FASTMEM

  5. Нажмите Add снова. Назовите раздел memory functionSlowMem. Затем набор:

    • Pre Statement к #pragma start SLOWMEM

    • Post Statement к #pragma end SLOWMEM

Задайте функциональные шаблоны настройки

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

  1. В Словаре Embedded Coder кликните по вкладке Function Customization Templates.

  2. Нажмите Add.

  3. В новой строке таблицы назовите новый шаблон exFastFunction. Затем набор:

    • Function Name к exFast_$N. Это правило именования применяет префиксный exFast_ к имени, которое идентифицирует имя функции генератора кода по умолчанию (например, initialize или step).

    • Memory Section к functionFastMem. Это отображение сопоставляет раздел memory, который вы задали на шаге 2 с новым шаблоном.

  4. Нажмите Add снова. Назовите шаблон exSlowFunction. Затем набор:

    • Function Name к exSlow_$N.

    • Memory Section к functionSlowMem.

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

  1. Чтобы получить доступ к Коду, Сопоставляющему Редактор, включите перспективный режим кода.

  2. В Коде, Сопоставляющем Редактор, кликните по вкладке Function Defaults.

  3. Сконфигурируйте инициализирование и отключите функции точки входа. Для категории Initialize/Terminate выберите шаблон exSlowFunction.

  4. Сконфигурируйте функции точки входа выполнения. Для категории Execution выберите шаблон exFastFunction.

Отображения по умолчанию для модели хранятся как часть модели.

Сгенерируйте и проверьте код

В представлении Code:

  • Откройте файл rtwdemo_configdefaults.c. Щелкните в поле Search. Списки меню сгенерированные функции точки входа:

    • exSlow_initialize

    • exFast_step (называемый периодически, каждые 0.5 секунды)

    • exFast_step1 (называемый периодически, каждая 1 секунда)

    • exFast_step2 (называемый периодически, каждые 1.5 секунды)

    • exSlow_terminate

  • Получить доступ к коду функции точки входа в rtwdemo_configdefaults.c, clidk имя функции. Проверьте, что pragma проверяет утверждения, которые окружают функциональный код. Например:

    .
    .
    .
    #pragma start FASTMEM
    
    void exFast_step2(void)                /* Sample time: [1.5s, 0.0s] */
    {
       DWork.RateTransition1_Buffer0 = ((ex_input1 > 10.0) || (ex_input1 < -10.0));
    }
    
    #pragma end FASTMEM
    
    #pragma start SLOWMEM
    
    void exSlow_initialize(void)
    {
       /* (no initialization code required) */
    }
    
    #pragma end SLOWMEM
    .
    .
    .
    
  • Откройте файл rtwdemo_configdefaults.h. Ищите pragma, проверяют утверждения. Проверьте, что pragma проверяет утверждения, окружают объявления. Например:

    .
    .
    .
    #pragma start SLOWMEM
    extern void exSlow_initialize(void);
    #pragma end SLOWMEM
    
    #pragma start FASTMEM
    extern void exFast_step0(void);
    #pragma end FASTMEM
    .
    .
    .
    

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

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

  1. Если не уже заданный, задайте определения кода (классы памяти, функциональные шаблоны настройки и разделы памяти) в словаре данных. В данном примере используйте определения, заданные в существующем словаре данных exSharedCodeDefs.sldd. См. Определения Генерации кода Доли Между Многоуровневыми моделями и Пользователями.

  2. Соедините модель со словарем данных.

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

Этот пример показывает, как соединить модель model rtwdemo_configdefaults со словарем данных exSharedCodeDefs.sldd. Тот словарь данных включает Словарные определения Embedded Coder для:

  • Раздел Memory internalDataMem с набором Pre Statement к #pragma start INTERNALDATA и набором Post Statement к #pragma end INTERNALDATA.

  • Раздел Memory functionFastMem с набором Pre Statement к #pragma start FASTMEM и набором Post Statement к #pragma end FASTMEM.

  • Раздел Memory functionSlowMem с набором Pre Statement к #pragma start SLOWMEM и набором Post Statement к #pragma end SLOWMEM.

  • Функциональный шаблон настройки exFastFunction с функцией, называющей правило exFast_$N и раздел memory functionFastMem

  • Функциональный шаблон настройки exSlowFunction с функцией, называющей правило exSlow_$N и раздел memory functionSlowMem

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

Соедините модель со словарем данных

  1. Открытая модель rtwdemo_configdefaults.

  2. В окне модели выберите File> Model Properties> Link to Data Dictionary.

  3. В диалоговом окне Model Properties нажмите Browse.

  4. Откройте словарь exSharedCodeDefs.sldd через диалоговое окно Open Data Dictionary.

  5. В диалоговом окне Model Properties нажмите Apply. Диалоговое окно Link Model to Data Dictionary появляется.

  6. Нажмите Migrate data.

  7. В диалоговом окне Migrate Data нажмите Migrate.

  8. Нажмите OK.

  9. В нижнем левом углу модели кликните по значку словаря данных. Словарь открывается в Model Explorer.

  10. В панели Model Hierarchy, под exSharedCodeDefs, выбирают Embedded Coder Dictionary.

  11. В панели Dialog нажмите Open Embedded Coder Dictionary.

  12. Проверьте, что словарь включает необходимые определения кода.

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

  1. В Редакторе Simulink включите перспективный режим кода.

  2. В Коде, Сопоставляющем Редактор, во вкладке Data Defaults, избранная категория Internal data.

  3. В Property Inspector, набор Memory Section к internalDataMem.

  4. Во вкладке Function Defaults, для категории Initialize/Terminate, выбирают функциональный шаблон настройки exSlowFunction. Для категории Execution выберите шаблон exFastFunction.

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

  6. Сгенерируйте и рассмотрите код.

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

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

Если вы соединяете модель со словарем данных Simulink, который включает словарь кодера, который конфигурирует определения кода по умолчанию для категорий данных и функций, можно использовать Код, Сопоставляющий Редактор, чтобы применить значения по умолчанию словаря. В Коде, Сопоставляющем Редактор, на вкладке Data Defaults или Function Defaults, выбирают категорию и устанавливают класс памяти или функциональный шаблон настройки к Dictionary Default. Если кто-то вносит изменение в настройки по умолчанию в разделяемом словаре кодера, генератор кода применяет обновленные настройки по умолчанию при создании кода для модели.

Для получения дополнительной информации смотрите, Конфигурируют Отображение Кода По умолчанию в Разделяемом Словаре.

Сконфигурируйте данные по умолчанию и функциональную генерацию кода программно

Этот пример показывает, как сконфигурировать данные по умолчанию и функциональную генерацию кода, например, модель rtwdemo_configdefaults.The пример использует значение по умолчанию, сопоставляющее интерфейс программирования, чтобы задать требования генерации кода для данных модели и функций. Используйте тот интерфейс, чтобы автоматизировать настройку, или если вы предпочитаете конфигурировать модели программно. Для получения информации о конфигурировании данных по умолчанию и функциональной генерации кода при помощи Кода, Сопоставляющего Редактор, смотрите, Конфигурируют генерацию кода C По умолчанию для Категорий Данных модели и Функций.

Откройте модель

Модель rtwdemo_configdefaults использует несколько уровней выполнения и сконфигурирована для использования одно экземпляра.

open_system('rtwdemo_configdefaults')

Требования генерации кода

В данном примере требования генерации кода:

  • Импортируйте определение типа проекта для данных типа double, DBL_FLOAT, от заголовка file exDblFloat.h.

  • Сигнал импорта ex_input1 для вычисления значения сохранил в памяти и используемый в если еще условие в блоке switch. Импортируйте данные сигнала из заголовка fileexInDataMem.h.

  • Импорт сигнализирует о ex_input2, ex_input3 и ex_input4 для интерполяционных таблиц Table1 и Table2. Импортируйте данные сигнала из заголовочного файла exInDataLut.h.

  • Данные, импортированные в модель от заголовочных файлов exInDataMem.h и exInDataLut.h, имеют тип DBL_FLOAT, стандарт проекта.

  • Параметры UPPER, LOWER, K1 и K2 являются объектами параметра, сохраненными в рабочем пространстве модели. K1 должен быть настраиваемым, чтобы включить калибровку.

  • mode хранилища данных задает данные, которые совместно используются в модели.

  • Элемент данных X представляет задержку блока Unit Delay.

  • Храните данные, которые являются внутренними к модели в разделе memory internalDataMem.

  • Сгенерированное хранилище инициализирует и отключает функции в разделе memory functionSlowMem и функции выполнения в разделе memory functionFastMem.

  • Используйте идентификатор, называющий правило exSlow_$N, чтобы назвать initialize и функции точки входа terminate. Используйте правило именования exFast_$N, чтобы назвать функции выполнения.

  • Экспортируйте объявления выходных данных в заголовочный файл exSysOut.h и определения exSysOut.c.

Для этого примера кто-то, такого как системный архитектор, ранее создал эти определения кода в Словаре Embedded Coder, который является частью словаря данных Simulink ex_configdefault.sldd:

  • Память разделяет internalDataMem, functionFastMem и functionSlowMem.

  • Функциональные шаблоны настройки exFastFunction и exSlowFunction.

Создайте среду для конфигурирования генерации кода для данных и функций

Создайте среду для конфигурирования генерации кода для данных и функций, сопоставленных с моделью rtwdemo_configdefaults путем вызова функционального coder.mapping.create. Можно пропустить этот шаг, если вы ранее открыли модель в режиме Code Perspective.

coder.mapping.create('rtwdemo_condigdefaults');

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

Выровняйте требования генерации кода для данных с доступными категориями данных. Каждая категория имеет набор свойств, которые можно сконфигурировать. Каждое свойство имеет набор возможных значений. Используйте вызовы coder.mapping.defaults.dataCategories, coder.mapping.defaults.allowedProperties и coder.mapping.defaults.allowedValues, чтобы рассмотреть список имен для категорий, свойств и значений интереса.

В данном примере необходимо сконфигурировать настройки по умолчанию для импорта, выходных портов и объектов параметра, сохраненных в рабочем пространстве модели. Получите список доступных категорий данных путем вызова coder.mapping.defaults.dataCategories.

coder.mapping.defaults.dataCategories()
ans = 1x9 cell array
  Columns 1 through 4

    {'Inports'}    {'Outports'}    {'GlobalParameters'}    {'LocalParameters'}

  Columns 5 through 7

    {'ParameterArgum...'}    {'SharedLocalDat...'}    {'GlobalDataStores'}

  Columns 8 through 9

    {'InternalData'}    {'Constants'}

Для категорий данных Inports, Outports, LocalParameters и InternalData идентифицируют свойства, которые можно установить с вызовами coder.mapping.defaults.allowedProperties.

coder.mapping.defaults.allowedProperties('rtwdemo_configdefaults', 'Inports')
ans = 2x1 cell array
    {'StorageClass'}
    {'HeaderFile'  }

coder.mapping.defaults.allowedProperties('rtwdemo_configdefaults', 'Outports')
ans = 4x1 cell array
    {'StorageClass'  }
    {'HeaderFile'    }
    {'DefinitionFile'}
    {'Owner'         }

coder.mapping.defaults.allowedProperties('rtwdemo_configdefaults', 'LocalParameters')
ans = 1x1 cell array
    {'StorageClass'}

coder.mapping.defaults.allowedProperties('rtwdemo_configdefaults', 'InternalData')
ans = 2x1 cell array
    {'StorageClass' }
    {'MemorySection'}

Для категории данных и комбинаций свойства, которые вы хотите установить, идентифицируйте возможные значения с вызовами coder.mapping.defaults.allowedValues. На основе требований и результатов шага b, задайте:

  • StorageClass с категориями Inports, Outports, LocalParameters и InternalData

  • MemorySection с InternalData

Вы не должны определять значения для свойств HeaderFile (для Inports и Outports) и DefinitionFile (Outports) . значения, которые вы устанавливаете для тех свойств, известны строки.

coder.mapping.defaults.allowedValues('rtwdemo_configdefaults', 'Inports', 'StorageClass')
ans = 9x1 cell array
    {'Default'              }
    {'ExportedGlobal'       }
    {'ImportedExtern'       }
    {'ImportedExternPointer'}
    {'Volatile'             }
    {'ExportToFile'         }
    {'ImportFromFile'       }
    {'AutoScope'            }
    {'GetSet'               }

coder.mapping.defaults.allowedValues('rtwdemo_configdefaults', 'Outports', 'StorageClass')
ans = 9x1 cell array
    {'Default'              }
    {'ExportedGlobal'       }
    {'ImportedExtern'       }
    {'ImportedExternPointer'}
    {'Volatile'             }
    {'ExportToFile'         }
    {'ImportFromFile'       }
    {'AutoScope'            }
    {'GetSet'               }

coder.mapping.defaults.allowedValues('rtwdemo_configdefaults', 'LocalParameters', 'StorageClass')
ans = 14x1 cell array
    {'Default'              }
    {'ExportedGlobal'       }
    {'ImportedExtern'       }
    {'ImportedExternPointer'}
    {'Const'                }
    {'Volatile'             }
    {'ConstVolatile'        }
    {'Define'               }
    {'ImportedDefine'       }
    {'ExportToFile'         }
    {'ImportFromFile'       }
    {'FileScope'            }
    {'GetSet'               }
    {'CompilerFlag'         }

coder.mapping.defaults.allowedValues('rtwdemo_configdefaults', 'InternalData', 'StorageClass')
ans = 10x1 cell array
    {'Default'              }
    {'ExportedGlobal'       }
    {'ImportedExtern'       }
    {'ImportedExternPointer'}
    {'Volatile'             }
    {'ExportToFile'         }
    {'ImportFromFile'       }
    {'FileScope'            }
    {'AutoScope'            }
    {'GetSet'               }

coder.mapping.defaults.allowedValues('rtwdemo_configdefaults', 'InternalData', 'MemorySection')
ans = 5x1 cell array
    {'None'           }
    {'MemVolatile'    }
    {'functionFastMem'}
    {'functionSlowMem'}
    {'internalDataMem'}

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

Выровняйте требования генерации кода для функций с доступными функциональными категориями. В данном примере необходимо сконфигурировать настройки по умолчанию для, инициализируют, выполнение и оконечные функции. Получите список доступных функциональных категорий путем вызова coder.mapping.defaults.functionCategories.

coder.mapping.defaults.functionCategories()
ans = 1x3 cell array
    {'InitializeTermi...'}    {'Execution'}    {'SharedUtility'}

Категориями, которые применяются, является InitializeTerminate и Execution.

Для функциональных категорий InitializeTerminate и Execution, идентифицируйте свойства, которые можно установить с вызовами coder.mapping.defaults.allowedProperties.

coder.mapping.defaults.allowedProperties('rtwdemo_configdefaults', 'InitializeTerminate')
ans = 1x1 cell array
    {'FunctionCustomizationTemplate'}

Вы получаете тот же вывод для категории Execution.

Для функциональной категории и комбинаций свойства, которые вы хотите установить, идентифицируйте возможные значения с вызовами coder.mapping.defaults.allowedValues. На основе требований и результатов вызова coder.mapping.defaults.allowedProperties, задайте FunctionCustomizationTemplate с категориями InitializeTerminate и Execution.

coder.mapping.defaults.allowedValues('rtwdemo_configdefaults', 'InitializeTerminate',...
'FunctionCustomizationTemplate')
ans = 3x1 cell array
    {'Default'       }
    {'exSlowFunction'}
    {'exFastFunction'}

Список шаблонов является тем же самым для InitializeTerminate и Execution.

Установите соответствующую категорию, свойство и комбинации значения

Установите соответствующую категорию, свойство и комбинации значения с вызовами coder.mapping.defaults.set.

coder.mapping.defaults.set('rtwdemo_configdefaults', 'Inports',...
  'Storageclass', 'ImportFromFile',...
  'HeaderFile', 'exInDataLut.h');

coder.mapping.defaults.set('rtwdemo_configdefaults', 'Outports',...
  'Storageclass', 'ExportToFile',...
  'HeaderFile', 'exSysOut.h',...
  'DefinitionFile', 'exSysOut.c');

coder.mapping.defaults.set('rtwdemo_configdefaults', 'LocalParameters',...
  'Storageclass', 'ExportedGlobal');

coder.mapping.defaults.set('rtwdemo_configdefaults', 'InternalData',...
  'MemorySection', 'internalDataMem');

coder.mapping.defaults.set('rtwdemo_configdefaults', 'InitializeTerminate',...
  'FunctionCustomizationTemplate', 'exSlowFunction');

coder.mapping.defaults.set('rtwdemo_configdefaults', 'Execution',...
  'FunctionCustomizationTemplate', 'exFastFunction');

Проверьте отображения по умолчанию

Проверьте отображения по умолчанию с вызовами coder.mapping.defaults.get.

coder.mapping.defaults.get('rtwdemo_configdefaults', 'Inports', 'StorageClass')
ans = 
'ImportFromFile'
coder.mapping.defaults.get('rtwdemo_configdefaults', 'Inports', 'HeaderFile')
ans = 
'exInDataLut.h'
coder.mapping.defaults.get('rtwdemo_configdefaults', 'Outports', 'StorageClass')
ans = 
'ExportToFile'
coder.mapping.defaults.get('rtwdemo_configdefaults', 'Outports', 'HeaderFile')
ans = 
'exSysOut.h'
coder.mapping.defaults.get('rtwdemo_configdefaults', 'Outports', 'DefinitionFile')
ans = 
'exSysOut.c'
coder.mapping.defaults.get('rtwdemo_configdefaults', 'LocalParameters',...
    'StorageClass')
ans = 
'ExportedGlobal'
coder.mapping.defaults.get('rtwdemo_configdefaults', 'InternalData',...
    'MemorySection')
ans = 
'internalDataMem'
coder.mapping.defaults.get('rtwdemo_configdefaults', 'InitializeTerminate',...
    'FunctionCustomizationTemplate')
ans = 
'exSlowFunction'
coder.mapping.defaults.get('rtwdemo_configdefaults', 'Execution',...
    'FunctionCustomizationTemplate')
ans = 
'exFastFunction'

Замените установку заголовочного файла

Замените установку заголовочного файла для входного сигнала ex_input1. Ранее вы устанавливаете заголовочный файл по умолчанию для данных в категории Inports к exInDataLut.h. Требования указывают, что вы импортируете данные для того сигнала от заголовочного файла exInDataMem.h.

Создайте указатель на выходной порт блока In1.

portHandles = get_param('rtwdemo_configdefaults/In1', 'PortHandles');
outH = portHandles.Outport;

В базовом рабочем пространстве создайте временный объект сигнала.

temp_Obj = Simulink.Signal
temp_Obj = 
  Signal with properties:

         CoderInfo: [1x1 Simulink.CoderInfo]
       Description: ''
          DataType: 'auto'
               Min: []
               Max: []
              Unit: ''
        Dimensions: -1
    DimensionsMode: 'auto'
        Complexity: 'auto'
        SampleTime: -1
      InitialValue: ''


Во вложенном объекте Simulink.CoderInfo, набор свойство StorageClass к Custom. Then, используют свойство CustomStorageClass задать класс памяти ImportFromFile.

temp_Obj.CoderInfo.StorageClass = 'Custom';
temp_Obj.CoderInfo.CustomStorageClass = 'ImportFromFile';

Задайте специфичный для экземпляра заголовочный файл, exDataInMem.h, во вложенном объекте Simulink.CoderInfo при помощи свойства CustomAttributes.

temp_Obj.CoderInfo.CustomAttributes.HeaderFile='exInDataMem.h';

Встройте объект сигнала в целевую сигнальную линию путем присоединения копии временного объекта рабочей области.

set_param(outH, 'SignalObject', temp_Obj);

Очистите объект от базового рабочего пространства. Сигнал теперь использует встроенную копию объекта.

clear temp_Obj

Ссылки по теме

Неразрешенные классы памяти, функциональные шаблоны настройки и разделы памяти

Если кто-то удаляет определение для класса памяти, функциональный шаблон настройки или раздел memory из Словаря Embedded Coder, сопоставленного с моделью, Code Mapping Editor идентифицирует определение как Unresolved. Например, эти данные показывают, что функциональный шаблон настройки для функций точки входа выполнения был удален из словаря, сопоставленного с моделью.

Чтобы зафиксировать неразрешенное определение кода, выполнить одно из следующих действий:

  • Выберите различное определение в Storage Classes, Function Customization Templates или столбце Memory Sections.

  • Замените или добавьте определение Словарю Embedded Coder. Затем обновите отображение.

  • Консультируйтесь с кем-то еще, таким как системный архитектор для вашего проекта, о добавлении определения Словарю Embedded Coder. Затем обновите отображение.

Устранение параметров и других внутренних данных оптимизацией

Оптимизация генерации кода может устранить данные из кода, что означает, что ваш код приложения не может взаимодействовать с данными. Для получения общей информации об устранении данных оптимизацией, смотрите Как Хранилища Сгенерированного кода Внутренний Сигнал, состояние и Данные о Параметре.

Оптимизация может устранить данные в этих категориях:

  • Global parameters

  • Local parameters

  • Internal data

Оптимизация не может устранить:

  • Данные в других категориях.

  • Данные, в которых код нужен для числовой точности, включая большинство состояний блока, которые находятся в категории Internal data.

После устранения данных с оптимизацией генератор кода применяет настройки генерации кода по умолчанию в Коде, Сопоставляющем Редактор с остающимися данными. Для параметров и сигнальных линий, оптимизация может устранить данные для целой категории. Если это происходит, настройки по умолчанию, которые вы задаете для той категории, не применяются к данным.

Чтобы препятствовать тому, чтобы оптимизация устранила отдельные элементы данных, явным образом примените класс памяти к элементу при помощи Model Data Editor. Класс памяти управляет внешним видом данных в сгенерированном коде. Чтобы обеспечить элемент данных, чтобы использовать, класс памяти по умолчанию, который вы задаете в Коде, Сопоставляющем Редактор, явным образом примените класс памяти Model default. Смотрите Выбирают Класс памяти для Управления Представлением данных в Сгенерированном коде.

Ограничения

  • Для модели, на которую ссылаются сопоставьте категории элемента данных Inports и Outports к Default, встроенному классу памяти или классу памяти пакета. Вы не можете сопоставить эти категории элемента данных с ParamStruct или SignalStruct, которые являются классами памяти в качестве примера, которые создает инструмент Quick Start.

  • Для этих категорий используйте класс памяти в качестве примера SignalStruct или создайте ваш собственный класс структурированного хранилища в Словаре Embedded Coder.

    • Inport

    • Outport

    • Internal data

  • Для этих категорий, настроенных отображений по умолчанию к классу памяти, заданному с выбранным свойством const или набор свойства Data Initialization к Dynamic или None:

    • Inports

    • Outports

    • Категории хранилища данных

    • Internal data

  • Сопоставьте категории параметра с классами памяти, заданными с набором свойств Data Initialization к Static или None.

  • Сопоставьте категории Inport, Outport и Internal data, где по крайней мере один элемент данных в категории задан с символьными размерностями (см., Задают Данные Переменного Размера для Генерации кода (Simulink)), к классу памяти, заданному с набором свойств Data Scope к Imported.

  • Сопоставьте категории элемента данных Global parameters и Global data stores к Default, встроенному классу памяти или классу памяти пакета. Вы не можете сопоставить эти категории элемента данных с классами памяти в качестве примера, которые инструмент Quick Start создает, ParamStruct и SignalStruct.

  • Если модель включает допускающую повторное использование подсистему (подсистема с параметрами блоков набор Function packaging к Reusable function), который содержит разделяемое локальное хранилище данных, сопоставьте категорию Shared local data stores с классом памяти, который задан в Словаре Embedded Coder для той модели. Для получения дополнительной информации смотрите, Генерируют Повторно используемый Код от Подсистем.

  • Для главных и моделей, на которые ссылаются, сконфигурированных для использования мультиэкземпляра (см., Генерируют Повторно используемый Код от Топ-моделей и Генерируют Повторно используемый Код от Функциональных блоков Simulink), сопоставьте категории элемента данных с классами памяти, которые имеют набор свойств Storage Type к Structured.

  • Если модель использует выравнивание объекта данных, не конфигурируйте отображения данных по умолчанию для модели. Для получения дополнительной информации смотрите Simulink.CoderInfo.

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

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

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

  • Вы не можете настроить отображения по умолчанию к:

    • Основанные на структуре встроенные классы памяти, Struct и BitField

    • Классы памяти пакета типа FlatStructure или Other (требует, чтобы вы записали код TLC), который вы создаете с Custom Storage Class Designer

    .

  • Когда модель сконфигурирована для компактной упаковки файла, вы не можете сопоставить категорию элемента данных с классом памяти, заданным с набором свойств Data Scope к Exported и набором свойств Header File к правилу именования кроме $N.h.

  • Классы памяти, заданные в Словаре Embedded Coder, не совместимы с моделями, которые содержат подсистемы одноразового использования с отдельными данными или сконфигурированы, чтобы сгенерировать интерфейс класса C++.

  • Если модель содержит настраиваемый, неличный параметр (например, со значением inf):

    • Если вы задаете неличное значение непосредственно в модели, не используя MATLAB® переменный или объект параметра (такой как Simulink.Parameter), в сгенерированном коде, параметр появляется как поле структуры данных параметра по умолчанию (см. Стандартные Структуры данных в Сгенерированном коде). Параметр не использует класс памяти, который вы задаете для соответствующей категории данных о параметре в Коде, Сопоставляющем Редактор.

    • Если вы храните неличное значение в переменном или объекте параметра для соответствующей категории данных о параметре в Коде, Сопоставляющем Редактор, вы не можете использовать класс памяти, который вы создаете в Словаре Embedded Coder. Когда вы пытаетесь сгенерировать код, модель генерирует ошибку. Выберите одно из этих обходных решений:

Похожие темы