Организуйте данные в структуры в сгенерированном коде

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

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

ЦельМетод

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

С Embedded Coder® смотрите Характеристики Управления Структур данных (Embedded Coder) (Embedded Coder).

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

С Embedded Coder смотрите Данные об Управлении и Функциональное Размещение в Памяти Вставкой Прагм (Embedded Coder).

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

С Embedded Coder примените класс структурированного хранилища к категории данных при помощи Кода, Сопоставляющего Редактор.

  • Когда вы генерируете nonreetrant, код одно экземпляра путем установки параметра конфигурации модели Code interface packaging на Nonreusable function, создайте плоские, глобальные переменные структуры путем применения встроенного класса памяти Struct. В качестве альтернативы используйте классы памяти в качестве примера, созданные инструментом Quick Start, ParamStruct и SignalStruct, или создайте и примените свой собственный класс структурированного хранилища.

  • Когда вы генерируете мультиэкземпляр (повторно используемый) код из модели или компонента, например, установкой Code interface packaging к значению кроме Nonreusable function, в редакторе Отображений Кода вы не можете использовать встроенный класс памяти Struct или класс структурированного хранилища, который вы создаете в пакете. Вместо этого создайте свой собственный класс структурированного хранилища при помощи Словаря Embedded Coder. Если вы используете инструмент Embedded Coder Quick Start, чтобы подготовить модель к генерации кода (см., Генерируют Код при помощи Инструмента Быстрого запуска (Embedded Coder)), можно использовать классы памяти в качестве примера ParamStruct и SignalStruct.

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

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

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

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

Чтобы создать массив структур, смотрите Массивы Структур.

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

Создайте Simulink.Bus объект, который представляет тип структуры, который вы хотите. Если ваш внешний код уже задает тип, используйте Simulink.importExternalCTypes функция, чтобы сгенерировать объект шины. Используйте объект шины установить типы данных невиртуальных сигналов шины и структур параметра в вашей модели. Для примера смотрите, обмениваются Структурированными и Перечислимыми Данными Между Сгенерированным и Внешним Кодом (Embedded Coder).

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

Организуйте данные об интерполяционной таблице в структуру.

Используйте Simulink.LookupTable и Simulink.Breakpoint объекты. Смотрите Simulink.LookupTable.
Сгенерируйте битовые поля.Смотрите битовые поля (Embedded Coder) и оптимизируйте сгенерированный код путем упаковки булевых данных в битовые поля (Embedded Coder).

Методы, чтобы создать структуры

Чтобы создать структуры в сгенерированном коде, можно использовать эти методы:

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

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

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

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

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

Да

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

Нет

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

Да

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

Да

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

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

НетДа
Требует Embedded CoderДаДаНет

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

Можно применить класс памяти по умолчанию к категории данных модели. Когда вы добавляете блоки и сигналы к модели, связанные данные получают класс памяти по умолчанию, который вы задаете. Чтобы агрегировать новые данные в структуры по умолчанию, можно применить классы структурированного хранилища. Необходимо использовать классы памяти в качестве примера ParamStruct и SignalStruct созданный инструментом Quick Start или создают ваш собственный класс памяти при помощи Словаря Embedded Coder.

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

Чтобы применить классы памяти по умолчанию, используйте Код, Сопоставляющий Редактор. В окне модели, в галерее Apps, нажимают Embedded Coder. Затем под Code Mappings> Data Defaults, примените классы памяти при помощи столбца Storage Class.

Для получения дополнительной информации о Коде, Сопоставляющем Редактор, смотрите, Конфигурируют генерацию кода C По умолчанию для Категорий Элементов данных и Функций (Embedded Coder). Чтобы создать ваш собственный класс памяти при помощи Словаря Embedded Coder, смотрите, Создают Определения Кода для Использования в Редакторе Отображений Кода (Embedded Coder).

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

Можно применить класс структурированного хранилища к отдельным элементам данных. Прямое приложение предотвращает оптимизацию генерации кода, такую как Default parameter behavior и Signal storage reuse, от устранения каждого элемента данных от сгенерированного кода. Прямое приложение также заменяет классы памяти по умолчанию, которые вы задаете с Code Mappings> Data Defaults.

