exponenta event banner

Упорядочение данных по структурам в сгенерированном коде

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

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

ЦельТехника

Управление характеристиками стандартных структур данных. Например, укажите имена типов структуры, переменные структуры и имена полей.

С помощью Embedded Coder ® см. раздел Имена типов управляющих данных в сгенерированном коде (Embedded Coder).

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

С помощью встроенного кодера см. раздел Управление данными и размещением функций в памяти путем вставки прагматиков (встроенный кодер).

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

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

  • При создании неповторяющегося одинарного кода установите для параметра конфигурации модели Code interface packaging значение Nonreusable function, создайте плоские глобальные структурные переменные, применив встроенный класс хранения Struct. Можно также использовать классы хранения примеров, созданные с помощью средства быстрого запуска. ParamStruct и SignalStructили создайте и примените собственный структурированный класс хранения.

  • При создании многоэкземплярного (повторно вводимого) кода из модели или компонента, например, путем установки для упаковки интерфейса кода значения, отличного от Nonreusable function, в редакторе сопоставлений кода нельзя использовать встроенный класс хранения Struct или структурированный класс хранения, созданный в пакете. Вместо этого создайте собственный структурированный класс хранения с помощью словаря встроенного кодера. При использовании средства быстрого запуска Embedded Coder для подготовки модели к созданию кода (см. раздел Создание кода с помощью средства быстрого запуска (Embedded Coder)) можно использовать примеры классов хранения ParamStruct и SignalStruct.

  • Этот метод нельзя использовать для агрегирования глобальных хранилищ данных или глобальных параметров (включая объекты параметров, хранящиеся в базовой рабочей области или словаре данных). Для этих видов данных используйте другие методы создания структур.

Дополнительные сведения о редакторе отображения кода см. в разделе Настройка генерации кода C по умолчанию для категорий элементов и функций данных (встроенный кодер). Для создания собственного класса хранения см. раздел Определение классов хранения, разделов памяти и шаблонов функций для архитектуры программного обеспечения (Embedded Coder).

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

Создать Simulink.Bus объект, представляющий требуемый тип структуры. Используйте объект bus, чтобы задать типы данных невоиртуальных сигналов шины и структуры параметров в модели.

Сведения о создании массива структур см. в разделе Массивы структур.

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

Создать Simulink.Bus объект, представляющий требуемый тип структуры. Если внешний код уже определяет тип, используйте Simulink.importExternalCTypes для создания объекта шины. Используйте объект bus, чтобы задать типы данных невоиртуальных сигналов шины и структуры параметров в модели. Пример см. в разделе Обмен структурированными и перечисленными данными между сгенерированным и внешним кодом (встроенный кодер).

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

  • Уменьшение числа аргументов для функций точки входа модели, из которой создается код, например model_stepсм. раздел Сокращение числа аргументов с помощью структур.

  • Чтобы уменьшить число аргументов для функций точки входа ссылочной модели, в ссылочной модели:

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

Упорядочить данные таблицы подстановки в структуру.

Использовать Simulink.LookupTable и Simulink.Breakpoint объекты. Посмотрите Simulink.LookupTable.
Создать битовые поля.См. разделы Bitfields (Embedded Coder) и Optimize Generated Code By Packing Boolean Data To Bitfields (Embedded Coder).

Методы создания структур

Для создания структур в созданном коде можно использовать следующие методы:

  • Примените структурированный класс хранения к категориям данных с помощью редактора сопоставления кодов. При добавлении блоков и сигналов в модель новые элементы данных получают этот класс хранения по умолчанию.

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

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

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

СпособностьПриложение по умолчанию класса структурированного хранилищаПрямое применение класса структурированного хранилища Невиртуальные шины и структуры параметров
Агрегация новых элементов данных в структуру по умолчанию

Да

НетНет
Предотвращение исключения целевых данных путем оптимизации (укажите, что данные появляются в созданном коде)

Нет

ДаТолько при непосредственном применении класса хранения, например ExportedGlobal к шине или конструкции
Объединение данных в структуру без изменения внешнего вида блок-схемы

Да

ДаНет
Размещение данных о сигнале, состоянии и параметрах в одной структуреНетДаНет
Включение данных о состоянии в структуруДаДаНет
Организация структур во вложенные структурыНетНетДа
Организация структур в массив структурНетНетДа
Имя элемента управления типа структуры

Да

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

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

НетДа
Требуется встроенный кодерДаДаНет

Приложение по умолчанию класса структурированного хранилища

Класс хранения по умолчанию можно применить к категории данных модели. При добавлении блоков и сигналов в модель связанные данные получают заданный класс хранения по умолчанию. Для агрегирования новых данных в структуры по умолчанию можно применить структурированные классы хранения. Необходимо использовать классы хранения примеров ParamStruct и SignalStruct создан инструментом быстрого запуска или создайте собственный класс хранения с помощью словаря встроенного кодера.

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

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

