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

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

Эта оптимизация:

  • Увеличивает скорость выполнения.

  • Приводит к меньшему коду, тем самым снижая потребление ПЗУ.

Риски

Когда вы выбираете NoFixptDivByZeroProtection параметр, генератор кода удаляет код, который защищает от следующих ошибок:

  • Когда вы делите на нули, это не определено и приводит к ошибке во время выполнения в сгенерированном коде.

  • Когда вы делите минимальное представимое значение целого числа со знаком на отрицательное, идеальный результат равен максимальному представляемому значению плюс единице (INT_MAX + 1), что не представимо. Это исключение может привести к непредвиденной остановке или аварийному завершению работы приложения во время выполнения.

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

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

В rtwdemo_nzcheck модели два сигнала типа int8 подача в блок деления.

model = 'rtwdemo_nzcheck';
open_system(model);

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

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

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

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

set_param(model, 'NoFixptDivByZeroProtection', 'off');
slbuild(model);
### Starting build procedure for: rtwdemo_nzcheck
### Successful completion of code generation for: rtwdemo_nzcheck

Build Summary

Top model targets built:

Model            Action          Rebuild Reason                                    
===================================================================================
rtwdemo_nzcheck  Code generated  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 6.4862s

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

cfile = fullfile(cgDir,'rtwdemo_nzcheck_ert_rtw','rtwdemo_nzcheck.c');
rtwdemodbtype(cfile,'/* Real-time model','/* Model initialize function',1, 1);
/* Real-time model */
static RT_MODEL_rtwdemo_nzcheck rtwdemo_nzcheck_M_;
RT_MODEL_rtwdemo_nzcheck *const rtwdemo_nzcheck_M = &rtwdemo_nzcheck_M_;
int32_T div_s32(int32_T numerator, int32_T denominator)
{
  int32_T quotient;
  uint32_T tempAbsQuotient;
  if (denominator == 0) {
    quotient = numerator >= 0 ? MAX_int32_T : MIN_int32_T;

    /* Divide by zero handler */
  } else {
    tempAbsQuotient = (numerator < 0 ? ~(uint32_T)numerator + 1U : (uint32_T)
                       numerator) / (denominator < 0 ? ~(uint32_T)denominator +
      1U : (uint32_T)denominator);
    quotient = (numerator < 0) != (denominator < 0) ? -(int32_T)tempAbsQuotient :
      (int32_T)tempAbsQuotient;
  }

  return quotient;
}

/* Model step function */
void rtwdemo_nzcheck_step(void)
{
  /* Product: '<Root>/Divide' incorporates:
   *  Inport: '<Root>/In1'
   *  Inport: '<Root>/In2'
   */
  Y = div_s32(U1, U2);
}

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

  1. Откройте диалоговое окно Параметры конфигурации.

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

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

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

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

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

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

slbuild(model);
### Starting build procedure for: rtwdemo_nzcheck
### Successful completion of code generation for: rtwdemo_nzcheck

Build Summary

Top model targets built:

Model            Action          Rebuild Reason                   
==================================================================
rtwdemo_nzcheck  Code generated  Generated code was out of date.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 6.6813s

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

rtwdemodbtype(cfile,'/* Real-time model','/* Model initialize function',1, 1);
/* Real-time model */
static RT_MODEL_rtwdemo_nzcheck rtwdemo_nzcheck_M_;
RT_MODEL_rtwdemo_nzcheck *const rtwdemo_nzcheck_M = &rtwdemo_nzcheck_M_;

/* Model step function */
void rtwdemo_nzcheck_step(void)
{
  /* Product: '<Root>/Divide' incorporates:
   *  Inport: '<Root>/In1'
   *  Inport: '<Root>/In2'
   */
  Y = U1 / U2;
}

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

bdclose(model)
rtwdemoclean;
cd(currentDir)

Дополнительная информация

Существует несколько других факторов, которые могут повлиять на внешний вид сгенерированного кода для операций деления. Сгенерированный код для блоков, содержащих код MATLAB ® с целочисленными или фиксированными операциями деления, отличается от встроенного блока Divide в Simulink ®. Чтобы сбалансировать эффективность и семантику фиксированных и целочисленных делений в этих блоках, используйте fi Объектам и установите fimath свойства, соответствующие вашим потребностям и требующие лицензии Fixed-Point Designer™. Режимы округления и переполнения также влияют на размер и эффективность сгенерированного кода.

См. также

Похожие темы