Удалите код из выражений настраиваемого параметра, которые насыщают против целочисленного переполнения

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

Риски

Когда вы выбираете EfficientTunableParamExpr параметр, и вы настраиваете условия выражения так, чтобы это столкнулось с целочисленным переполнением, результат повторится в сгенерированном коде. Это поведение может заставить приложение неожиданно вести себя во времени выполнения.

ПРИМЕЧАНИЕ: Если вы включаете эту оптимизацию, возможно, что результаты симуляции и следуют из сгенерированного кода, не находятся в поразрядном соглашении. Этот пример требует Embedded Coder®.

Модель в качестве примера

В модели matlab:mEfficientParamExpr, входной сигнал типа int8 подача в блок Gain.

model = 'mEfficientParamExpr';
open_system(model);

Сгенерируйте код

В вашей системе временная папка создайте другую временную папку для сборки и инспекционного процесса.

currentDir = pwd;
[~,cgDir] = rtwdemodir();

Создайте модель.

set_param(model, 'EfficientTunableParamExpr', 'off');
evalc('rtwbuild(model)');

Просмотрите сгенерированный код без оптимизации. Вот фрагмент mEfficientParamExpr.c.

cfile = fullfile(cgDir,'mEfficientParamExpr_ert_rtw','mEfficientParamExpr.c');
rtwdemodbtype(cfile,'/* Model step function ','/* Model initialize function',1, 1);
/* Model step function */
void mEfficientParamExpr_step(void)
{
  int32_T tmp;

  /* Gain: '<Root>/Gain' */
  tmp = P + Q;
  if (tmp > 127) {
    tmp = 127;
  } else {
    if (tmp < -128) {
      tmp = -128;
    }
  }

  /* Outport: '<Root>/Out1' incorporates:
   *  Gain: '<Root>/Gain'
   *  Inport: '<Root>/In1'
   */
  rtY.Out1 = (int8_T)(tmp * rtU.In1);
}

Включите оптимизацию

  1. Откройте диалоговое окно Configuration Parameters.

  2. На панели Оптимизации выберите код Remove из выражений настраиваемого параметра, который насыщает значения из области значений.

В качестве альтернативы используйте API командной строки, чтобы включить оптимизацию:

set_param(model, 'EfficientTunableParamExpr', 'on');

Сгенерируйте код с оптимизацией

Оптимизированный код не содержит код, который проверяет границы представимого значения типа данных.

Создайте модель.

evalc('rtwbuild(model)');

Следующее является фрагментом mEfficientParamExpr.c. Код, который защищает от переполнения выражения, не находится в сгенерированном коде.

rtwdemodbtype(cfile,'/* Model step function ','/* Model initialize function',1, 1);
/* Model step function */
void mEfficientParamExpr_step(void)
{
  /* Outport: '<Root>/Out1' incorporates:
   *  Gain: '<Root>/Gain'
   *  Inport: '<Root>/In1'
   */
  rtY.Out1 = (int8_T)((int8_T)(P + Q) * rtU.In1);
}

Закройте отчет генерации кода и модель.

bdclose(model)
rtwdemoclean;
cd(currentDir)

Похожие темы