exponenta event banner

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

Оптимизируйте сгенерированный код путем удаления кода, который защищает выражения параметра от целочисленного переполнения для данных фиксированной точки и целых чисел. Если вы уверены, что не настроите условия выражений настраиваемого параметра, чтобы заставить их оценивать к значению, которое является ниже или выше представимого значения типа данных, включите эту оптимизацию. Эта оптимизация увеличивает скорость выполнения и результаты в меньшем коде, который уменьшает потребление 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)

Похожие темы