Чтобы оптимизировать сгенерированный код для вашей модели, можно выбрать опцию для использования информации о входной области значений, также известной как design minimum and maximum, которая задается на сигналах и параметрах. Эти минимальные и максимальные значения обычно представляют пределы окружающей среды, такие как температура или механические и электрические пределы, такие как выходные области значений датчиков.
В диалоговом окне Параметров конфигурации, на панели Optimization, когда вы выбираете флажок Optimize using specified minimum and maximum values, программное обеспечение использует минимальное и максимальное значения, чтобы вывести область значений информацию для нисходящих сигналов в модели. Затем он использует эту полученную информацию о области значений, чтобы определить, возможно ли упорядочить сгенерированный код путем:
Сокращение выражений до констант
Удаление мертвых ветвей условных операторов
Исключение ненужных математических операций
Эта оптимизация приводит к:
Сокращение потребления ПЗУ и ОЗУ
Улучшенная скорость выполнения
Чтобы сделать оптимизацию более вероятной:
Предоставьте как можно больше проектной минимальной и максимальной информации. Задайте минимальное и максимальное значения для сигналов и параметров в модели для:
Inport и Outport блоки
Блочные выходы
Блочные входы, например, для блоков 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
A фрагмента 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; } }
Включите эту оптимизацию
Откройте диалоговое окно Параметры конфигурации.
На панели Оптимизация выберите Оптимизировать с использованием заданных минимального и максимального значений.
Также можно включить эту оптимизацию, установив параметр командной строки.
set_param(model, 'UseSpecifiedMinMax', 'on');
Сгенерируйте код с этой оптимизацией
В модели с заданными минимальными и максимальными значениями для U1
и U2
, сумма U1
и U2
имеет минимальное значение 50. Принимая во внимание область значений U3
и заданные минимальное и максимальное значения для параметров блоков Gain, максимальное значение выхода блока Gain составляет 40.
Выход блока Relational Operator остается ложным, а выход блока Switch остается продуктом трех входов.
Сконфигурируйте и создайте модель с помощью Embedded Coder.
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)
Эта оптимизация не учитывает минимальные и максимальные значения для:
Merge блочные входы. Чтобы решить эту проблему, используйте Simulink.Signal
объект на выходе блока Merge и задайте область значений на этом объекте.
Элементы шины.
Условно выполненная подсистема (такая как триггируемая подсистема) выходы блоков, которые непосредственно соединяются с блоком Outport.
Outport блоки в условно выполненных подсистемах могут иметь начальное значение, заданное для использования, только когда система не запускается. В этом случае оптимизация не может использовать область значений выходного блока, потому что область значений может не охватывать начальное значение блока.
Если вы используете Polyspace® программное обеспечение для проверки кода, сгенерированного с помощью этой оптимизации, может пометить код, который ранее был зеленым, как оранжевый. Например, если ваша модель содержит деление, где область значений знаменателя не включает нуль, сгенерированный код не включает защиту от деления на нуль. Polyspace может отметить этот код оранжевым, потому что он не имеет информации о минимальных и максимальных значениях для входов в деление.
Polyspace Code Prover™ автоматически захватывает некоторые минимальные и максимальные значения, указанные в MATLAB® рабочая область, например, для Simulink.Signal
и Simulink.Parameter
объекты. В этом примере, чтобы предоставить информацию о области значений для программного обеспечения Polyspace, используйте Simulink.Signal
объект на входе деления и задайте область значений, который не включает нуль.
Polyspace Code Prover хранит эти значения в файле спецификаций области значений данных (DRS). Однако они не захватывают все минимальные и максимальные значения в вашем Simulink® модель. Чтобы предоставить дополнительную минимальную и максимальную информацию Polyspace, можно вручную задать файл DRS.
Если вы используете типы данных с двойной точностью и выбран параметр конфигурации non-finite numbers, эта оптимизация не происходит.
Если ваша модель содержит несколько образцов переиспользуемой подсистемы, и каждый образец использует входные сигналы с различными минимальными и максимальными значениями, эта оптимизация может привести к различным сгенерированным кодам для каждой подсистемы, поэтому повторное использование кода не происходит. Без этой оптимизации код генерируется один раз для подсистемы и разделяет этот код между несколькими образцами подсистемы.
Проверка Model Advisor Check параметров оптимизации, связанных с безопасностью (Simulink Check), генерирует предупреждение, если выбрана эта опция. Для многих критически важных для безопасности приложений автоматическое удаление мертвого кода недопустимо, поскольку это может сделать код недоступным.
Оптимизируйте с использованием заданных минимального и максимального значений