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

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

Риски

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

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

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

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

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

Кроме того, используйте 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)

Похожие темы