exponenta event banner

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

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

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

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

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

Откройте rtwdemo_configrpinterface модели примера и настройте его для отображения сгенерированных имен блоков.

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

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

В Редакторе данных модели (Model Data Editor) выберите вкладку Параметры (Parameters).

В модели выберите блок усиления. В редакторе данных модели столбец «Тип данных» показывает, что тип данных параметра «Усиление» блока имеет значение Inherit: Same as input. При этом параметре усиления этого блока используется тот же тип данных, что и входной сигнал.

В редакторе Сопоставления кодов в разделе Параметры задайте класс хранения для K1 как ExportedGlobal.

В редакторе данных модели задайте для параметра «Изменить вид» значение Design.

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

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

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);

В редакторе сопоставлений кодов в разделе Параметры (Parameters) можно дополнительно задать класс хранения для 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';

Используйте столбец «Тип данных редактора данных модели», чтобы задать для этих типов данных значение myType:

  • Объект параметра. Используйте вкладку Параметры (Parameters).

  • Блок Inport с именем In2. Используйте закладку Inports/Outports. Из-за распространения типа данных входной сигнал блока усиления также использует myType.

На вкладке «Параметры редактора данных модели» задайте тип данных параметра блока усиления равным 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) для установки значений параметров блока можно настроить отображение объекта в сгенерированном коде в качестве настраиваемой глобальной переменной. По умолчанию объект параметра и соответствующая глобальная переменная обычно используют тот же тип данных, что и сигнал или сигналы, над которыми работает блок. Например, если входной сигнал блока усиления использует тип данных 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).

Нажмите кнопку Показать/обновить дополнительную информацию.

Рядом с полем Содержимое фильтра (Filter contents) активируйте кнопку Фильтр с помощью выбора (Filter using selection).

В модели щелкните блок усиления. Редактор данных модели показывает одну строку, соответствующую параметру усиления блока, и одну строку, соответствующую переменной MATLAB. K1, которая устанавливает значение параметра равным 2. K1 находится в рабочей области модели.

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

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

На вкладке Код C выберите Интерфейс кода > Сопоставления кодов по умолчанию. В редакторе данных модели задайте для параметра «Изменить вид» значение Design и убедитесь, что столбец Тип данных для K1 является int8.

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

Для строки, представляющей параметр блока усиления, в столбце «Тип данных» установите в раскрывающемся списке значение 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 для вычисления выходного сигнала блока усиления. Алгоритм производит слепки 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) и нажмите кнопку «Создать». Simulink.Parameter объект myGainParam отображается в базовой рабочей области.

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

В диалоговом окне блока на вкладке «Атрибуты параметра» задайте для параметра «Минимум» значение 0 и параметр maximum to 4.

Задать тип данных параметра как fixdt(0,8) и нажмите «Применить».

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

В помощнике по типам данных установите для параметра «Масштабирование» значение Binary point. Выберите «Рассчитать наиболее точное масштабирование», «Сведения о фиксированной точке» и «Обновить сведения». Информация в разделе Детали фиксированной точки (Fixed-point details) показывает, что длина дроби 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)')

Настройте модель для создания отчета о создании кода. Для уменьшения загроможденности в окне команд удалите параметр конфигурации 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;

Связанные темы