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

Чтобы сгенерировать более эффективный код, сопоставьте типы параметров блоков (таких как параметр Gain блока Gain) с типами данных сигнала. Также можно хранить параметры в небольших типах данных.

Устранение ненужных типоразмеров и сдвигов путем согласования типов данных

Эти примеры показа, как сгенерировать эффективный код путем конфигурирования параметров блоков, чтобы использовать совпадающий тип данных как сигнал, над которым работает блок.

Сохраните информацию о типах данных в модели

Откройте пример модели rtwdemo_configrpinterface и сконфигурируйте его, чтобы показать сгенерированные имена блоков.

open_system('rtwdemo_configrpinterface')
set_param('rtwdemo_configrpinterface','HideAutomaticNames','off')

На вкладке Моделирование (Modeling) щелкните Редактор данных модели (Model Data Editor).

В Model Data Editor выберите вкладку Параметры.

В модели выберите блок Gain. В Model Data Editor столбец Data Type показывает, что тип данных параметра Gain блока установлен на Inherit: Same as input. При этой настройке параметр Gain этого блока использует совпадающий тип данных, что и входной сигнал.

В редакторе Отображения в разделе Parameters установите класс памяти для K1 равным ExportedGlobal.

В Model Data Editor установите значение представления Change на Design.

В таблице данных для строки, которая представляет K1, в столбце Data Type, выберите Auto. С этой настройкой объект параметра получает свой тип данных от параметров блоков, которые используют объект (в данном случае, параметры блоков Gain).

Кроме того, чтобы создать и сконфигурировать объект, используйте эти команды в командной строке:

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<reservedrangesplaceholder0 > задает глобальную переменную 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 непосредственно без typecasting.

rtwdemodbtype(file,'output =',...
    '10U',1,1)
    output = K1 * look1_binlc((*input2), rtCP_Table1_bp01Data,
      rtCP_Table1_tableData, 10U);

В редакторе Отображения в разделе Parameters можно опционально задать класс памяти для K1 равным Inherit: Inherit via internal rule (значение по умолчанию).

В этом случае параметры блоков выбирают совпадающий тип данных в качестве входного сигнала, double. Однако, когда вы используете Inherit: Inherit via internal ruleПри других обстоятельствах (для примера, когда вы используете типы данных с фиксированной точкой) параметры блоков могут выбрать различные типы данных.

Сохраните информацию о типе данных в объекте параметра

Когда вы используете Simulink.Parameter объект для экспорта или импорта данных о параметрах из сгенерированного кода во внешний код, например, путем применения класса памяти ImportedExtern, можно задать информацию о типе данных в объекте параметра. Чтобы соответствовать типу данных объекта параметра с типом данных сигнала, создайте Simulink.NumericType или Simulink.AliasType объект. Можно строго управлять типом данных, который объект параметра использует в сгенерированном коде, устраняя риск того, что Simulink выберет различные типы данных при внесении изменений в модель.

В командной строке создайте Simulink.NumericType объект, который представляет тип данных double.

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 смотрите вкладку Параметры.

Нажмите кнопку Показать/обновить дополнительные сведения.

Рядом с полем Filter contents активируйте Фильтр с помощью кнопки выбора.

В модели щелкните блок Gain. На Model Data Editor показана одна строка, которая соответствует параметру Gain блока и одна строка, которая соответствует Переменному MATLAB K1, который устанавливает значение параметров равной 2. K1 находится в рабочем пространстве модели.

На вкладке Кода С выберите Код Интерфейс > По умолчанию Код Отображений. В редакторе Отображения в разделе Parameters установите класс памяти для K1 равным ExportedGlobal.

cm = coder.mapping.api.get('rtwdemo_configrpinterface');
setModelParameter(cm,'K1','StorageClass','ExportedGlobal');

На вкладке Кода С выберите Код Интерфейс > По умолчанию Код Отображений. В Model Data Editor установите значение представления Change на Design и убедитесь, что столбец Data Type для K1 является int8.

hws = get_param(bdroot, 'modelworkspace');
hws.setVariablePart('K1.DataType','int8');

Для строки, которая представляет параметры блоков, в столбце Data Type установите выпадающий список равным Inherit: Inherit from 'Gain'. При помощи этой настройки параметр 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 блока. Параметр Gain установлен в 1.85. Предположим, вы хотите сконфигурировать этот параметр.

Установите коэффициент усиления на myGainParam и нажмите Применить.

Нажмите кнопку действия (с тремя вертикальными точками) рядом со значением параметров. Выберите «Создать».

В диалоговом окне «Создание новых данных» установите значение Simulink.Parameter(1.85) и нажмите «Создать». The Simulink.Parameter myGainParam объекта появляется в базовом рабочем пространстве.

Откройте приложение Simulink Coder. На вкладке Код С выберите Code Interface > Default Code Mappings. В редакторе Отображения в разделе Parameters установите класс памяти для myGainParam на ExportedGlobal. С помощью этой настройки myGainParam появляется в сгенерированном коде как глобальная переменная.

В диалоговом окне блока на вкладке Параметра Attributes установите Параметр минимум 0 и Параметр Максимум до 4.

Установите тип данных параметр на fixdt(0,8) и нажмите Применить.

Нажмите кнопку Show Data Type Assistant. Помощник по типам данных показывает, что выражение fixdt(0,8) задает неподписанный тип данных с фиксированной точкой с размером слова 8 и оптимальной точностью масштабирования. Когда вы моделируете или генерируете код, параметры блоков выбирают длину дроби (масштабирование), которая позволяет типу данных представлять значения между минимумом и максимумом (0 и 4) с максимально возможной точностью.

В помощнике по типам данных установите значение Scaling равным Binary point. Щелкните Вычислить точное масштабирование (Calculate Best-Precision Scaling), Детали фиксированной точки (Fixed-point) и Сведения об обновлении (Refresh Details). Информация под деталями Фиксированной точки показывает, что длина дроби 5 может представлять значения параметров с точностью 0,03125.

Установите масштабирование назад на Best precision и нажмите OK. В этом примере, когда вы моделируете или генерируете код, параметры блоков выбирают длину дроби 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)')

Сконфигурируйте модель, чтобы создать отчет генерации кода. Чтобы уменьшить загромождение в Командном окне, очистите параметр конфигурации Verbose build.

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;

Похожие темы