В коде С вы используете структуры (struct
) хранить данные в непрерывных местоположениях в памяти. Можно организовать данные, такие как сигналы и состояния, при помощи понятных имен. Каждая структура действует как пространство имен, таким образом, можно снова использовать имя, чтобы определять несколько элементов данных. Как массивы, со структурами, можно записать код, который эффективно передает и работает с большими объемами данных при помощи указателей.
По умолчанию генератор кода агрегировал данные в стандартные структуры (см. Как Хранилища Сгенерированного кода Внутренний Сигнал, состояние и Данные о Параметре). Чтобы управлять характеристиками этих структур или заменить это поведение по умолчанию путем создания отличных структур, используйте информацию в таблице.
Цель | Метод |
---|---|
Управляйте характеристиками стандартных структур данных. Например, задайте имена типов структуры, переменных структуры и имен полей. | С Embedded Coder®, смотрите Имена типов данных Управления в Сгенерированном коде (Embedded Coder). |
Управляйте размещением структур в памяти, например, путем вставки прагм или других художественных оформлений кода. | С Embedded Coder смотрите Данные об Управлении и Функциональное Размещение в Памяти Вставкой Прагм (Embedded Coder). |
Агрегированные данные в структуры, именами которых и другими основными характеристиками можно управлять. Когда вы добавляете блоки и сигналы к модели, получившиеся новые данные появляются в этих структурах по умолчанию. | С Embedded Coder примените класс структурированного хранилища к категории данных при помощи Кода, Сопоставляющего Редактор.
Для получения дополнительной информации о Коде, Сопоставляющем Редактор, смотрите, Конфигурируют генерацию кода C По умолчанию для Категорий Элементов данных и Функций (Embedded Coder). Чтобы создать ваш собственный класс памяти, смотрите, Задают Классы памяти, Разделы Памяти и Шаблоны функций для Программной архитектуры (Embedded Coder). |
Улучшите удобочитаемость сгенерированного кода путем организации отдельных элементов данных в пользовательскую структуру, характеристиками которой можно точно управлять. | Создайте
Чтобы создать массив структур, смотрите Массивы Структур. |
Структурированные данные Exchange между сгенерированным кодом и вашим внешним кодом, например, когда внешний код уже задает пользовательский тип структуры и соответствующую глобальную переменную. | Создайте |
Сократите количество аргументов (формальные параметры) для сгенерированных функций. |
|
Организуйте данные об интерполяционной таблице в структуру. | Используйте 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).
Со встроенным Simulink® Coder™ и функции Embedded Coder, вы не можете сгенерировать или использовать пользовательскую структуру, которая содержит поле, значение которого является указателем. Можно сделать так вручную путем создания усовершенствованного класса памяти и записи сопровождающий код TLC (см. Точно Представление данных Управления путем Записи Кода TLC для Класса памяти (Embedded Coder)).
Вы не можете использовать встроенный класс памяти Struct
, или класс структурированного хранилища, который вы создаете с Custom Storage Class Designer (вы устанавливаете свойство Type класса памяти на FlatStructure
), чтобы установить значения по умолчанию данных в Коде, Сопоставляющем Редактор.