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

Сгенерированный код может создать стандарт, глобальные переменные структуры, поля которых представляют сигнал, состояние и данные о параметре в модели. С классами памяти можно сконфигурировать данные, чтобы появиться в коде как отдельные глобальные переменные или пользовательские глобальные структуры. Для получения информации о стандартных структурах данных смотрите, Как Хранилища Сгенерированного кода Внутренний Сигнал, состояние и Данные о Параметре и Как Сгенерированный код Обменивается Данными со Средой. Для получения информации о классах памяти смотрите, Выбирают Storage Class for Controlling Data Representation in Generated Code.

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

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

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

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

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

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

  • Чтобы явным образом задать размещение для отдельного элемента данных, непосредственно примените класс памяти, такой как ExportToFile и задайте имя заголовочного файла при помощи пользовательского атрибута Header file. Чтобы сконфигурировать несколько элементов данных в списке, который можно искать, отсортируйте, и фильтр, используйте Model Data Editor (см. Configure Data Properties при помощи Model Data Editor (Simulink)).

Смотрите обмениваются данными между внешним кодом вызова и сгенерированным кодом.

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

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

Также, если вы не имеете заголовочного файла внешнего объявления или не хотите, чтобы сгенерированный код включал заголовочный файл, применил класс памяти 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, чтобы задать размещение файла для каждого элемента данных. Чтобы сконфигурировать несколько элементов данных целиком, можно использовать Model Data Editor. Для примера см. Определение и Объявление Данных сигнала.

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

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

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

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

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

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

Смотрите организуют данные, чтобы поддержать компонентно-ориентированную, ориентированную командой разработку моделей.

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

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

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

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

Организуйте данные, чтобы поддержать компонентно-ориентированную, ориентированную командой разработку моделей

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

ЦельМетод

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

Когда вы делите систему на компоненты при помощи моделей, на которые ссылаются, и атомарных подсистем, по умолчанию, глобальные данные обычно задаются кодом, сгенерированным для главного компонента в иерархии. Глобальные данные включают параметры, сигналы, и утверждают, к которому вы применяете классы памяти (см., Применяют Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра).

Вместо этого можно поместить определения глобальных данных с другими компонентами в иерархии. Для примера, включающего модели, на которые ссылаются, смотрите, Устанавливают Владение Данных в Системе Компонентов.

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

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

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

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

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

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

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

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

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

  • Образцовый параметр конфигурации File packaging format. Установка, которую вы выбираете, определяет, помещает ли генератор кода стандартные структуры, которые хранят настраиваемые и постоянные данные о параметре в model_data.c вместо model.c. Смотрите, что Файл группирует формат.

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

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

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

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

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

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

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

Для отдельного элемента данных, чтобы заменить размещение файла по умолчанию, используют Model Data Editor, чтобы применить класс памяти непосредственно. Например, чтобы заставить элемент данных появиться в сгенерированном коде как глобальная переменная, примените пользовательский класс памяти ExportToFile. Затем используйте Definition file, пользовательские атрибуты Header file, чтобы управлять размещением файла. Чтобы применить классы памяти непосредственно, смотрите, Применяют Пользовательские Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра.

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

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

  • Примените встроенный класс памяти FileScope. Для получения дополнительной информации смотрите, Выбирают Storage Class for Controlling Data Representation in Generated Code.

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

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

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

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

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

Чтобы получить доступ к данным static, можно сконфигурировать сгенерированный код, чтобы включать интерфейс, такой как a2l (ASAP2) файл. Для получения дополнительной информации смотрите Экспорт Файл ASAP2 для Измерения Данных и Калибровки. Чтобы поместить данные в определенную ячейку памяти включением прагм или других художественных оформлений в сгенерированном коде, создайте свой собственный раздел memory и пользовательский класс памяти. Смотрите Данные об Управлении и Функциональное Размещение в Памяти Вставкой Прагм.

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

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

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

Чтобы управлять размещением файла элемента данных, такого как сигнальная линия или состояние блока, в сгенерированном коде, можно применить класс памяти к элементу данных (см., Применяют Пользовательские Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра). Вы затем используете пользовательский атрибут Header file, чтобы задать сгенерированный или внешний заголовочный файл, который содержит объявление данных.

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

Похожие темы