Дополнительные сведения о редакторе отображения кода см. в разделе Настройка генерации кода C по умолчанию для категорий элементов и функций данных (встроенный кодер). Чтобы создать собственный класс хранения с помощью словаря встроенного кодера, см. раздел Создание определений кода для использования в редакторе сопоставлений кода (Embedded Coder).

Прямое применение класса структурированного хранилища

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

Для непосредственного применения класса хранения используйте Редактор данных модели (на вкладке Моделирование щелкните Редактор данных модели). Задать для параметра «Изменить представление» значение Code и примените класс хранения с помощью столбца Класс хранения.

Пример использования Struct, см. раздел Настройка параметров для генерации кода C (встроенный кодер). Дополнительные сведения о применении классов хранения см. в разделе Организация данных параметров в структуру с помощью класса хранилища Struct (встроенный кодер).

Невиртуальные шины и структуры параметров

  • Чтобы создать сигнал невиртуальной шины, используйте блок Bus Creator для организации нескольких сигнальных линий в одну шину или настройте блок Inport или Outport как невиртуальную шину. Необходимо создать Simulink.Bus объект, представляющий тип структуры. Пример см. в разделе Структуры сигналов. Общие сведения о невиртуальных шинах см. в разделе Группирование сигнальных линий в виртуальные шины.

  • Для создания структуры параметров используйте команды MATLAB ® или редактор переменных, чтобы упорядочить значения нескольких параметров блока в структуру MATLAB. При необходимости создайте Simulink.Bus для управления именем типа структуры и другими признаками, такими как тип данных и измерения каждого поля. Пример см. в разделе Структуры параметров. Общие сведения о структурах параметров см. в разделе Организация связанных определений параметров блоков в структурах.

Структуры параметров

Создайте структуру в созданном коде. В структуре хранятся данные параметров.

Конструкция C

typedef struct {
  double G1;
  double G2;
} myStructType;

myStructType myStruct = {
  2.0,
  -2.0
} ; 

Процедура

1. Открыть пример модели rtwdemo_paraminline.

2. На вкладке Моделирование (Modeling) щелкните Редактор данных модели (Model Data Editor). В Редакторе данных модели (Model Data Editor) выберите вкладку Параметры (Parameters).

3. В модели щелкните блок усиления с меткой G1. В редакторе данных модели используйте столбец Значение (Value), чтобы задать значение параметра Коэффициент усиления (Gain) равным myStruct.G1.

4. Установите значение параметра Gain в поле G2 блок в myStruct.G2.

5. Рядом с myStruct.G2нажмите кнопку действия (с тремя вертикальными точками) и выберите «Создать».

6. В диалоговом окне «Создание новых данных» задайте для параметра «Значение» значение Simulink.Parameter(struct) и нажмите кнопку «Создать». A Simulink.Parameter объект с именем myStruct отображается в базовой рабочей области.

7. В диалоговом окне «Свойство Simulink.Parameter» рядом со свойством «Значение» нажмите кнопку действия и выберите «Открыть редактор переменных».

8. Щелкните правой кнопкой мыши пробел в столбце «Поле» и выберите «Создать». Присвойте имя новому полю структуры G1. Используйте столбец Значение (Value), чтобы установить значение поля в 2.

9. Добавить поле G2 значение которого - -2, а затем закройте редактор переменных.

10. В диалоговом окне свойств Simulink.Parameter на вкладке «Создание кода» установите для класса Storage значение ExportedGlobal. Структура myStruct отображается в созданном коде как глобальная переменная.

11. Создайте код из модели.

Результаты

Созданный файл заголовка rtwdemo_paraminline_types.h определяет тип структуры, имеющий случайное имя.

typedef struct {
  real_T G1;
  real_T G2;
} struct_6h72eH5WFuEIyQr5YrdGuB;

Исходный файл rtwdemo_paraminline.c определяет и инициализирует структурную переменную myStruct.

/* Exported block parameters */
struct_6h72eH5WFuEIyQr5YrdGuB myStruct = {
  2.0,
  -2.0
} ;                                    /* Variable: myStruct
                                        * Referenced by:
                                        *   '<Root>/G1'
                                        *   '<Root>/G2'
                                        */

Указать имя типа структуры

1. При необходимости укажите имя для определения типа структуры (struct). В командной строке используйте функцию Simulink.Bus.createObject для создания Simulink.Bus объект, представляющий тип структуры.

2. Имя объекта по умолчанию: slBus1. Измените имя путем копирования объекта в новую переменную MATLAB.

3. В редакторе данных модели нажмите кнопку Показать/обновить дополнительную информацию.

