Сгенерируйте эффективный код путем определения типов данных для параметров блоков

Чтобы сгенерировать более эффективный код, совпадайте с типами данных параметров блоков (такими как параметр 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;

Похожие темы