Чтобы оптимизировать сгенерированный код для модели, можно выбрать опцию использования входной информации диапазона, также известной как расчетный минимум и максимум, которая задается для сигналов и параметров. Эти минимальные и максимальные значения обычно представляют пределы окружающей среды, такие как температура, или механические и электрические пределы, такие как выходные диапазоны датчиков.
В диалоговом окне Параметры конфигурации (Configuration Parameters) на панели Оптимизация (Optimization) при установке флажка Оптимизировать с использованием указанных минимальных и максимальных значений (Optimize using specified minimum and maximum values) программа использует минимальное и максимальное значения для получения информации о диапазонах для нисходящих сигналов в модели. Затем эта производная информация диапазона используется для определения возможности оптимизации генерируемого кода путем:
Уменьшение выражений до констант
Удаление мертвых ветвей условных операторов
Устранение ненужных математических операций
Эта оптимизация приводит к:
Снижение потребления ПЗУ и ОЗУ
Повышенная скорость выполнения
Чтобы сделать оптимизацию более вероятной:
Предоставьте как можно больше проектной минимальной и максимальной информации. Укажите минимальное и максимальное значения для сигналов и параметров в модели для:
Блоки ввода и вывода
Блочные выходы
Входы блоков, например, для блоков MATLAB Function и Stateflow Chart
Simulink.Signal объекты
Перед формированием кода проверьте минимальное и максимальное значения сигналов и параметров. В противном случае оптимизация может привести к численному несоответствию с моделированием. Можно моделировать модель с включенной проверкой диапазона моделирования. При возникновении ошибок или предупреждений устраните эти неполадки перед созданием кода.
Предоставьте проектную минимальную и максимальную информацию перед блоками как можно ближе к входам блоков. Если указать минимальное и максимальное значения для вывода блока, эти значения, скорее всего, повлияют на выходы блоков непосредственно в нисходящем направлении.
В этом примере показано, как минимальные и максимальные значения, заданные для сигналов и параметров в модели, используются для оптимизации генерируемого кода.
Обзор
Указанные минимальное и максимальное значения обычно представляют пределы окружающей среды, такие как температура, или механические и электрические пределы, такие как выходные диапазоны датчиков.
Эта оптимизация использует эти значения для оптимизации создаваемого кода. Например, он сводит выражения к константам или удаляет мертвые ветви условных операторов.
ПРИМЕЧАНИЕ: Убедитесь, что указанные минимальные и максимальные значения являются допустимыми пределами. В противном случае эта оптимизация может привести к численному несоответствию с моделированием.
Преимущества оптимизации генерируемого кода:
Уменьшение потребления ПЗУ и ОЗУ.
Повышение скорости выполнения.
Просмотреть минимальную и максимальную информацию
Рассмотрим модель rtwdemo_minmax. В этой модели существуют минимальные и максимальные значения, указанные в Inports и в параметре усиления блока Gain.
model = 'rtwdemo_minmax';
open_system(model);

