Управление размещением определений и объявлений глобальных данных в сгенерированных файлах

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

Вы можете управлять размещением файлов определений переменных и объявлений. Используйте информацию в таблице.

ЦельДетали и методы
Сгенерируйте переменную, которую может использовать внешний код

Применить класс памяти с экспортированными возможностями данных, например ExportToFile. Сгенерированный код объявляет переменную в файле, который может включать ваш код (#include).

Чтобы сгенерировать extern объявление в model.h, рассмотрите использование класса памяти ExportedGlobal.

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

  • Чтобы агрегировать несколько объявлений переменных в один или несколько определенных заголовочных файлов по умолчанию, примените класс памяти, такой как ExportToFile в категорию данных при помощи редактора Code Mappings. Когда вы добавляете блоки и сигналы к модели, новые элементы данных объявляются в файлах, которые вы задаете.

  • Чтобы явным образом задать размещение для отдельного элемента данных, непосредственно примените класс памяти, такой как ExportToFile и задайте имя файла заголовка с помощью свойства Header file.

См. Раздел «Обмен данными между кодом внешнего вызова и сгенерированным кодом».

Сгенерируйте код, который использует переменную, заданную внешним кодом

Применить класс памяти с импортированными возможностями данных, такой как ImportFromFile, элементу данных в модели, которая представляет переменную. Затем сгенерированный код не определяет переменную, а вместо этого включает (#include) внешний заголовочный файл, имя которого можно задать. Сгенерированный алгоритм (для примера, модель step function) читает и записывает в переменную.

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

См. Раздел «Обмен данными между кодом внешнего вызова и сгенерированным кодом».

  • Уменьшите размер сгенерированного файла, создав несколько небольших файлов

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

В зависимости от настройки Configuration Parameters > File packaging format, сгенерированные файлы, такие как model.c и model_data.c может содержать много определений глобальных переменных. Соответствующие заголовочные файлы могут содержать много объявлений.

  • Чтобы сделать model.c меньший, рассмотрите установку File packaging format на Modular или Compact (with separate data file). Затем сгенерированный код определяет стандартные структуры, которые представляют настраиваемые и постоянные данные параметра в model_data.c вместо model.c.

  • Чтобы по умолчанию поместить различные категории данных (для примера, внешних параметров, состояний блока и внутренних сигналов) в конкретные файлы, используйте редактор Кода Отображений. Для каждой категории данных используйте класс памяти, например ExportToFile и задайте Header file свойства. Смотрите Конфигурацию Генерации кода по умолчанию для данных.

  • Для точного контроля за размещением файлов данных примените классы памяти, такие как ExportToFile к отдельным элементам данных. Используйте свойства класса памяти, такие как Definition file и Header file, чтобы задать размещение файлов для каждого элемента данных. Для получения примера смотрите Определение и Декларацию Сигнальных Данных.

Объедините несколько файлов в один файл

  • Рассмотрите установку параметра конфигурации модели File packaging format равной Compact. Затем генератор кода не создает model_data.c файл. Вместо этого определения стандартных структур, которые хранят настраиваемые и постоянные данные о параметрах, появляются в model.c.

  • Когда вы применяете класс памяти, такой как ExportToFile для элементов данных оставьте свойства Definition file и Header file пустыми, значение по умолчанию. Кроме того, установите параметр конфигурации модели Data definition равным Data defined in source file. Затем определения данных появляются в model.c с определениями других глобальных данных.

Отделите определения данных от определений функций

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

  • Рассмотрите установку File packaging format параметра конфигурации модели на значение, которое приводит к генерации отдельного файла данных model_data.c. Затем определения стандартных структур, которые хранят настраиваемые и постоянные данные параметров, появляются в этом файле вместо в model.c.

  • Применить классы памяти, такие как ExportToFile к элементам данных при помощи редактора Code Mappings. Используйте свойства класса памяти, такие как Definition file и Header file, чтобы задать размещение файлов. Для получения дополнительной информации смотрите Настройте Генерацию кода по умолчанию для данных и Организуйте данные параметра в структуру при помощи Класса памяти Struct.

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

См. «Организация данных для поддержки разработки модели, основанной на компонентах и ориентированной на группу».

Совокупные определения вариантов параметров управления (#define макросы) в один заголовочный файл

Как описано в Generate Preprocessor Conditionals для вариантных систем, параметр управления вариантом является объектом параметра, таким как Simulink.Parameter. Вы применяете класс памяти, который заставляет объект появляться в сгенерированном коде как макрос. Чтобы контролировать размещение файлов, выберите один из следующих методов:

  • Для каждого варианта управляющего параметра, который использует класс памяти Define, установите то же значение свойства Header file. Чтобы сконфигурировать эти объекты в списке, который можно искать, сортировать и фильтровать, можно использовать вкладку Parameters Model Data Editor. Для получения примера смотрите Сгенерировать макросы управления вариантами в том же файле заголовка.

  • Создайте один или несколько классов памяти, которые представляют параметры управления вариантом. В Custom Storage Class Designer можно задать Header file значение, которое применяется ко всем параметрам управления вариантом, которые используют класс памяти. С помощью этого метода вам не нужно вручную задавать файл заголовка для каждого варианта параметра управления. Для получения дополнительной информации смотрите Создание классов памяти при помощи Custom Storage Class Designer.

Организуйте данные для поддержки разработки модели, основанной на компонентах и ориентированной на группу

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

ЦельМетод

Установите владение глобальными данными путем размещения определений данных с кодом, сгенерированным для конкретных компонентов

Когда вы делите систему на компоненты с помощью ссылочных моделей и атомарных подсистем, по умолчанию глобальные данные обычно определяются кодом, сгенерированным для верхнего компонента иерархии. Глобальные данные включают параметры, сигналы и состояния, к которым вы применяете классы памяти (см. Строение генерации кода C для элементов интерфейса модели).

Вместо этого можно разместить глобальные данные определения с другими компонентами в иерархии. Для примера с участием моделей-ссылок смотрите Установить владение данными в иерархии модели.

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

    Чтобы использовать Owner в модели, необходимо выбрать Use owner from data object for data definition placement параметра конфигурации модели. Настройка по умолчанию для этого параметра, очищенная, означает, что генератор кода игнорирует настройку, которую вы задаете для Owner.

    Если только одна модель-ссылка использует объект параметра, рассмотрите хранение объекта в рабочем пространстве модели этой модели. Затем код, сгенерированный для этой модели, определяет данные. Вам не нужно указывать владельца (Owner) для объекта.

  • В атомарной подсистеме используйте класс памяти, такой как ExportToFile и явным образом задайте имя файла определения с помощью свойства Definition file. Однако вы не можете поместить файл определения с исходными файлами, которые относятся к подсистеме. Вместо этого заданный файл определения появляется в папке, сгенерированной для модели.

Для атомарной подсистемы поместите стандартные структуры данных для подсистемы с кодом подсистемы

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

Чтобы сгенерировать отдельные структуры данных для подсистемы, выберите параметр Function with separate data в блоке подсистемы. Затем данные подсистемы появляются в отдельных структурных переменных, которые задает код подсистемы. См. «Генерация кода модульной функции для невиртуальных подсистем».

Задайте размещение по умолчанию

Когда вы создаете данные в модели путем добавления блоков и сигнальных линий, по умолчанию определения данных появляются в model.c. Чтобы задать другое размещение по умолчанию, используйте следующие инструменты и параметры:

  • Модель параметра конфигурации <reservedrangesplaceholder1>. Настройка, которую вы выбираете, определяет, помещает ли генератор кода стандартные структуры, которые хранят настраиваемые и постоянные данные параметра в model_data.c вместо model.c. См. раздел Формат упаковки файлов.

  • Редактор Отображения. Для каждой категории данных моделей можно задать класс памяти по умолчанию, который управляет размещением файлов. Например, применить класс памяти ExportToFile для категории данных и, в Property Inspector, используйте свойства DefinitionFile, HeaderFile и Owner для управления размещением файлов.

  • Модель параметров конфигурации <reservedrangesplaceholder1> и <reservedrangesplaceholder0>. Эти параметры конфигурации определяют размещение файлов по умолчанию для элементов данных, к которым вы применяете классы памяти.

    • Эти параметры конфигурации не влияют на элементы данных, к которым вы применяете эти классы памяти:

      • ExportedGlobal

      • ImportedExtern

      • ImportedExternPointer

      • BitField

      • FileScope

      • Localizable

      • Struct

      • CompilerFlag

      В Embedded Coder® Словарь, значение Header File для неподдерживаемых классов памяти пустое. Вы не можете задать размещение файлов по умолчанию для неподдерживаемых классов памяти.

    • Если вы применяете класс памяти, который явно задает файлы определения и объявления для элемента данных, эти спецификации переопределяют параметры конфигурации Data definition и Data declaration.

    Для получения дополнительной информации смотрите Определение данных и Объявление данных.

  • Подсистема параметров блоков Function with separate data. При выборе этого параметра стандартные структуры, которые хранят данные подсистемы, такие как структура DWork, появляются как отдельные структурные переменные. По умолчанию определения переменных появляются в исходном файле, который определяет функцию выполнения подсистемы. См. «Генерация кода модульной функции для невиртуальных подсистем».

Переопределение размещения по умолчанию для отдельных элементов данных

Для отдельного элемента данных, чтобы переопределить размещение файлов по умолчанию, используйте редактор Code Mappins, чтобы применить класс памяти непосредственно. Для примера, чтобы элемент данных появился в сгенерированном коде как глобальная переменная, примените класс памяти ExportToFile. Затем используйте свойства Definition file и Header file для управления размещением файлов. Для непосредственного применения классов памяти смотрите Упорядочить данные параметра в структуру при помощи Класса памяти Struct.

Предотвратите конфликты имен путем настройки элемента данных как static

Для применения ключевого слова C static для глобальной переменной, которая может помочь вам избежать конфликтов имен путем ограничения возможностей имени переменной файлом, который определяет переменную, выберите один из следующих методов:

  • Применить встроенный класс памяти FileScope. Для получения дополнительной информации смотрите Выбор класса памяти для управления представлением данных в сгенерированном коде.

  • Если FileScope не удовлетворяет вашим требованиям, создайте свой собственный класс памяти с помощью Custom Storage Class Designer. В Designer установите Data scope равным File или Auto.

    • С Fileэлемент данных появляется в коде как static глобальная переменная.

    • С Autoгенератор кода сначала пытается представлять элемент данных с локальной переменной в функции. Если эта попытка не удаётся, генератор кода использует static глобальная переменная.

    Пример, в котором показано, как создать свои собственные классы памяти с помощью Designer, см. в разделе Создание и применение Класса памяти.

Вы не можете применить static к стандартным структурам данных, таким как структура DWork.

Для доступа к static можно сконфигурировать сгенерированный код таким образом, чтобы он включал интерфейс, такой как a2l (ASAP2) файл. Для получения дополнительной информации см. «Экспорт файла ASAP2 для измерения данных и калибровки». Чтобы поместить данные в определенное место памяти путем включения прагм или других украшений в сгенерированный код, создайте свой собственный раздел памяти и класс памяти. Смотрите Control Data and Function Placement in Memory путем вставки прагм.

Влияние генерации кода места хранения для объектов параметра

Можно создать объект параметра (например Simulink.Parameter) в базовом рабочем пространстве, рабочем пространстве модели или словаре данных. Однако, когда вы применяете класс памяти к объекту, расположение объекта может повлиять на размещение файла соответствующего определения данных в сгенерированном коде. Смотрите Влияние Генерации кода Места хранения для Объектов параметра.

Задайте #include по умолчанию Синтаксис файлов заголовков данных

Чтобы контролировать размещение файла элемента данных, такого как сигнальная линия или состояние блока, в сгенерированном коде, можно применить класс памяти к элементу данных (см. Раздел «Организация данных параметра в структуру» при помощи класса Struct Storage). Затем вы используете свойство Header file, чтобы задать сгенерированный или внешний файл заголовка, который содержит объявление данных.

Чтобы уменьшить усилия по обслуживанию и вводу данных, когда вы задаете Header file, можно опустить разделители (" или <>) и использовать только имя файла. Затем можно управлять разделителями по умолчанию, которые сгенерированный код использует для соответствующих #include директивы. Чтобы использовать угловые кронштейны по умолчанию, установите Configuration Parameters> Code Generation> Code Placement> #include file delimiters к #include <header.h>.

Похожие темы