4. В таблице данных найдите строку, которая соответствует myStruct. Используйте столбец «Тип данных» для установки типа данных myStruct кому Bus: myStructType.

5. Создайте код из модели.

Код создает определение типа структуры. myStructType и использует этот тип для определения глобальной переменной myStruct.

myStructType myStruct = {
  2.0,
  -2.0
} ;                                    /* Variable: myStruct

Структуры сигналов

В этом примере показано, как создать структуру сигнальных данных в сгенерированном коде.

Конструкция C

typedef struct {
   double signal1;
   double signal2;
   double signal3;
} my_signals_type;

Процедура

Чтобы представить тип структуры в модели, создайте Simulink.Bus объект. Используйте объект в качестве типа данных сигналов шины в модели.

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

2. Чтобы настроить блок Bus Creator на прием трех входов, в диалоговом окне блока задайте для параметра Количество входов значение 3.

3. На панели инструментов на вкладке «Моделирование» в разделе «Проектирование» выберите «Редактор шины».

4. В редакторе шины щелкните Файл > Добавить шину, чтобы создать Simulink.Bus объект и его имя my_signals_type. Щелкните Файл > Добавить/Вставить BusElement, чтобы добавить три сигнальных элемента: signal1, signal2, и signal3. Дополнительные сведения см. в разделе Создание и указание объектов Simulink.Bus.

5. Сохранить объекты шины в текущей папке как ex_signal_struct_data.mat.

Этот объект шины представляет тип структуры, который должен использоваться сгенерированным кодом.

6. В диалоговом окне «Bus Creator block» установите для параметра «Output data type» значение Bus: my_signals_type.

7. Выберите Output как nonvirtual bus. Нажмите кнопку OK. Nonvirtual bus появится в сгенерированном коде в виде структуры.

8. Откройте приложение Simulink Coder. На вкладке C Code выберите Code Interface > Individual Element Code Mappings.

9. Откройте закладку Signals/States (Сигналы/Состояния). В модели выберите выходной сигнал блока Bus Creator и нажмите кнопку Add selected signals to code mappings в редакторе Code Mappings.

11. Для добавленного сигнала установите для параметра Storage Class значение ExportedGlobal.

12. В инспекторе свойств задайте для свойства «Код» > «Идентификатор» значение sig_struct_var. Выходные данные блока Bus Creator отображаются в сгенерированном коде как отдельная глобальная структурная переменная с именем sig_struct_var.

13. Создайте код из модели.

Результаты

Созданный файл заголовка ex_signal_struct_types.h определяет тип структуры my_signals_type.

typedef struct {
  real_T signal1;
  real_T signal2;
  real_T signal3;
} my_signals_type;

Исходный файл ex_signal_struct.c выделяет память для глобальной переменной sig_struct_var, который представляет выходные данные блока Bus Creator.

/* Exported block signals */
my_signals_type sig_struct_var;        /* '<Root>/Bus Creator' */

В том же файле, в модели step функция, алгоритм обращается sig_struct_var и области sig_struct_var.

Вложенные структуры сигналов

В созданном коде можно создать вложенные структуры сигнальных данных.

Конструкция C

typedef struct {
  double signal1;
  double signal2;
  double signal3;
} B_struct_type;

typedef struct {
  double signal1;
  double signal2;
} C_struct_type;

typedef struct {
  B_struct_type subStruct_B;
  C_struct_type subStruct_C;
} A_struct_type;

Процедура

Чтобы представить тип структуры в модели, создайте Simulink.Bus объект. Используйте объект в качестве типа данных сигналов шины в модели.

Чтобы вложить структуру в другую структуру, используйте объект шины в качестве типа данных сигнального элемента в другом объекте шины.

1. Создать ex_signal_nested_struct модель с блоками усиления, блоками создания шины и блоком единичной задержки. Блоки усиления и единичной задержки делают структуру более идентифицируемой в сгенерированном коде.

2. Чтобы настроить блок Bus Creator на прием трех входов, в диалоговом окне блока задайте для параметра Количество входов значение 3.

3. На панели инструментов на вкладке «Моделирование» в разделе «Проектирование» выберите «Редактор шины».

В редакторе шины щелкните Файл > Добавить шину, чтобы создать Simulink.Bus объект и его имя A_struct_type. Щелкните Файл > Добавить/Вставить BusElement, чтобы добавить два сигнальных элемента: subStruct_B и subStruct_C. Дополнительные сведения см. в разделе Создание и указание объектов Simulink.Bus. Этот объект шины представляет тип структуры верхнего уровня, который должен использоваться сгенерированным кодом.

4. Аналогично, создать Simulink.Bus объекты B_struct_type (с тремя сигнальными элементами) и C_struct_type (с двумя сигнальными элементами).

