По умолчанию сгенерированный код использует Simulink® Coder™ псевдонимы типов данных, чтобы задать скалярные и массивные переменные. Для примера, тип Simulink Coder real32_T
соответствует типу Simulink single
. Код определяет эти типы посредством typedef
операторы, основанные на типах примитивов C, таких как float
и short
. Можно сконфигурировать код, чтобы использовать вместо этого пользовательские имена типов.
Код также агрегирует сигнал, параметры блоков и данные о состоянии в структуры (см. «Как сгенерированный код обменивается данными с Окружением» и «Как сгенерированный код хранит внутренний сигнал, состояние и данные о параметре») по умолчанию. Для этих типов структур можно задать правило именования. Можно также поместить элементы данных в отдельные пользовательские структуры, именами типов которых можно управлять.
Управляйте этими именами типов, чтобы помочь вам:
Соответствует стандартам кодирования. Для получения примера см. раздел «Замена и переименование типов данных для соответствия стандартам кодирования».
Интегрируйте сгенерированный код с вашим внешним кодом. Для получения примера смотрите Структурированные и перечисленные данные обмена между сгенерированным и внешним кодом.
Сделайте сгенерированный код более читаемым и значимым.
Для пользовательских типов можно также задать, что сгенерированный код повторно использует определения типов, например typedef
операторы из вашего внешнего кода.
Дополнительные сведения об именах типов данных, которыми вы не можете управлять, и о пользовательских типах данных, которые не поддерживаются сгенерированным кодом, см. в разделе Ограничения.
Чтобы проинформировать генератор кода о битовой длине типичных C типов, таких как int
и short
для вашего целевого компьютера используйте Hardware Implementation параметров конфигурации. См. «Настройка опций окружения во время выполнения».
Чтобы переименовать примитивный тип данных Simulink Coder, такой как int8_T
, создать Simulink.AliasType
объект, имя которого совпадает с именем типа, которое необходимо использовать сгенерированному коду. Например, чтобы создать тип с именем myType
, в командной строке введите:
myType = Simulink.AliasType;
Установите BaseType
свойство имени типа данных Simulink, которое соответствует целевому типу данных Simulink Coder. Для примера, если целевой тип int8_T
, задайте int8
. Чтобы идентифицировать тип данных Simulink, используйте информацию в таблице.
Имя типа Simulink Coder | Соответствующее имя типа Simulink |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Для настройки замены типа данных в течение всей модели (Configuration Parameters > Code Generation > Data Type Replacement) можно также использовать один из следующих типов:
|
|
|
|
|
|
|
|
|
|
|
* Замените n
с количеством бит, отображаемым в Configuration Parameters > Hardware Implementation для Number of bits: int или Number of bits: char. Используйте соответствующее количество бит для типа данных, которые необходимо переименовать.
Примечание
The boolean_T
BaseType
необходимо продвигать на подписанный int
.
Например, чтобы заменить имя типа uint8_T
с myType
, установите BaseType
свойство Simulink.AliasType
объект к 'int8'
.
myType.BaseType = 'int8';
Затем используйте один или оба из этих методов для применения типа к элементам данных в модели:
Настройте замену типа данных. На протяжении всего кода, который вы генерируете из модели, можно заменить имя типа данных Simulink Coder на имя Simulink.AliasType
объект. Вы конфигурируете замену типа данных через параметры конфигурации модели (Configuration Parameters > Code Generation > Data Type Replacement.
Пример, в котором показано, как использовать замену типа данных, см. в разделе Замена и переименование типов данных для соответствия стандартам кодирования.
Используйте имя Simulink.AliasType
объект, чтобы задать тип данных отдельного сигнала, то есть блока выхода или параметров блоков. По умолчанию из-за распространения и наследования типов данных (см. Правила наследования типов данных) сигналы, состояния и параметры других нисходящих блоков обычно наследуют совпадающий тип данных. Вы также можете сконфигурировать элементы данных в вышестоящих блоках, чтобы наследовать тип (Inherit: Inherit via back propagation
) или остановить распространение в произвольном блоке путем определения настройки типа данных, не являющегося наследуемым.
Чтобы задать тип данных для отдельного элемента данных, используйте Model Data Editor (на вкладке Modeling нажмите Model Data Editor). Вы можете использовать то же имя Simulink.AliasType
объект для определения типов данных нескольких элементов данных.
Для примера, который показывает, как использовать Simulink.AliasType
объект непосредственно в модели, см., Создают Псевдоним Типа Данных в Сгенерированном Коде.
Управляйте именами примитивных типов | Метод |
---|---|
Измените имя примитивного типа, который сгенерированный код использует для определения переменных по умолчанию (для примера, int8_T ). |
Сконфигурируйте замену типа данных для всей модели. Чтобы заменить имя типа данных Simulink Coder по умолчанию соответствующим именем типа Simulink, например, чтобы заменить Чтобы совместно использовать замены типов данных во всей иерархии моделей-ссылок, используйте ссылки на наборы настроек (см. Раздел «Совместное использование конфигурации между ссылочными моделями»). |
Сконфигурируйте сгенерированный код, чтобы задать конкретный элемент данных, такой как переменная, с помощью определенного, содержательного имени типа. |
В модели найдите элемент данных, который соответствует переменной. Для примера проследите из отчета о генерации кода в модель. Используйте имя Если необходимо, чтобы другие элементы данных в вышестоящих и нисходящих блоках не использовали то же имя типа, сконфигурируйте эти элементы, чтобы использовать настройку типа данных, которая не наследуется. По умолчанию большинство сигналов используют унаследованный тип |
Используйте одно и то же имя типа для нескольких сигналов и других элементов данных в пути данных, который является серией связанных блоков. | В модели используйте имя Обычно, независимо от того, где в пути данных вы задаете тип, нисходящие элементы данных наследуют тип. Можно также сконфигурировать вышестоящие элементы данных, чтобы наследовать тип. Рассмотрите определение типа в блоке, который вы не ожидаете часто удалять или изменять. |
Сконфигурируйте сгенерированный код для замены зависящего от реализации типа, такого как char_T или boolean_T и другой тип эквивалентной длины бита с заданным одним именем типа. | Используйте имя Simulink.AliasType объект для одновременной настройки нескольких замен типов данных. См. «Замена зависимых от реализации типов на то же имя типа». |
Для согласования имен типов данных, которые вы видите в модели и в сгенерированном коде, можно сконфигурировать замены типов данных, чтобы код использовал имена типов Simulink вместо имен Simulink Coder. Для каждого типа Simulink Coder, который вы хотите переименовать, используйте имя типа данных Simulink, чтобы задать имя замены. Вам не нужно создавать Simulink.AliasType
объекты.
Для замены boolean_T
, int_T
, или uint_T
, используйте информацию в таблице.
Имя типа Simulink Coder | Имена замен, которые нужно использовать |
---|---|
|
Одно из следующих имен:
|
|
|
|
|
|
|
* Замените n
с количеством бит, отображаемым в Configuration Parameters > Hardware Implementation для Number of bits: int или Number of bits: char. Используйте соответствующее количество бит для типа данных, которые вы хотите заменить.
Вы не можете использовать этот метод для замены real_T
с double
или real32_T
с single
.
Некоторые имена типов Simulink Coder сопоставляются с примитивами C, которые зависят от реализации. Для примера, тип Simulink Coder int_T
преобразуется в тип C int
, длина битов которого зависит от собственного целого размера вашего целевого компьютера. Другие типы, зависящие от реализации boolean_T
, char_T
, и uint_T
.
Для более читаемого, более простого кода можно использовать то же имя типа, чтобы заменить несколько типов Simulink Coder одинакового размера. Например, если размер собственного целого числа вашего оборудования составляет 32 бита, можно заменить int_T
и int32_T
с тем же именем, скажем myInt
.
Настройте параметры целевого компьютера в Configuration Parameters > Hardware Implementation.
Создайте Simulink.AliasType
объект с именем myInt
. В данном случае, потому что int_T
и int32_T
представляет 32-битное целое число со знаком, set BaseType
на int32
.
myInt = Simulink.AliasType('int32')
Сконфигурируйте замену совпадающего типа данных для int32_T
и int_T
.
Примечание
Замена типа данных «многие к одному» не поддерживает char
(char_T
) встроенный тип данных. Использование char
только при замене типа данных «один к одному».
Замена типа данных «многие к одному» не поддерживается для типов данных Simulink Coder разных размеров.
Эта модель показывает пользовательские типы, состоящие из числовых и псевдонимов. Числовые типы позволяют вам задать абстрактные числовые типы, что особенно полезно для фиксированных точек. Типы псевдонимов позволяют вам переименовывать типы, что позволяет создавать связи для типов.
Исследуйте модель примера
Откройте модель примера и сконфигурируйте ее, чтобы показать сгенерированные имена блоков.
load_system('rtwdemo_udt') set_param('rtwdemo_udt','HideAutomaticNames','off') open_system('rtwdemo_udt')
Ключевые возможности определяемых пользователем типов
Отображается и распространяется на сигнальных линиях
Используется для параметризации модели по типу (например, In1 задает ее Выход тип данных как ENG_SPEED
)
Типы с общим предком могут быть смешаны, посредством чего распространяется общий предок (например, выход Sum1)
Внутренне поддерживается Simulink Model Explorer
Включите необязательный атрибут файла заголовка, который идеально подходит для импорта устаревших типов (игнорируется для целей GRT)
Типы, используемые в сгенерированном коде (игнорируются для целей GRT)
Инструкции
Проверьте определяемые пользователем типы в Model Explorer, дважды нажав на первую желтую кнопку ниже.
Проверьте отображение замещающего типа данных, дважды нажав на вторую желтую кнопку ниже.
Скомпилируйте схему, чтобы отобразить типы в этой модели (Debug > Update Model > Update Model или Ctrl + D).
Сгенерируйте код с синей кнопкой ниже и смотрите файлы модели, чтобы увидеть, как определяемые пользователем типы появляются в сгенерированном коде.
Измените атрибуты ENG_SPEED
и ENG_SPEED_OFFSET
и повторите шаги 1-4.
Примечания
Пользовательские типы являются функцией Simulink, которая облегчает параметризацию типов данных в модели. Embedded Coder сохраняет имена данных (например ENG_SPEED
) в сгенерированном коде, в то время как Simulink Coder реализует определяемые пользователем типы как их базовый тип (например real32_T
).
Embedded Coder также позволяет вам заменить встроенные типы данных определенными пользователем типами данных в сгенерированном коде.
Чтобы управлять именами стандартных структур, которые Simulink Coder создает по умолчанию для хранения данных (
для данных параметра, например) используйте Configuration Parameters > Code Generation > Identifiers > Global types, чтобы задать правило именования. Дополнительные сведения см. в разделе Настройка сгенерированных идентификаторов.model
_P
Когда вы используете невиртуальные шины и структуры параметров для агрегирования сигналов и параметров блоков в пользовательскую структуру в сгенерированном коде, управляйте именем типа структуры, создавая Simulink.Bus
объект. Для получения дополнительной информации см. раздел «Организация данных в структуры» в разделе «Сгенерированный код».
Чтобы сгенерировать код, который повторно использует определение типов из вашего внешнего кода С, задайте возможности данных соответствующего объекта типа данных или перечисления в Simulink как Imported
. При этой настройке сгенерированный код включает (#include
) определение из вашего кода. Дополнительные сведения об управлении размещением файлов пользовательского типа данных см. в разделе Размещение файлов управления пользовательскими типами данных.
Вместо создания отдельных объектов типов данных и перечисленных типов, а затем их конфигурирования, рассмотрите создание объектов и типов при помощи Simulink.importExternalCTypes
функция. По умолчанию функция конфигурирует новые объекты и типы так, чтобы сгенерированный код импортировал (повторно использует) определения типов из вашего кода. Затем можно использовать объекты и типы, чтобы задать типы данных в модели и сконфигурировать замены типов данных. Для получения дополнительной информации смотрите Simulink.importExternalCTypes
и обмен структурированными и перечисленными данными между сгенерированным и внешним кодом.
В этом примере показано, как сконфигурировать сгенерированный код для использования имени типа данных (typedef
), что вы задаете.
Определение типа экспорта
Когда вы интегрируете код, сгенерированный из модели, с кодом из других источников, ваш код модели может создать экспортированную typedef
оператор. Поэтому весь интегрированный код может использовать тип. В этом примере показано, как экспортировать определение типа данных в сгенерированный заголовочный файл.
Создайте Simulink.AliasType
объект с именем mySingleAlias
который действует как псевдоним для встроенного типа данных single
.
mySingleAlias = Simulink.AliasType('single');
Сконфигурируйте объект, чтобы экспортировать его определение в заголовочный файл с именем myHdrFile.h
.
mySingleAlias.DataScope = 'Exported'; mySingleAlias.HeaderFile = 'myHdrFile.h';
Откройте модель rtwdemo_configinterface
.
open_system('rtwdemo_configinterface')
Сконфигурируйте модель, чтобы показать сгенерированные имена блоков.
set_param('rtwdemo_configinterface','HideAutomaticNames','off')
На вкладке Моделирование (Modeling) щелкните Редактор данных модели (Model Data Editor).
В модели выберите маркированный блок Inport In1
.
Используйте столбец Data Type, чтобы задать тип данных mySingleAlias
.
set_param('rtwdemo_configinterface/In1','OutDataTypeStr','mySingleAlias')
Сконфигурируйте In1
использовать хранилище по умолчанию.
На вкладке Кода С выберите Код Интерфейс > По умолчанию Код Отображений.
В редакторе Отображения в разделе Inports и Outports выберите категорию Inports. Установите класс памяти по умолчанию равным Default
.
На вкладке Inports установите для класса памяти значение Model default
.
cm = coder.mapping.api.get('rtwdemo_configinterface'); setDataDefault(cm,'Inports','StorageClass','Default'); setInport(cm,'In1','StorageClass','Model default');
Сгенерируйте код из модели.
slbuild('rtwdemo_configinterface')
### Starting build procedure for: rtwdemo_configinterface ### Successful completion of code generation for: rtwdemo_configinterface Build Summary Top model targets built: Model Action Rebuild Reason =========================================================================================== rtwdemo_configinterface Code generated Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 7.0789s
В отчете о генерации кода просмотрите файл rtwdemo_configinterface_types.h
. Код создает #include
директива для сгенерированного файла myHdrFile.h
.
file = fullfile('rtwdemo_configinterface_ert_rtw','rtwdemo_configinterface_types.h'); rtwdemodbtype(file,'#include "myHdrFile.h"',... '#include "myHdrFile.h"',1,1)
#include "myHdrFile.h"
Просмотрите файл myHdrFile.h
. Код использует идентификатор mySingleAlias
как псевдоним для типа данных real32_T
. По умолчанию сгенерированный код представляет тип данных Simulink single
при помощи идентификатора real32_T
.
Код также предоставляет макросервис формы RTW_HEADER_filename_h_
. При экспорте определения типов для интеграции сгенерированного кода с кодом из других источников можно использовать macro guards этой формы, чтобы предотвратить непреднамеренные столкновения идентификаторов.
file = fullfile('slprj','ert','_sharedutils','myHdrFile.h'); rtwdemodbtype(file,'#ifndef RTW_HEADER_myHdrFile_h_',... ' * File trailer for generated code.',1,0)
#ifndef RTW_HEADER_myHdrFile_h_ #define RTW_HEADER_myHdrFile_h_ #include "rtwtypes.h" typedef real32_T mySingleAlias; typedef creal32_T cmySingleAlias; #endif /* RTW_HEADER_myHdrFile_h_ */ /*
Просмотрите файл rtwdemo_configinterface.h
. Код использует псевдоним типа данных mySingleAlias
для определения поля структуры input1
, что соответствует маркированному блоку Inport In1
.
file = fullfile('rtwdemo_configinterface_ert_rtw','rtwdemo_configinterface.h'); rtwdemodbtype(file,... '/* External inputs (root inport signals with default storage) */',... '} ExtU_rtwdemo_configinterface_T;',1,1)
/* External inputs (root inport signals with default storage) */ typedef struct { mySingleAlias input1; /* '<Root>/In1' */ MYTYPE input2; /* '<Root>/In2' */ MYTYPE input3; /* '<Root>/In3' */ MYTYPE input4; /* '<Root>/In4' */ } ExtU_rtwdemo_configinterface_T;
Определение типа импорта
Когда вы интегрируете код, сгенерированный из модели, с кодом из других источников, чтобы избежать избыточных typedef
операторы можно импортировать определение типов из внешнего кода. В этом примере показано, как импортировать свое собственное определение типа данных из созданного вами заголовочного файла.
Используйте текстовый редактор, чтобы создать файл заголовка для импорта. Назовите файл ex_myImportedHdrFile.h
. Поместите его в рабочую папку. Скопируйте следующий код в файл.
#ifndef HEADER_myImportedHdrFile_h_ #define HEADER_myImportedHdrFile_h_ typedef float myTypeAlias; #endif
Код использует идентификатор myTypeAlias
чтобы создать псевдоним для типа данных float
. Код также использует защиту макросов формы HEADER_filename_h
. При импорте определения типов для интеграции сгенерированного кода с кодом из других источников можно использовать macro guards этой формы, чтобы предотвратить непреднамеренные столкновения идентификаторов.
В командной строке создайте Simulink.AliasType
объект с именем myTypeAlias
который создает псевдоним для встроенного типа single
. Тип данных Simulink single
соответствует типу данных C float
.
myTypeAlias = Simulink.AliasType('single')
myTypeAlias = AliasType with properties: Description: '' DataScope: 'Auto' HeaderFile: '' BaseType: 'single'
Сконфигурируйте объект так, чтобы сгенерированный код импортировал определение типа из файла заголовка ex_myImportedHdrFile.h
.
myTypeAlias.DataScope = 'Imported'; myTypeAlias.HeaderFile = 'ex_myImportedHdrFile.h';
Откройте модель rtwdemo_configinterface
.
open_system('rtwdemo_configinterface')
На вкладке Моделирование (Modeling) щелкните Редактор данных модели (Model Data Editor).
В модели выберите маркированный блок Inport In1
.
Используйте столбец Data Type, чтобы задать тип данных myTypeAlias
.
set_param('rtwdemo_configinterface/In1','OutDataTypeStr','myTypeAlias')
Сгенерируйте код из модели.
slbuild('rtwdemo_configinterface')
### Starting build procedure for: rtwdemo_configinterface ### Successful completion of code generation for: rtwdemo_configinterface Build Summary Top model targets built: Model Action Rebuild Reason ========================================================================== rtwdemo_configinterface Code generated Generated code was out of date. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 7.1019s
В отчете о генерации кода просмотрите файл rtwdemo_configinterface_types.h
. Код создает #include
директива для файла заголовка ex_myImportedHdrFile.h
.
file = fullfile('rtwdemo_configinterface_ert_rtw','rtwdemo_configinterface_types.h'); rtwdemodbtype(file,'#include "ex_myImportedHdrFile.h',... '/* Forward declaration for rtModel */',1,0)
#include "ex_myImportedHdrFile.h" #include "MYTYPE.h" /* Model Code Variants */ #ifndef DEFINED_TYPEDEF_FOR_Table1_Type_ #define DEFINED_TYPEDEF_FOR_Table1_Type_ typedef struct { MYTYPE BP[11]; MYTYPE Table[11]; } Table1_Type; #endif #ifndef DEFINED_TYPEDEF_FOR_Table2_Type_ #define DEFINED_TYPEDEF_FOR_Table2_Type_ typedef struct { MYTYPE BP1[3]; MYTYPE BP2[3]; MYTYPE Table[9]; } Table2_Type; #endif #endif /* RTW_HEADER_rtwdemo_configinterface_types_h_ */ /* * File trailer for generated code. * * [EOF] */
Просмотрите файл rtwdemo_configinterface.h
. Код использует псевдоним типа данных myTypeAlias
для определения поля структуры input1
, что соответствует маркированному блоку Inport In1
.
file = fullfile('rtwdemo_configinterface_ert_rtw','rtwdemo_configinterface.h'); rtwdemodbtype(file,... '/* External inputs (root inport signals with default storage) */',... '} ExtU_rtwdemo_configinterface_T;',1,1)
/* External inputs (root inport signals with default storage) */ typedef struct { myTypeAlias input1; /* '<Root>/In1' */ MYTYPE input2; /* '<Root>/In2' */ MYTYPE input3; /* '<Root>/In3' */ MYTYPE input4; /* '<Root>/In4' */ } ExtU_rtwdemo_configinterface_T;
Отображение базовых типов данных и псевдонимов на диаграмме модели
Когда вы отображаете типы данных сигнала на диаграмме модели, можно выбрать, чтобы отобразить псевдонимы (такие как myTypeAlias
) и базовые типы данных (такие как int16
). Чтобы отобразить псевдонимы, на вкладке Debug, выберите Information Overlays > Alias Data Types. Для отображения базовых типов выберите «Информационные наложения» > «Типы базовых данных». Для получения дополнительной информации см. раздел «Типы данных портов».
В этом примере показано, как создать и назвать тип данных с фиксированной точкой в сгенерированном коде. Можно использовать имя типа, чтобы задать типы данных параметров и сигналов во всей модели и в сгенерированном коде.
Пример модели rtwdemo_fixpt1
использует типы данных с фиксированной точкой. Чтобы вы могли легче видеть тип данных с фиксированной точкой в сгенерированном коде, в этом примере вы создаете Simulink.Parameter
объект, который появляется в коде как глобальная переменная.
Создайте Simulink.AliasType
объект, который задает тип данных с фиксированной точкой. Назовите объект myFixType
. Сгенерированный код использует имя объекта как тип данных.
myFixType = Simulink.AliasType('fixdt(1,16,4)');
Откройте модель rtwdemo_fixpt1
.
open_system('rtwdemo_fixpt1')
Сконфигурируйте модель, чтобы показать сгенерированные имена блоков.
set_param('rtwdemo_fixpt1','HideAutomaticNames','off')
На вкладке Моделирование (Modeling) щелкните Редактор данных модели (Model Data Editor).
В Model Data Editor выберите вкладку Параметры.
В модели выберите блок Gain.
В Model Data Editor для строки, которая представляет параметр Gain блока Gain, в столбце Value задайте myParam
.
Нажмите кнопку действия (с тремя вертикальными точками) рядом со значением параметров. Выберите «Создать».
В диалоговом окне «Создание новых данных» установите Value
на Simulink.Parameter(8)
. В этом примере для более легко читаемого кода вы устанавливаете значение параметров 8 вместо -3,2. Нажмите кнопку Создать. A Simulink.Parameter
объект с именем myParam
появляется в базовом рабочем пространстве. Объект хранит значение реального мира 8
, который блок Gain использует для значения параметра Gain.
В диалоговом окне свойства Simulink.Parameter установите значение класса Storage на ExportedGlobal
. Нажмите OK. С этой настройкой, myParam
появляется в сгенерированном коде как отдельная глобальная переменная.
В Model Data Editor используйте столбец Data Type, чтобы задать тип данных параметра Gain блока Gain равным myFixType
.
На вкладке Signals используйте столбец Data Type, чтобы задать тип данных выхода блока Gain равным myFixType
.
Используйте столбец Data Type, чтобы задать тип данных Conversion
выход блока в myFixType
.
Также можно использовать эти команды в командной строке, чтобы сконфигурировать блоки и создать объект:
set_param('rtwdemo_fixpt1/Gain','Gain','myParam','OutDataTypeStr','myFixType',... 'ParamDataTypeStr','myFixType') myParam = Simulink.Parameter(8); myParam.StorageClass = 'ExportedGlobal'; set_param('rtwdemo_fixpt1/Conversion','OutDataTypeStr','myFixType')
В модели установите параметры конфигурации > Генерация кода > Системный целевой файл ert.tlc
. С помощью этой настройки генератор кода чтит псевдонимы типов данных, такие как myFixType
.
set_param('rtwdemo_fixpt1','SystemTargetFile','ert.tlc')
Выберите параметр конфигурации Только генерация кода.
set_param('rtwdemo_fixpt1','GenCodeOnly','on')
Сгенерируйте код из модели.
slbuild('rtwdemo_fixpt1')
### Starting build procedure for: rtwdemo_fixpt1 ### Successful completion of code generation for: rtwdemo_fixpt1 Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================== rtwdemo_fixpt1 Code generated Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 9.1889s
В отчете о генерации кода просмотрите файл rtwdemo_fixpt1_types.h
. Код определяет тип myFixType
на основе целого типа заданного размера слова (16).
file = fullfile('rtwdemo_fixpt1_ert_rtw','rtwdemo_fixpt1_types.h'); rtwdemodbtype(file,'#ifndef DEFINED_TYPEDEF_FOR_myFixType_',... '/* Forward declaration for rtModel */',1,0)
#ifndef DEFINED_TYPEDEF_FOR_myFixType_ #define DEFINED_TYPEDEF_FOR_myFixType_ typedef int16_T myFixType; typedef cint16_T cmyFixType; #endif
Просмотрите файл rtwdemo_fixpt1.c
. Код использует тип myFixType
, который является псевдонимом целого типа int16
, для определения переменной myParam
.
file = fullfile('rtwdemo_fixpt1_ert_rtw','rtwdemo_fixpt1.c'); rtwdemodbtype(file,'myFixType myParam = 128;','myFixType myParam = 128;',1,1)
myFixType myParam = 128; /* Variable: myParam
Сохраненное целое значение 128
от myParam
не совпадает с реальным значением 8
из-за масштабирования, которое тип данных с фиксированной точкой myFixType
задает. Для получения дополнительной информации см. раздел «Масштабирование» (Fixed-Point Designer) в документации Fixed-Point Designer.
Строка кода, которая представляет блок Gain, применяет сдвиг правого бита, соответствующий длине дроби, заданной myFixType
.
rtwdemodbtype(file,... 'rtwdemo_fixpt1_Y.Out1 = (myFixType)((myParam * rtb_Conversion) >> 4);',... 'rtwdemo_fixpt1_Y.Out1 = (myFixType)((myParam * rtb_Conversion) >> 4);',1,1)
rtwdemo_fixpt1_Y.Out1 = (myFixType)((myParam * rtb_Conversion) >> 4);
Чтобы переименовать объект типа данных, такой как Simulink.AliasType
или Simulink.Bus
после того, как вы создаете его (для примера, чтобы переименовать псевдоним при изменении стандартов кодирования или при встрече с конфликтом по совпадению имен), можно разрешить Simulink переименовать объект и исправить все ссылки на объект, которые появляются в модели или моделях. В Model Explorer щелкните правой кнопкой мыши переменную и выберите Rename All. Для получения дополнительной информации см. раздел «Переименование переменных».
Для читаемости можно отобразить типы данных сигнала непосредственно на блоке. При использовании пользовательских имен для примитивных типов данных можно выбрать отображение пользовательского имени (псевдонима), базового примитива или обоих. См. Раздел «Типы данных портов»
Вы не можете настроить сгенерированный код для использования следующих пользовательских типов данных C:
Типы массивов
Типы указателей
const
или volatile
типы
Вы не можете сконфигурировать сгенерированный код, чтобы использовать родовые типы примитивов C, такие как int
и short
.
Когда вы выбираете параметр конфигурации модели Replace data type names in the generated code на панели Code Generation > Data Type Replacement диалогового окна Параметры конфигурации (Configuration Parameters), применяются следующие ограничения:
Замена типа данных не поддерживает несколько уровней отображения. Каждое имя типа данных замены сопоставляется непосредственно с одним или несколькими встроенными типами данных.
Замена типа данных не поддерживается для генерации кода целевого объекта симуляции для ссылочных моделей.
Если вы выбираете параметр конфигурации Classic call interface для вашей модели, замена типа данных не поддерживается.
Генерация кода выполняет замену типа данных во время генерации .c
, .cpp
, и .h
файлы. Генерация кода помещает эти файлы в папки сборки (включая верхние и ссылочные папки сборки модели) и в _sharedutils
папка. Исключения заключаются в следующем:
rtwtypes.h |
multiword_types.h |
model_reference_types.h |
builtin_typeid_types.h |
model_sf.c или .cpp (обертка S-функции ERT) |
model_dt.h (Заголовочный файл C, поддерживающий режим external mode) |
model_capi.c или .cpp |
model_capi.h |
Замена типа данных не поддерживается для типов комплексных данных.
Замена типа данных «многие к одному» не поддерживается для char
тип данных. Попытка использовать char
как часть отображения «многие к одному» в пользовательский тип данных представляет нарушение MISRA C® спецификация. Для примера, если вы сопоставляете char
(char_T
) и любое из них int8
(int8_T
) или uint8
(uint8_T
) для того же типа замены результатом является нарушение MISRA C. Если вы пытаетесь сгенерировать код С++, генератор кода делает недопустимые неявные приведения типов, что приводит к ошибкам во время компиляции. Использование char
только при замене типа данных «один к одному».
Замена типа данных «многие к одному» не поддерживается для типов данных Simulink Coder разных размеров. Для получения дополнительной информации смотрите Замена зависимых от реализации типов на то же имя типа.
Для функций ERT S замените boolean
тип данных только с 8-битным целым числом, int8
, или uint8
.
Установите DataScope
свойство Simulink.AliasType
объект к Auto
(по умолчанию) или Imported
.