Создать код без этой оптимизации
Сначала создайте код для этой модели без учета значений min и max.
currentDir = pwd;
[~,cgDir] = rtwdemodir();
rtwconfiguredemo(model,'ERT')
slbuild(model)
### Starting build procedure for: rtwdemo_minmax ### Successful completion of build procedure for: rtwdemo_minmax Build Summary Top model targets built: Model Action Rebuild Reason =============================================================================================== rtwdemo_minmax Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 10.121s
Часть rtwdemo_minmax.c перечислены ниже.
cfile = fullfile(cgDir,'rtwdemo_minmax_ert_rtw','rtwdemo_minmax.c'); rtwdemodbtype(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */
void rtwdemo_minmax_step(void)
{
int32_T tmp;
/* Sum: '<Root>/Sum' incorporates:
* Inport: '<Root>/U1'
* Inport: '<Root>/U2'
* Sum: '<Root>/Sum2'
* Switch: '<Root>/Switch'
*/
tmp = U1 + U2;
/* Switch: '<Root>/Switch' incorporates:
* Gain: '<Root>/Gain'
* Inport: '<Root>/U3'
* RelationalOperator: '<Root>/Relational Operator'
* Sum: '<Root>/Sum'
*/
if (tmp <= k * U3) {
/* Outport: '<Root>/Out1' incorporates:
* Sum: '<Root>/Sum2'
*/
rtY.Out1 = tmp + U3;
} else {
/* Outport: '<Root>/Out1' incorporates:
* Inport: '<Root>/U1'
* Inport: '<Root>/U2'
* Product: '<Root>/Product'
*/
rtY.Out1 = U1 * U2 * U3;
}
}
Включить эту оптимизацию
Откройте диалоговое окно «Параметры конфигурации».
На панели Оптимизация (Optimization) выберите Оптимизировать (Optimize), используя указанные минимальное и максимальное значения.
Кроме того, эту оптимизацию можно включить, задав параметр командной строки.
set_param(model, 'UseSpecifiedMinMax', 'on');
Создание кода с помощью этой оптимизации
В модели с указанными минимальным и максимальным значениями для U1 и U2, сумма U1 и U2 имеет минимальное значение 50. Учитывая диапазон U3 и указанные минимальное и максимальное значения для параметра блока усиления, максимальное значение выходного сигнала блока усиления равно 40.
Выходной сигнал блока Relational Operator остается ложным, а выходной сигнал блока Switch остается произведением трех входов.
Настройте и создайте модель с помощью встроенного кодера.
rtwconfiguredemo(model,'ERT')
slbuild(model)
### Starting build procedure for: rtwdemo_minmax ### Successful completion of build procedure for: rtwdemo_minmax Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================== rtwdemo_minmax Code generated and compiled Generated code was out of date. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 9.2066s
Просмотр оптимизированного кода из rtwdemo_minmax.c.
cfile = fullfile(cgDir,'rtwdemo_minmax_ert_rtw','rtwdemo_minmax.c'); rtwdemodbtype(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */
void rtwdemo_minmax_step(void)
{
/* Outport: '<Root>/Out1' incorporates:
* Inport: '<Root>/U1'
* Inport: '<Root>/U2'
* Inport: '<Root>/U3'
* Product: '<Root>/Product'
* Switch: '<Root>/Switch'
*/
rtY.Out1 = U1 * U2 * U3;
}
Закройте модель и выполните очистку.
bdclose(model) rtwdemoclean; cd(currentDir)
Эта оптимизация не учитывает минимальные и максимальные значения для:
Объединение входных данных блоков. Чтобы обойти эту проблему, используйте Simulink.Signal на выходе блока «Слияние» и укажите диапазон для этого объекта.
Элементы шины.
Условно выполняемая подсистема (например, запускаемая подсистема) выводит блоки, которые непосредственно соединены с блоком Outport.
Блоки аутпорта в условно выполненных подсистемах могут иметь начальное значение, заданное для использования, только если система не запущена. В этом случае оптимизация не может использовать диапазон вывода блока, поскольку диапазон может не охватывать начальное значение блока.
При использовании программного обеспечения Polyspace ® для проверки кода, созданного с помощью этой оптимизации, ранее зеленый код может быть отмечен как оранжевый. Например, если модель содержит деление, в котором диапазон знаменателя не включает ноль, созданный код не включает защиту от деления на ноль. Polyspace может пометить этот код оранжевым, так как он не содержит информации о минимальном и максимальном значениях для входов в деление.
Polyspace Code Prover™ автоматически фиксирует некоторые минимальные и максимальные значения, указанные в рабочей области MATLAB ®, например, дляSimulink.Signal и Simulink.Parameter объекты. В этом примере для предоставления информации о диапазоне для программного обеспечения Polyspace используйте Simulink.Signal объект на входе деления и укажите диапазон, который не включает ноль.
Средство проверки кода Polyspace сохраняет эти значения в файле спецификации диапазона данных (DRS). Однако они не фиксируют все минимальные и максимальные значения в модели Simulink ®. Чтобы предоставить в Polyspace дополнительную минимальную и максимальную информацию, можно вручную определить файл DRS.
Если используются типы данных с двойной точностью и выбран параметр конфигурации с не конечными числами, эта оптимизация не выполняется.
Если модель содержит несколько экземпляров многоразовой подсистемы и каждый экземпляр использует входные сигналы с различными минимальными и максимальными значениями, эта оптимизация может привести к различному сгенерированному коду для каждой подсистемы, поэтому повторное использование кода не происходит. Без этой оптимизации код генерируется один раз для подсистемы и используется совместно несколькими экземплярами подсистемы.
При выборе этой опции в окне «Проверка параметров оптимизации, связанных с безопасностью» (Simulink Check) появится предупреждение. Для многих критически важных для безопасности приложений автоматическое удаление мертвого кода неприемлемо, поскольку это может сделать код не отслеживаемым.
Оптимизация с использованием указанных минимального и максимального значений