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

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

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

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

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

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

load_system('rtwdemo_basicsc')
set_param('rtwdemo_basicsc','HideAutomaticNames','off')
open_system('rtwdemo_basicsc')

Идентифицируйте блок Gain в модели, которая использует переменную K1 базового рабочего пространства, чтобы установить значение параметра Усиления. Входной сигнал этого блока использует тип данных single.

В модели выберите View> Model Data Editor.

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

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

В Model Data Editor, набор представление Change выпадающий список к Code.

Обновите блок-схему. Теперь, в Model Data Editor, таблица данных показывает строки, которые соответствуют переменным рабочей области, которые модель использует, включая K1.

В Model Data Editor найдите строку, которая соответствует K1. Для той строки, в столбце Класса памяти, выбирают Convert to parameter object. Simulink преобразовывает K1 в объект Simulink.Parameter.

Используйте столбец Класса памяти, чтобы применить класс памяти ExportedGlobal. С этой установкой объект появляется в сгенерированном коде как глобальная переменная.

В Model Data Editor, представлении Change набора к Design.

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

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

K1 = Simulink.Parameter(2);
K1.CoderInfo.StorageClass = 'ExportedGlobal';

Сгенерируйте код из модели.

rtwbuild('rtwdemo_basicsc')
### Starting build procedure for model: rtwdemo_basicsc
### Successful completion of build procedure for model: rtwdemo_basicsc

Сгенерированный rtwdemo_basicsc.c файла задает глобальную переменную K1 при помощи типа данных real32_T, который соответствует типу данных single в Simulink.

file = fullfile('rtwdemo_basicsc_grt_rtw','rtwdemo_basicsc.c');
rtwdemodbtype(file,'/* Exported block parameters */','real32_T K1 = 2.0F;',1,1)
/* Exported block parameters */
real32_T K1 = 2.0F;                    /* Variable: K1

Алгоритм сгенерированного кода в функции модели step использует K1 непосредственно без преобразования типа.

rtwdemodbtype(file,' rtwdemo_basicsc_DW.X = K1',...
    ' rtCP_Table1_bp01Data, rtCP_Table1_tableData,',1,1)
    rtwdemo_basicsc_DW.X = K1 * look1_iflf_binlx(rtwdemo_basicsc_U.input2,
      rtCP_Table1_bp01Data, rtCP_Table1_tableData, 10U);

На вкладке Model Data Editor Parameters можно опционально установить тип данных параметров блоков Усиления к Inherit: Inherit via internal rule (значение по умолчанию). В этом случае параметры блоков выбирают совпадающий тип данных в качестве входного сигнала, single. Однако, когда вы используете Inherit: Inherit via internal rule при других обстоятельствах (например, когда вы используете типы данных с фиксированной точкой), параметры блоков могут выбрать различный тип данных.

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

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

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

myType = Simulink.NumericType;
myType.DataTypeMode = 'Single';

Используйте столбец Типа данных 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_basicsc/In2','OutDataTypeStr','myType')
set_param('rtwdemo_basicsc/Gain','ParamDataTypeStr','Inherit: Inherit from ''Gain''')

Сгенерируйте код из модели.

rtwbuild('rtwdemo_basicsc')
### Starting build procedure for model: rtwdemo_basicsc
### Successful completion of build procedure for model: rtwdemo_basicsc

Глобальная переменная K1 продолжает использовать тип данных real32_T.

file = fullfile('rtwdemo_basicsc_grt_rtw','rtwdemo_basicsc.c');
rtwdemodbtype(file,'/* Exported block parameters */','real32_T K1 = 2.0F;',1,1)
/* Exported block parameters */
real32_T K1 = 2.0F;                    /* Variable: K1

Уменьшайте потребление памяти путем хранения значения параметров в небольшом типе данных

Когда вы используете объект параметра (например, Simulink.Parameter), чтобы установить значения параметров блоков, можно сконфигурировать объект появиться в сгенерированном коде как настраиваемая глобальная переменная. По умолчанию объект параметра и соответствующая глобальная переменная обычно используют совпадающий тип данных в качестве сигнала или сигнализируют, с которым работает блок. Например, если входной сигнал блока Gain использует тип данных int16, объект параметра обычно использует совпадающий тип данных. Чтобы уменьшать объем памяти, который использует эта переменная, укажите, что переменная использует меньший целочисленный тип данных, такой как int8.

Сохраните значение параметров в целочисленном типе данных

Запустите скрипт prepare_rtwdemo_basicsc_2, который готовит модель rtwdemo_basicsc к этому примеру.

run(fullfile(matlabroot,'examples','simulinkcoder',...
    'main','prepare_rtwdemo_basicsc_2'))

Многие сигналы в модели используют тип данных single.

В модели выберите View> Model Data Editor.

В Model Data Editor осмотрите вкладку Parameters.

Нажмите кнопку дополнительной информации Show/refresh.

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

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

В Model Data Editor, набор представление Change выпадающий список к Code.

В таблице данных, для строки, которая соответствует K1, в столбце Класса памяти, из выпадающего списка, выбирают Convert to parameter object. Simulink преобразовывает K1 в объект Simulink.Parameter.

K1 = Simulink.Parameter(K1);

Используйте столбец Класса памяти, чтобы применить класс памяти ExportedGlobal к K1. С этой установкой K1 появляется в сгенерированном коде как глобальная переменная.

K1.CoderInfo.StorageClass = 'ExportedGlobal';

В Model Data Editor, представлении Change набора к Design и использовании столбец Типа данных, чтобы применить тип данных int8 к K1.

K1.DataType = 'int8';

Для строки, которая представляет параметры блоков Усиления в столбце Типа данных, устанавливает выпадающий список на Inherit: Inherit from 'Gain'. С этой установкой параметр Усиления блока наследовал тип данных int8 от объекта параметра.

set_param('rtwdemo_basicsc/Gain','ParamDataTypeStr',...
    'Inherit: Inherit from ''Gain''')

Сгенерируйте код из модели.

rtwbuild('rtwdemo_basicsc')
### Starting build procedure for model: rtwdemo_basicsc
### Successful completion of build procedure for model: rtwdemo_basicsc

Сгенерированный rtwdemo_basicsc.c файла задает глобальную переменную K1 при помощи типа данных int8_T, который соответствует типу данных int8 в Simulink.

file = fullfile('rtwdemo_basicsc_grt_rtw','rtwdemo_basicsc.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 к типу данных real32_T (single), потому что сигналы, вовлеченные в вычисление, используют тип данных real32_T.

rtwdemodbtype(file,' rtwdemo_basicsc_DW.X =','10U);',1,1)
    rtwdemo_basicsc_DW.X = (real32_T)K1 * look1_iflf_binlx
      (rtwdemo_basicsc_U.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 появляется в базовом рабочем пространстве.

В диалоговом окне свойства 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'' */',...
'/* Gain: ''<Root>/Gain'' incorporates:',1,0)
  /* Gain: '<Root>/Gain5' */
  fxpdemo_direct_form2_B.Gain5 = (int16_T)((myGainParam *
    fxpdemo_direct_form2_B.UnitDelay1) >> 5);

Похожие темы