Сгенерированный код может создать стандартные, глобальные структурные переменные, поля которых представляют сигнал, состояние и данные о параметре в модели. С помощью классов памяти можно настроить отображение данных в коде как отдельных глобальных переменных или пользовательских глобальных структур. Для получения информации о стандартных структурах данных смотрите, Как Сгенерированный код хранит внутренний сигнал, Состояние и Данные параметра и Как Сгенерированный код обменивается данными со окружением. Для получения дополнительной информации о классах памяти см. раздел «Выбор класса памяти для контроля представления данных в сгенерированном коде».
Вы можете управлять размещением файлов определений переменных и объявлений. Используйте информацию в таблице.
Цель | Детали и методы |
---|---|
Сгенерируйте переменную, которую может использовать внешний код | Применить класс памяти с экспортированными возможностями данных, например Чтобы сгенерировать Кроме того, чтобы поместить объявление в файл, имя которого вы можете задать, выберите один из следующих методов:
См. Раздел «Обмен данными между кодом внешнего вызова и сгенерированным кодом». |
Сгенерируйте код, который использует переменную, заданную внешним кодом | Применить класс памяти с импортированными возможностями данных, такой как Кроме того, если у вас нет файла заголовка внешнего объявления или вы не хотите, чтобы сгенерированный код включал файл заголовка, примените класс памяти См. Раздел «Обмен данными между кодом внешнего вызова и сгенерированным кодом». |
| В зависимости от настройки Configuration Parameters > File packaging format, сгенерированные файлы, такие как
|
Объедините несколько файлов в один файл |
|
Отделите определения данных от определений функций | По умолчанию сгенерированный файл, который определяет функции точки входа для модели или подсистемы, также определяет данные для этой модели или подсистемы. Когда вы часто вносите изменения в данные, особенно начальные значения для настраиваемых параметров, изменяющиеся файлы исходного кода могут препятствовать верификации и затруднять управление изменениями. Чтобы отделить данные от функций:
|
Изолируйте определения данных в отдельных файлах для разработки модели на основе компонентов, ориентированной на группу | |
Совокупные определения вариантов параметров управления (#define макросы) в один заголовочный файл | Как описано в Generate Preprocessor Conditionals для вариантных систем, параметр управления вариантом является объектом параметра, таким как
|
В зависимости от строения модели определения данных могут появляться агрегированными в больших сгенерированных файлах. В системе компонентов (подсистемы или ссылочные модели) можно разделить и организовать определения данных в управляемые, значимые файлы на основе иерархии компонентов.
Цель | Метод |
---|---|
Установите владение глобальными данными путем размещения определений данных с кодом, сгенерированным для конкретных компонентов | Когда вы делите систему на компоненты с помощью ссылочных моделей и атомарных подсистем, по умолчанию глобальные данные обычно определяются кодом, сгенерированным для верхнего компонента иерархии. Глобальные данные включают параметры, сигналы и состояния, к которым вы применяете классы памяти (см. Строение генерации кода C для элементов интерфейса модели). Вместо этого можно разместить глобальные данные определения с другими компонентами в иерархии. Для примера с участием моделей-ссылок смотрите Установить владение данными в иерархии модели.
|
Для атомарной подсистемы поместите стандартные структуры данных для подсистемы с кодом подсистемы | По умолчанию стандартные структуры данных для атомарной подсистемы появляются как подструктуры структур данных для всей модели. Чтобы сгенерировать отдельные структуры данных для подсистемы, выберите параметр 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>
.