exponenta event banner

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

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

Риски

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

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

Пример модели

В модели matlab: mExiveParamExpr, входной сигнал типаint8 подается в блок усиления.

model = 'mEfficientParamExpr';
open_system(model);

Создать код

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

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

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

set_param(model, 'EfficientTunableParamExpr', 'off');
evalc('slbuild(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. Откройте диалоговое окно «Параметры конфигурации».

  2. На панели Оптимизация (Optimization) выберите Удалить код из настраиваемых выражений параметров, насыщающих значения вне диапазона.

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

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

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

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

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

evalc('slbuild(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)

Связанные темы