Чтобы сгенерировать более эффективный код, совпадайте с типами данных параметров блоков (такими как параметр Gain блока Gain) с типами данных сигнала. В качестве альтернативы можно сохранить параметры в меньших типах данных.
Эти примеры показывают, как сгенерировать эффективный код путем конфигурирования параметров блоков, чтобы использовать совпадающий тип данных в качестве сигнала, что блок работает с.
Храните информацию типа данных в модели
Откройте модель в качестве примера rtwdemo_configrpinterface и сконфигурируйте ее, чтобы показать сгенерированные имена блоков.
open_system('rtwdemo_configrpinterface') set_param('rtwdemo_configrpinterface','HideAutomaticNames','off')
На вкладке Modeling нажмите Model Data Editor.
В Model Data Editor выберите вкладку Parameters.
В модели выберите блок Gain. В Model Data Editor столбец Типа данных показывает, что тип данных параметра Усиления блока установлен в Inherit: Same as input
. С этой установкой параметр Усиления этого блока использует совпадающий тип данных в качестве входного сигнала.
В редакторе Отображений Кода, под Параметрами, устанавливает класс памяти для K1 к ExportedGlobal
.
В Model Data Editor, представлении Change набора к Design
.
В таблице данных, для строки, которая представляет K1
, в столбце Типа данных выберите Auto. С этой установкой объект параметра получает свой тип данных от параметров блоков, которые используют объект (в этом случае, параметры блоков Усиления).
В качестве альтернативы, чтобы создать и сконфигурировать объект, используйте эти команды в командной строке:
cm = coder.mapping.api.get('rtwdemo_configrpinterface'); setModelParameter(cm,'K1','StorageClass','ExportedGlobal'); hws = get_param(bdroot, 'modelworkspace'); hws.setVariablePart('K1.DataType','Auto');
Сгенерируйте код из модели.
slbuild('rtwdemo_configrpinterface')
### Starting build procedure for: rtwdemo_configrpinterface ### Successful completion of code generation for: rtwdemo_configrpinterface Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================================= rtwdemo_configrpinterface Code generated Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 10.631s
Сгенерированный файл rtwdemo_configrpinterface.c
задает глобальную переменную K1
при помощи типа данных real_T.
file = fullfile('rtwdemo_configrpinterface_grt_rtw','rtwdemo_configrpinterface.c'); rtwdemodbtype(file,'/* Exported block parameters */','real_T K1 = 2.0;',1,1)
/* Exported block parameters */ real_T K1 = 2.0; /* Variable: K1
Алгоритм сгенерированного кода в модели step
функционируйте использует K1
непосредственно без преобразования типа.
rtwdemodbtype(file,'output =',... '10U',1,1)
output = K1 * look1_binlc((*input2), rtCP_Table1_bp01Data, rtCP_Table1_tableData, 10U);
В редакторе Отображений Кода, под Параметрами, можно опционально установить класс памяти для K1 к Inherit: Inherit via internal rule
(значение по умолчанию).
В этом случае параметры блоков выбирают совпадающий тип данных в качестве входного сигнала, дважды. Однако, когда вы используете Inherit: Inherit via internal rule
, при других обстоятельствах (например, когда вы используете типы данных с фиксированной точкой), параметры блоков могут выбрать другой тип данных.
Храните информацию типа данных в объекте параметра
Когда вы используете Simulink.Parameter
возразите, чтобы экспортировать или импортировать данные о параметре от сгенерированного кода до вашего внешнего кода, например, путем применения класса памяти ImportedExtern
, можно указать информацию типа данных в объекте параметра. Чтобы совпадать с типом данных объекта параметра с типом данных сигнала, создайте Simulink.NumericType
или Simulink.AliasType
объект. Можно строго управлять типом данных, который объект параметра использует в сгенерированном коде, устраняя риск, что Simulink выбирает другой тип данных, когда вы вносите изменения в модель.
В командной строке создайте Simulink.NumericType
объект, который представляет тип данных дважды.
myType = Simulink.NumericType;
myType.DataTypeMode = 'Double';
Используйте столбец Типа данных Model Data Editor, чтобы установить эти типы данных на myType
:
Объект параметра. Используйте вкладку Parameters.
Блок Inport под названием In2
. Используйте вкладку Inports/Outports. Из-за распространения типа данных, входной сигнал блока Gain также использует myType
.
Используйте вкладку Model Data Editor Parameters, чтобы установить тип данных параметров блоков Усиления к Inherit: Inherit from 'Gain'
.
Используйте этот объект типа данных в качестве типа данных объекта параметра.
В качестве альтернативы, чтобы сконфигурировать объект и блоки, используйте эти команды в командной строке:
K1.DataType = 'myType'; set_param('rtwdemo_configrpinterface/In2','OutDataTypeStr','myType') set_param('rtwdemo_configrpinterface/Gain','ParamDataTypeStr','Inherit: Inherit from ''Gain''')
Сгенерируйте код из модели.
slbuild('rtwdemo_configrpinterface')
### Starting build procedure for: rtwdemo_configrpinterface ### Successful completion of code generation for: rtwdemo_configrpinterface Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================ rtwdemo_configrpinterface Code generated Generated code was out of date. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 9.5415s
Глобальная переменная K1
продолжает использовать тип данных real_T.
file = fullfile('rtwdemo_configrpinterface_grt_rtw','rtwdemo_configrpinterface.c'); rtwdemodbtype(file,'/* Exported block parameters */','real_T K1 = 2.0;',1,1)
/* Exported block parameters */ real_T K1 = 2.0; /* Variable: K1
Закройте отчет генерации кода.
rtwdemoclean;
Когда вы используете объект параметра (например, Simulink.Parameter
) чтобы установить значения параметров блоков, можно сконфигурировать объект появиться в сгенерированном коде как настраиваемая глобальная переменная. По умолчанию объект параметра и соответствующая глобальная переменная обычно используют совпадающий тип данных в качестве сигнала или сигнализируют, с которым работает блок. Например, если входной сигнал блока Gain использует тип данных int16
, объект параметра обычно использует совпадающий тип данных. Чтобы уменьшать объем памяти, который использует эта переменная, укажите, что переменная использует меньший целочисленный тип данных, такой как int8
.
Сохраните значение параметров в целочисленном типе данных
Откройте модель rtwdemo_configrpinterface
и набор свойства модели.
open_system('rtwdemo_configrpinterface') set_param('rtwdemo_configrpinterface','HideAutomaticNames','off') set_param('rtwdemo_configrpinterface','ShowPortDataTypes','on') set_param('rtwdemo_configrpinterface','SimulationCommand','Update')
Многие сигналы в модели используют тип данных double
.
На вкладке Modeling нажмите Model Data Editor.
В Model Data Editor смотрите вкладку Parameters.
Нажмите кнопку дополнительной информации Show/refresh.
Рядом с полем содержимого Фильтра активируйте Фильтр с помощью кнопки выбора.
В модели кликните по блоку Gain. Model Data Editor показывает одну строку, которая соответствует параметру Усиления блока и одной строки, которая соответствует переменной MATLAB K1
, который устанавливает значение параметров на 2
. K1
находится в рабочем пространстве модели.
Во вкладке C Code выберите Code Interface> Default Code Mappings. В редакторе Отображений Кода, под Параметрами, устанавливает класс памяти для K1 к ExportedGlobal
.
cm = coder.mapping.api.get('rtwdemo_configrpinterface'); setModelParameter(cm,'K1','StorageClass','ExportedGlobal');
Во вкладке C Code выберите Code Interface> Default Code Mappings. В Model Data Editor, представлении Change набора к Design
и гарантируйте что столбец Типа данных для K1
int8
.
hws = get_param(bdroot, 'modelworkspace'); hws.setVariablePart('K1.DataType','int8');
Для строки, которая представляет параметры блоков Усиления в столбце Типа данных, устанавливает выпадающий список на Inherit: Inherit from 'Gain'
. С этой установкой параметр Усиления блока наследовал int8
тип данных от объекта параметра.
set_param('rtwdemo_configrpinterface/Gain','ParamDataTypeStr',... 'Inherit: Inherit from ''Gain''')
Сгенерируйте код из модели.
rtwbuild('rtwdemo_configrpinterface')
### Starting build procedure for: rtwdemo_configrpinterface ### Successful completion of code generation for: rtwdemo_configrpinterface Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================================= rtwdemo_configrpinterface Code generated Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 6.4599s
Сгенерированный файл rtwdemo_configrpinterface.c
задает глобальную переменную K1
при помощи типа данных int8_T
, который соответствует типу данных int8
в Simulink.
file = fullfile('rtwdemo_configrpinterface_grt_rtw','rtwdemo_configrpinterface.c'); rtwdemodbtype(file,'/* Exported block parameters */','int8_T K1 = 2;',1,1)
/* Exported block parameters */ int8_T K1 = 2; /* Variable: K1
Алгоритм кода в модели step
функционируйте использует K1
вычислить выход блока Gain. Алгоритм бросает K1
к типу данных real_T
'double'
) потому что сигналы, вовлеченные в вычисление, используют тип данных real_T
.
rtwdemodbtype(file,'output =',... '10U',1,1)
output = (real_T)K1 * look1_binlc((*input2), rtCP_Table1_bp01Data, rtCP_Table1_tableData, 10U);
Сохраните значение параметров фиксированной точки в меньшем целочисленном типе данных
Предположим, что вы конфигурируете сигналы в своей модели, чтобы использовать типы данных с фиксированной точкой. Вы хотите, чтобы параметр усиления появился в сгенерированном коде как настраиваемая глобальная переменная. Вы знаете область значений реальных значений, которые вы ожидаете, что параметр примет (например, между 0 и 4). Если можно соответствовать требованиям к приложению несмотря на уменьшаемую точность, можно уменьшать потребление памяти путем конфигурирования параметра, чтобы использовать другой тип данных, чем сигналы ввода и вывода блока.
Откройте модель fxpdemo_direct_form2
в качестве примера и сконфигурируйте его, чтобы показать сгенерированные имена блоков.
load_system('fxpdemo_direct_form2') set_param('fxpdemo_direct_form2','HideAutomaticNames','off') open_system('fxpdemo_direct_form2')
Обновите блок-схему. Сигналы в этом использовании модели подписали типы данных с фиксированной точкой с размером слова 16 и единственное двоичной точкой масштабирование.
Откройте диалоговое окно блока Gain5. Параметр Усиления устанавливается на 1.85
. Предположим, что вы хотите сконфигурировать этот параметр.
Установите усиление на myGainParam
и нажмите Apply.
Кликните по кнопке действий (с тремя вертикальными точками) рядом со значением параметров. Выберите Create.
В диалоговом окне Create New Data, установленном Значении к Simulink.Parameter(1.85)
и нажмите Create. Simulink.Parameter
объект myGainParam
появляется в базовом рабочем пространстве.
Откройте приложение Simulink Coder. Во вкладке C Code выберите Code Interface> Default Code Mappings. В редакторе Отображений Кода, под Параметрами, устанавливает класс памяти для myGainParam
к ExportedGlobal
. С этой установкой, myGainParam
появляется в сгенерированном коде как глобальная переменная.
В диалоговом окне блока, на вкладке Parameter Attributes, установленном минимуме Параметра к 0
и максимум Параметра к 4
.
Установите Тип данных параметров на fixdt(0,8)
и нажмите Apply.
Нажмите кнопку Show Data Type Assistant. Ассистент Типа данных показывает что выражение fixdt(0,8)
задает тип данных с фиксированной точкой без знака с размером слова 8 и масштабирование лучшей точности. Когда вы симулируете или генерируете код, параметры блоков выбирают дробную длину (масштабирующуюся), который позволяет типу данных представлять значения между минимумом параметра и максимумом (0 и 4) с самой лучшей точностью.
В Ассистенте Типа данных, набор, Масштабирующийся к Binary point
. Нажмите Calculate Best-Precision Scaling, детали Fixed-point и Детали Обновления. Информация под деталями Фиксированной точки показывает, что дробная длина 5 может представлять значения параметров точностью 0,03125.
Задержите Масштабирование к Best precision
и нажмите ОК. В этом примере, когда вы симулируете или генерируете код, параметры блоков выбирают дробную длину 5.
В качестве альтернативы можно использовать эти команды в командной строке, чтобы создать объект и сконфигурировать блок:
myGainParam = Simulink.Parameter(1.85); myGainParam.CoderInfo.StorageClass = 'ExportedGlobal'; set_param('fxpdemo_direct_form2/Gain5','Gain','myGainParam') set_param('fxpdemo_direct_form2/Gain5','ParamMin','0','ParamMax','4') set_param('fxpdemo_direct_form2/Gain5','ParamDataTypeStr','fixdt(0,8)')
Сконфигурируйте модель, чтобы представить отчет генерации кода. Чтобы уменьшать помеху в Командном окне, очистите параметр конфигурации Многословная сборка.
set_param('fxpdemo_direct_form2','GenerateReport','on',... 'LaunchReport','on','RTWVerbose','off')
Сгенерируйте код из модели.
evalc('rtwbuild(''fxpdemo_direct_form2'')');
Сгенерированный файл fxpdemo_direct_form2.c
задает глобальную переменную myGainParam
при помощи типа данных uint8_T
, который соответствует заданному размеру слова, 8. Код инициализирует переменную при помощи целочисленного значения, которое, учитывая дробную длину 5, представляет реальное значение параметров 1.85.
file = fullfile('fxpdemo_direct_form2_grt_rtw','fxpdemo_direct_form2.c'); rtwdemodbtype(file,'/* Exported block parameters */','uint8_T myGainParam = 59U;',1,1)
/* Exported block parameters */ uint8_T myGainParam = 59U; /* Variable: myGainParam
Алгоритм кода использует myGainParam
вычислить выход блока Gain5. Алгоритм использует сдвиг C, чтобы масштабировать результат вычисления.
rtwdemodbtype(file,'/* Gain: ''<Root>/Gain5'' incorporates:',... '/* Gain: ''<Root>/Gain'' incorporates:',1,0)
/* Gain: '<Root>/Gain5' incorporates: * UnitDelay: '<Root>/Unit Delay1' */ fxpdemo_direct_form2_B.Gain5 = (int16_T)((myGainParam * fxpdemo_direct_form2_B.UnitDelay1) >> 5);
rtwdemoclean;