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

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

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

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

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

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

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

Задавать настройки генерации кода по умолчанию для данных модели и функционирует в интерактивном режиме в Редакторе Simulink во вкладке C Code, используйте редактор Отображений Кода и Property Inspector. Чтобы отобразить эти инструменты, нажмите Code Mappings - C и вкладки Property Inspector или выберите Settings> Code Mappings и Settings> Property Inspector. Редактор Отображений Кода состоит из таблиц с вкладками: Data Defaults, Function Defaults и Functions. Чтобы сопоставить категории элементов данных модели с классами памяти, используйте таблицу Data Defaults. Чтобы сопоставить функции с функциональными шаблонами настройки, используйте таблицу Function Defaults. Когда вы выбираете строку в одной из таблиц, раздел Code Property Inspector показывает настройки свойства для того элемента данных или функциональной категории.

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

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

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

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

Редактор Отображений Кода представляет допустимые опции класса памяти для данной категории. Опции могут включать:

  • Незаданный класс памяти (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

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

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

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

  • Используйте определение типа проекта 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.

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

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

  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.

    exCodeDefs.sldd

    Словарь данных

    rtwdemo_configdefaults.slx

    Модель Example.

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

  3. В галерее Apps откройте приложение Embedded Coder.

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

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

  1. Во вкладке C Code, под Code Mappings - C, кликают по вкладке Data Defaults.

  2. Выберите категорию Inports. Установите класс памяти на ImportFromFile.

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

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

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

  1. Откройте Model Data Editor путем нажатия на вкладку Model Data Editor.

  2. В Code представление Model Data Editor, кликните по вкладке Inports/Outports.

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

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

  5. Установите Header File на exInDataMem.h.

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

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

  1. Откройте редактор Отображений Кода путем нажатия на вкладку Code Mappings - C.

  2. Кликните по вкладке Data Defaults.

  3. Кликните по вкладке Model parameters.

  4. Установите класс памяти на ExportedGlobal, который заставляет объекты параметра появиться в сгенерированном коде как настраиваемые глобальные переменные.

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

Препятствуйте тому, чтобы оптимизация генератора кода устранила K1 от сгенерированного кода. Требования к данным указывают на тот K1 должно быть настраиваемым. Предотвратить потенциальное устранение переменной из сгенерированного кода:

  1. Откройте Model Data Editor путем нажатия на вкладку Model Data Editor.

  2. В Code представление Model Data Editor, кликните по вкладке Parameters.

  3. Выберите строку для параметра рабочего пространства модели K1.

  4. Установите класс памяти для K1 к Model default.

Для получения дополнительной информации смотрите Устранение Параметров и Других Внутренних Данных Оптимизацией.

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

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

  1. Откройте редактор Отображений Кода путем нажатия на вкладку Code Mappings - C.

  2. Откройте Словарь Embedded Coder путем выбора Settings> Embedded Coder Dictionary.

  3. В Словаре Embedded Coder кликните по вкладке 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 для внутренних данных

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

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

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

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

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

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

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

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

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

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

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

  1. Сгенерируйте код.

  2. Проверьте сгенерированный код. В представлении Code:

  • Открытый файл rtwdemo_configdefaults.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 управляйте линиями, которые задают разделы памяти для INTERNALDATA (локальное хранилище данных, единичная задержка и константы).

    #pragma start INTERNALDATA
    
    D_Work rtDWork;
    
    #pragma end INTERNALDATA
    
    #pragma start INTERNALDATA
    
    RT_MODEL rtM_;
    
    #pragma end INTERNALDATA
    .
    .
    .
    pragma start INTERNALDATA
    
    extern D_Work rtDWork;
    
    #pragma end INTERNALDATA
    
  • Открытый файл exSysOut.c. Файл включает экспортируемое определение данных для rtOut1.

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

    extern DBL_FLOAT rtOut1;
    

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

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

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

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

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

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

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

Если кто-то не задал функциональные шаблоны настройки для модели, редактор Отображений Кода представляет Default как единственная опция шаблона. Чтобы задать шаблон, используйте Словарь Embedded Coder. Откройте словарь путем выбора Settings> Embedded Coder Dictionary на вкладке C Code.

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

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

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

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

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

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

Этот пример также принимает, что вы настроили среду в качестве примера как описано в Настроенной Среде В качестве примера.

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

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

  1. Откройте Словарь Embedded Coder путем выбора Settings> Embedded Coder Dictionary.

  2. В Словаре Embedded Coder кликните по вкладке 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, в котором вы задали, Задают Разделы Памяти с новым шаблоном.

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

    • Function Name к exSlow_$N.

    • Memory Section к functionSlowMem.

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

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

  1. В Редакторе Simulink, во вкладке C Code, нажимают Code Mappings - C.

  2. Cick вкладка Function Defaults.

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

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

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

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

  1. Сгенерируйте код.

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

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

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

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

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

      • exSlow_initialize

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

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

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

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

У вас есть опция конфигурирования данных по умолчанию и функциональной генерации кода с определениями, которые настраиваются в словаре данных Simulink. Словарь данных позволяет совместно использовать определений кода между моделями. В этом примере показано, как изменить модель от использования определений кода в Словаре Embedded Coder модели специфичном к использованию определений в Словаре Embedded Coder, который находится в словаре разделяемых данных. Если вы завершились, примеры в Конфигурируют Генерацию кода По умолчанию для Данных и Конфигурируют Генерацию кода По умолчанию для Функций, вы добавили эти определения кода Словарю Embedded Coder, сопоставленному с моделью rtwdemo_configdefaults.

  • Раздел 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

Обновите модель rtwdemo_configdefaults использовать те же определения кода в словаре данных exCodeDefs.sldd вместо определений в Словаре Embedded Coder локальной модели.

Вы, должно быть, настроили среду в качестве примера, как описано в Настроенной Среде В качестве примера.

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

  1. В Редакторе Simulink выберите Modeling> Data Dictionary.

  2. В диалоговом окне Model Properties, во вкладке Data, обзоре к местоположению вашей копии файла словаря данных exCodeDefs и выберите тот файл.

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

  4. В диалоговом окне Link Model to Data Dictionary нажмите Apply.

  5. В диалоговом окне Migrate Data нажмите Migrate. Когда миграция данных будет завершена, нажмите OK.

Рассмотрите содержимое соединенного словаря данных

  1. В нижнем левом углу холста модели кликните по значку Model data.

  2. Из списка источников данных модели нажмите Data Dictionary.

  3. В Model Explorer, в панели Model Hierarchy, расширяют узел exCodeDefs.

  4. Щелкните правой кнопкой по Embedded Coder Dictionary.

  5. Нажмите кнопку Open Embedded Coder Dictionary, которая появляется.

  6. В Словаре Embedded Coder рассмотрите определения во вкладках Memory Sections и Function Customization Templates.

  7. Закройте словарь Embedded Coder.

Удалите полученные определения кода модели из словаря Embedded Coder модели

  1. В Редакторе Simulink кликните по вкладке C Code.

  2. Выберите Settings> Embedded Coder Dictionary.

  3. Удалите определения кода, созданные локально в модели.

    • Во вкладке Function Customization Templates выберите строки для exSlowFunction и exFastFunction этому установили Source на rtwdemo_configdefaults. Нажмите Remove.

    • Во вкладке Memory Sections выберите строки для functionFastMem, functionSlowMem, и internalDataMem этому установили Source на rtwdemo_configdefaults. Нажмите Remove.

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

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

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

  1. Во вкладке Simulink Editor C Code кликните по вкладке Code Mappings - C.

  2. В редакторе Отображений Кода кликните по вкладке Data Defaults.

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

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

  5. Кликните по вкладке Function Defaults.

    • Для категории Initialize/Terminate выберите функциональный шаблон настройки exSlowFunction.

    • Для категории Execution выберите шаблон exFastFunction.

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

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

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

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

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

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

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

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

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

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

open_system('rtwdemo_configdefaults')

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

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

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

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

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

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

  • Параметры UPPERниже, 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 exCodeDefs.sldd:

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

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

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

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

coder.mapping.create('rtwdemo_configdefaults');

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

Выровняйте требования генерации кода для данных с доступными категориями данных. Каждая категория имеет набор свойств, которые можно сконфигурировать. Каждое свойство имеет набор возможных значений. Используйте вызовы 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'}    {'ModelParameters'}    {'ModelParameter...'}

  Columns 5 through 7

    {'ExternalParame...'}    {'SharedLocalDat...'}    {'GlobalDataStores'}

  Columns 8 through 9

    {'InternalData'}    {'Constants'}

Для категорий данных Inports, Outports, ModelParameters, и 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', 'ModelParameters')
ans = 1x1 cell array
    {'StorageClass'}

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

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

  • StorageClass с категориями Inports, Outports, ModelParameters, и 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', 'ModelParameters', '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', 'ModelParameters',...
  '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', 'ModelParameters',...
    '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. Затем используйте 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, сопоставленного с моделью, редактор Отображений Кода идентифицирует определение как Unresolved. Например, этот рисунок показывает, что функциональный шаблон настройки для функций точки входа выполнения был удален из словаря, сопоставленного с моделью.

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

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

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

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

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

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

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

  • Model parameters

  • Model parameter arguments

  • External parameter objects

  • 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

    • Shared local data stores

    • Global data stores

    • Internal data

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Похожие темы