Чтобы непосредственно применить класс памяти, используйте Model Data Editor (на вкладке Modeling, нажмите Model Data Editor). Установите Change view на Code и примените класс памяти при помощи столбца Storage Class.

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

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

  • Чтобы создать невиртуальный сигнал шины, используйте блок 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. В модели щелкните, блок Gain пометил G1. В Model Data Editor используйте Столбец значений, чтобы установить значение параметра Усиления к myStruct.G1.

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

5. Рядом с myStruct.G2, кликните по кнопке действий (с тремя вертикальными точками) и выберите Create.

6. В диалоговом окне Create New Data, установленном Значении к Simulink.Parameter(struct) и нажмите Create. Simulink.Parameter возразите названному myStruct появляется в базовом рабочем пространстве.

7. В диалоговом окне свойства Simulink.Parameter, рядом со свойством Value, кликают по кнопке действий и выбирают Open Variable Editor.

8. Щелкните правой кнопкой по пробелу в соответствии с Полевым столбцом и выберите New. Назовите новое поле G1 структуры. Используйте Столбец значений, чтобы установить значение поля к 2.

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

10. В Simulink. Диалоговое окно свойства Parameter, на вкладке Code Generation, установило Класс памяти на 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. В Model Data Editor нажмите кнопку дополнительной информации Show/refresh.

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 модель при помощи блоков Усиления, блока Bus Creator и блока Unit Delay. Усиление и блоки Unit Delay делают структуру более идентифицирующейся в сгенерированном коде.

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

3. В панели инструментов, на вкладке Modeling, в соответствии с Проектом, нажимают Bus Editor.

4. В Редакторе Шины нажмите File> Add Bus, чтобы создать Simulink.Bus объект и имя это my_signals_type. Нажмите File> Add/Insert BusElement, чтобы добавить три элемента сигнала: signal1, signal2, и signal3. Для получения дополнительной информации смотрите, Создают и Задают Объекты Simulink.Bus.

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

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

6. В диалоговом окне блока Создателя Шины Выходные данные набора вводят к Bus: my_signals_type.

7. Выберите Output как невиртуальную шину. Нажать ОК. Невиртуальная шина появляется в сгенерированном коде как структура.

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

9. Откройте вкладку Signals/States. В модели выберите выходной сигнал блока Bus Creator и нажмите, Add выбрал сигналы закодировать кнопку отображений в редакторе Отображений Кода.

11. Для добавленного сигнала, Класса памяти набора к ExportedGlobal.

12. В Property Inspector, набор свойство Code> Identifier к 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 модель с блоками Усиления, блоками Создателя Шины и блоком Unit Delay. Усиление и блоки Unit Delay делают структуру более идентифицирующейся в сгенерированном коде.

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

3. В панели инструментов, на вкладке Modeling, в соответствии с Проектом, нажимают Bus Editor.

В Редакторе Шины нажмите File> Add Bus, чтобы создать Simulink.Bus объект и имя это A_struct_type. Нажмите File> Add/Insert 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, который собирает три сигнала Усиления, тип Выходных данных набора к Bus: B_struct_type. Нажмите Apply.

7. Выберите Output как невиртуальную шину и нажмите ОК.

8. В диалоговом окне другого зависимого блока Bus Creator Выходные данные набора вводят к Bus: C_struct_type и выберите Output как невиртуальную шину. Нажать ОК.

9. В последнем диалоговом окне блока Создателя Шины Выходные данные набора вводят к Bus: A_struct_type и выберите Output как невиртуальную шину. Нажать ОК.

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

11. Откройте вкладку Signals/States. В модели выберите выходной сигнал A_struct_type Соедините шиной блок Creator, который питает блок Unit Delay. Нажмите Add выбрал сигналы закодировать кнопку отображений в редакторе Отображений Кода.

12. Для добавленного сигнала, Класса памяти набора к ExportedGlobal.

13. В Property Inspector, набор свойство Code> Identifier к 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 Блоком Creator шины является 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 объекты и структуры параметра, которые вы используете в модели.

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

Ограничения

  • Вы не можете использовать встроенный класс памяти Struct, или класс структурированного хранилища, который вы создаете с Custom Storage Class Designer (вы устанавливаете свойство Type класса памяти на FlatStructure), чтобы установить значения по умолчанию данных в Коде, Сопоставляющем Редактор.

Смотрите также

Похожие темы