5. В A_struct_type объект, для subStruct_B элемент, задайте для DataType значение Bus: B_struct_type и subStruct_C кому Bus: C_struct_type.

Каждый элемент сигнала в A_struct_type использует другой объект шины в качестве типа данных. Теперь эти элементы представляют подструктуры.

6. В диалоговом окне блока Bus Creator, который собирает три сигнала усиления, установите тип данных Output в значение Bus: B_struct_type. Нажмите кнопку «Применить».

7. Выберите Output as nonvirtual bus и нажмите OK.

8. В диалоговом окне другого подчиненного блока Bus Creator установите тип данных Output равным Bus: C_struct_type и выберите Output как nonvirtual bus. Нажмите OK.

9. В последнем диалоговом окне блока Bus Creator установите для параметра «Тип выходных данных» значение Bus: A_struct_type и выберите Output как nonvirtual bus. Нажмите OK.

10. Откройте приложение Simulink Coder. На вкладке C Code выберите Code Interface > Individual Element Code Mappings.

11. Откройте закладку Signals/States (Сигналы/Состояния). В модели выберите выходной сигнал A_struct_type Блок Bus Creator, который подает блок Unit Delay. Нажмите кнопку Add selected signals to code mappings в редакторе Code Mappings.

12. Для добавленного сигнала установите для параметра Storage Class значение ExportedGlobal.

13. В инспекторе свойств задайте для свойства «Код» > «Идентификатор» значение sig_struct_var. Выходные данные блока Bus Creator отображаются в сгенерированном коде как отдельная глобальная структурная переменная с именем sig_struct_var.

14. Создайте код из модели.

Результаты

Созданный файл заголовка ex_signal_nested_struct_types.h определяет типы структуры. Каждый тип структуры соответствует Simulink.Bus объект.

typedef struct {
  real_T signal1;
  real_T signal2;
  real_T signal3;
} B_struct_type;

typedef struct {
  real_T signal1;
  real_T signal2;
} C_struct_type;

typedef struct {
  B_struct_type subStruct_B;
  C_struct_type subStruct_C;
} A_struct_type;

Созданный исходный файл ex_signal_nested_struct.c выделяет память для глобальной структурной переменной sig_struct_var. По умолчанию имя A_struct_type Блок создания шины Bus Creator2.

/* Exported block signals */
A_struct_type sig_struct_var;          /* '<Root>/Bus Creator2' */

В том же файле, в модели step функция, алгоритм обращается sig_struct_var и области sig_struct_var.

Объединение методов для обхода ограничений

Чтобы обойти некоторые ограничения каждого метода, можно объединить структурированные классы хранения с невиртуальными шинами и структурами параметров. Например, можно:

  • Включить структуру сигнальных данных и структуру параметрических данных в одну и ту же родительскую структуру.

  • Вложение структур при агрегировании новых данных по умолчанию.

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

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

  • Оставьте класс хранения каждой шины и структуру параметров по умолчанию, Auto, или по адресу Model default, что предотвращает исключение оптимизации генерации кода из структуры шины или параметра. Затем настройте классы хранения по умолчанию таким образом, чтобы данные сигналов и данные параметров по умолчанию использовали структурированный класс хранения.

Массивы структур

Кроме того, в массив можно поместить несколько согласованных сигналов шины или структур параметров. Массив шин или структур параметров отображается в сгенерированном коде как массив структур. Сведения о создании массивов шин см. в разделе Групповые невиртуальные шины в массивах шин. Сведения о создании массивов структур параметров см. в разделе Группирование структур с несколькими параметрами в массив.

Заполнение структуры

По умолчанию генератор кода явно не добавляет поля заполнения к типам структуры. Типы структуры могут отображаться в сгенерированном коде, например, через стандартные структуры данных (см. Структуры данных в сгенерированном коде), Simulink.Bus объекты и структуры параметров, используемые в модели.

Однако при использовании библиотеки замены кода с встроенным кодером можно задать выравнивание данных (включая заполнение структуры) как часть библиотеки замены. Дополнительные сведения см. в разделе Предоставление спецификаций выравнивания данных для компиляторов (встроенный кодер).

Ограничения

  • Встроенные функции Simulink ® Coder™ и Embedded Coder не позволяют создать или использовать пользовательскую структуру, содержащую поле, значение которого является указателем. Это можно сделать вручную, создав расширенный класс хранения и написав сопутствующий код TLC (см. Мелкое представление данных путем записи кода TLC для класса хранения (встроенный кодер)).

  • Нельзя использовать встроенный класс хранения Structили структурированный класс хранения, созданный с помощью конструктора настраиваемых классов хранения (свойство класса хранения Type имеет значение FlatStructure), для установки значений по умолчанию в редакторе отображения кода.

См. также

Связанные темы