В коде С вы используете структуры (struct
), чтобы хранить данные в непрерывных местоположениях в памяти. Можно организовать данные, такие как сигналы и состояния, при помощи понятных имен. Каждая структура действует как пространство имен, таким образом, можно снова использовать имя, чтобы определять несколько элементов данных. Как массивы, со структурами, можно записать код, который эффективно передает и работает с большими объемами данных при помощи указателей.
По умолчанию генератор кода агрегировал данные в стандартные структуры (см. Как Хранилища Сгенерированного кода Внутренний Сигнал, состояние и Данные о Параметре). Чтобы управлять характеристиками этих структур или заменить это поведение по умолчанию путем создания отличных структур, используйте информацию в таблице.
Цель | Метод |
---|---|
Управляйте характеристиками стандартных структур данных. Например, задайте имена типов структуры, переменных структуры и имен полей. | С Embedded Coder® смотрите Характеристики Управления Структур данных (Embedded Coder) (Embedded Coder). |
Управляйте размещением структур в памяти, например, путем вставки прагм или других художественных оформлений кода. | С Embedded Coder смотрите Данные об Управлении и Функциональное Размещение в Памяти Вставкой Прагм (Embedded Coder). |
Агрегированные данные в структуры, именами которых и другими основными характеристиками можно управлять. Когда вы добавляете блоки и сигналы к модели, получившиеся новые данные появляются в этих структурах по умолчанию. | С Embedded Coder примените структурированный пользовательский класс памяти к категории данных при помощи Кода, Сопоставляющего Редактор.
Для получения дополнительной информации о Коде, Сопоставляющем Редактор, смотрите, Конфигурируют генерацию кода C По умолчанию для Категорий Данных модели и Функций (Embedded Coder). Чтобы создать ваш собственный класс памяти, смотрите, Задают Классы памяти, Разделы Памяти и Шаблоны функций для Программной архитектуры (Embedded Coder). |
Улучшите удобочитаемость сгенерированного кода путем организации отдельных элементов данных в пользовательскую структуру, характеристиками которой можно точно управлять. | Создайте объект
Чтобы создать массив структур, смотрите Массивы Структур. |
Структурированные данные Exchange между сгенерированным кодом и вашим внешним кодом, например, когда внешний код уже задает пользовательский тип структуры и соответствующую глобальную переменную. | Создайте объект |
Сократите количество аргументов (формальные параметры) для сгенерированных функций. |
|
Организуйте данные об интерполяционной таблице в структуру. | Используйте объекты Simulink.Breakpoint и Simulink.LookupTable . Смотрите Simulink.LookupTable . |
Сгенерируйте битовые поля. | Смотрите битовые поля (Embedded Coder) и оптимизируйте сгенерированный код путем упаковки булевых данных в битовые поля (Embedded Coder). |
Чтобы создать структуры в сгенерированном коде, можно использовать эти методы:
Примените класс структурированного хранилища к категориям данных при помощи Кода, Сопоставляющего Редактор. Когда вы добавляете блоки и сигналы к модели, новые элементы данных получают этот класс памяти по умолчанию.
Примените класс структурированного хранилища, такой как встроенный пользовательский класс памяти Struct
, непосредственно к отдельным элементам данных при помощи Model Data Editor.
Создайте пользовательские невиртуальные шины и структуры параметра.
Чтобы решить который методы использовать, используйте информацию в таблице.
Возможность | Приложение по умолчанию класса структурированного хранилища | Прямое приложение класса структурированного хранилища | Невиртуальные шины и структуры параметра |
---|---|---|---|
Совокупные новые элементы данных в структуру по умолчанию | Да | Нет | Нет |
Предотвратите устранение целевых данных оптимизацией (укажите, что данные появляются в сгенерированном коде), | Нет | Да | Только если вы непосредственно применяете класс памяти, такой как ExportedGlobal к шине или структуре |
Агрегированные данные в структуру, не изменяя внешний вид блок-схемы | Да | Да | Нет |
Сигнал места, состояние и данные о параметре в той же структуре | Нет | Да | Нет |
Включайте данные состояния в структуру | Да | Да | Нет |
Организуйте структуры во вложенные структуры | Нет | Нет | Да |
Организуйте структуры в массив структур | Нет | Нет | Да |
Имя элемента управления типа структуры | Да | Да, но имя типа выводит от имени переменной, которое вы задаете | Да |
Создайте структуру, чтобы сократить количество аргументов в сгенерированной функции | Да, но необходимо создать собственный класс памяти при помощи Словаря Embedded Coder | Нет | Да |
Требует Embedded Coder | Да | Да | Нет |
Можно применить класс памяти по умолчанию к категории данных модели. Когда вы добавляете блоки и сигналы к модели, связанные данные получают класс памяти по умолчанию, который вы задаете. Чтобы агрегировать новые данные в структуры по умолчанию, можно применить классы структурированного хранилища. Необходимо использовать классы памяти в качестве примера ParamStruct
и SignalStruct
, созданный инструментом Quick Start, или создать собственный класс памяти при помощи Словаря Embedded Coder.
Вы не можете использовать приложение по умолчанию, чтобы агрегировать хранилища глобальных данных или глобальные параметры (объекты параметра, которые вы храните в базовом рабочем пространстве или словаре данных).
Чтобы применить классы памяти по умолчанию, используйте Код, Сопоставляющий Редактор. В окне модели выберите Code> C/C++ Code> Configure Model in Code Perspective. Затем под 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 (View> Model Data Editor). Установите Change view на Code
и примените класс памяти при помощи столбца Storage Class.
Для примера, который показывает, как использовать Struct
, смотрите, Организуют Данные о Параметре в Структуру при помощи Struct Пользовательский Класс памяти (Embedded Coder). Для получения дополнительной информации о применении классов памяти, смотрите, Применяют Пользовательские Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра (Embedded Coder).
Чтобы создать невиртуальный сигнал шины, используйте блок Bus Creator, чтобы организовать несколько сигнальных линий в одну шину или сконфигурировать блок Inport или блок Outport как невиртуальная шина. Необходимо создать объект Simulink.Bus
, который представляет тип структуры. Для примера смотрите Структуры Сигналов. Для получения общей информации о невиртуальных шинах, смотрите Начало работы с Шинами (Simulink).
Чтобы создать структуру параметра, используйте команды MATLAB® или Редактора переменных, чтобы организовать значения нескольких параметров блоков в структуру MATLAB. Опционально, создайте объект Simulink.Bus
так, чтобы можно было управлять именем типа структуры и других характеристик, таких как тип данных и размерности каждого поля. Для примера смотрите Структуры Параметров. Для получения общей информации о структурах параметра, смотрите, Организуют Связанные Определения Параметров блоков в Структурах (Simulink).
Создайте структуру в сгенерированном коде. Структура хранит данные о параметре.
C построение
typedef struct { double G1; double G2; } myStructType; myStructType myStruct = { 2.0, -2.0 } ;
Процедура
1. Откройте модель rtwdemo_paraminline
в качестве примера.
2. Выберите View> 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, Класс памяти набора к 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;
Процедура
1. Чтобы представлять тип структуры в модели, создайте объект Simulink.Bus
. Используйте объект в качестве типа данных сигналов шины в вашей модели.
2. Создайте модель ex_signal_struct
при помощи блоков Усиления, блока Bus Creator и блока Unit Delay. Блоки Усиления и Единичной задержки делают структуру более идентифицирующейся в сгенерированном коде.
3. Чтобы сконфигурировать блок Bus Creator, чтобы принять три входных параметров, в диалоговом окне блока, определяют Номер входных параметров к 3
.
4. В модели выберите Edit> Bus Editor.
5. Используйте Редактор Шины, чтобы создать объект Simulink.Bus
под названием my_signals_type
, который содержит три элемента сигнала: signal1
, signal2
и signal3
. Смотрите Создают Объекты Шины с Редактором Шины (Simulink).
Этот объект шины представляет тип структуры, который вы хотите, чтобы сгенерированный код использовал.
6. В диалоговом окне блока Bus Creator Выходные данные набора вводят к Bus: my_signals_type
.
7. Выберите Output как невиртуальную шину. Нажать ОК. Невиртуальная шина появляется в сгенерированном коде как структура.
8. В модели выберите View> Model Data Editor. В Model Data Editor, на вкладке Signals, от представления Change выпадающий список, выбирают Code
.
9. В модели кликните по выходному сигналу блока Bus Creator.
10. В Model Data Editor, для вывода блока Bus Creator, определенного Имени к sig_struct_var
.
11. Установите Класс памяти на ExportedGlobal
. Вывод блока Bus Creator появляется в сгенерированном коде как отдельная глобальная переменная структуры под названием sig_struct_var
.
12. Сгенерируйте код из модели.
Результаты
Сгенерированный заголовочный файл 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. Блоки Усиления и Единичной задержки делают структуру более идентифицирующейся в сгенерированном коде.
2. Чтобы сконфигурировать блок Bus Creator, чтобы принять три входных параметров, в диалоговом окне блока, определяют Номер входных параметров к 3
.
3. В модели выберите Edit> Bus Editor.
Используйте Редактор Шины, чтобы создать объект Simulink.Bus
под названием A_struct_type
, который содержит два элемента сигнала: subStruct_B
и subStruct_C
. Чтобы создать объекты шины с Редактором Шины, смотрите, Создают Объекты Шины с Редактором Шины (Simulink). Этот объект шины представляет тип структуры верхнего уровня, который вы хотите, чтобы сгенерированный код использовал.
4. Для элемента subStruct_B
, набор DataType к Bus: B_struct_type
. Используйте подобное имя типа для subStruct_C
.
Каждый элемент сигнала в A_struct_type
использует другой объект шины в качестве типа данных. Теперь, эти элементы представляют подструктуры.
5. Используйте Редактор Шины, чтобы создать объекты Simulink.Bus
B_struct_type
(с тремя элементами сигнала) и C_struct_type
(с двумя элементами сигнала).
6. В диалоговом окне блока Bus Creator, который собирает три сигнала Усиления, тип Выходных данных набора к Bus: B_struct_type
. Нажмите Apply.
7. Выберите Output как невиртуальную шину и нажмите ОК.
8. В диалоговом окне другого зависимого блока Bus Creator Выходные данные набора вводят к Bus: C_struct_type
и выбирают Output как невиртуальную шину. Нажать ОК.
9. В последнем диалоговом окне блока Bus Creator Выходные данные набора вводят к Bus: A_struct_type
и выбирают Output как невиртуальную шину. Нажать ОК.
10. В модели выберите View> Model Data Editor.
11. В Model Data Editor, на вкладке Signals, от представления Change выпадающий список, выбирают Code
.
12. В модели кликните по выходному сигналу блока A_struct_type
Bus Creator, который питает блок Unit Delay.
13. В Model Data Editor, для вывода блока Bus Creator, определенного Имени к sig_struct_var
.
14. Установите Класс памяти на ExportedGlobal
. С этой установкой вывод блока Bus Creator появляется в сгенерированном коде как отдельная глобальная переменная структуры под названием sig_struct_var
.
15. Сгенерируйте код из модели.
Результаты
Сгенерированный заголовочный файл 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 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). Чтобы создать массивы структур параметра, смотрите Группу Несколько Структур Параметра в Массив (Simulink).
По умолчанию генератор кода явным образом не добавляет дополнительные поля, чтобы структурировать типы. Типы структуры могут появиться в сгенерированном коде через, например, стандартные структуры данных (см. Стандартные Структуры данных в Сгенерированном коде), объекты Simulink.Bus
и структуры параметра, которые вы используете в модели.
Однако, когда вы пользуетесь заменяющей библиотекой кода с Embedded Coder, можно задать выравнивание данных (включая дополнение структуры) как часть заменяющей библиотеки. Для получения дополнительной информации смотрите, Обеспечивают Спецификации Выравнивания Данных для Компиляторов (Embedded Coder).
Со встроенным Simulink® Coder™ и функциями Embedded Coder, вы не можете сгенерировать или использовать пользовательскую структуру, которая содержит поле, значение которого является указателем. Можно сделать так вручную путем создания усовершенствованного пользовательского класса памяти и записи сопровождающий код TLC (см. Точно Представление данных Управления путем Записи Кода TLC для Пользовательского Класса памяти (Embedded Coder)).
Вы не можете использовать встроенный класс памяти Struct
или класс структурированного хранилища, который вы создаете с Custom Storage Class Designer (вы устанавливаете свойство Type класса памяти на FlatStructure
), чтобы установить значения по умолчанию данных в Коде, Сопоставляющем Редактор.