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

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

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

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

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

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

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

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

На вкладке Modeling нажмите 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.

На вкладке Modeling нажмите 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 единственный) потому что сигналы, вовлеченные в вычисление, используют тип данных 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);

Похожие темы