exponenta event banner

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

Оптимизация созданного кода путем удаления кода, защищающего от деления на ноль и переполнения в разделении 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™. Режимы округления и переполнения также влияют на размер и эффективность генерируемого кода.

См. также

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