주요 콘텐츠

이 페이지는 기계 번역을 사용하여 번역되었습니다. 영어 원문을 보려면 여기를 클릭하십시오.

정수 및 고정소수점 데이터에 대한 나눗셈 예외를 방지하는 코드 제거

정수 및 고정 소수점 데이터에 대한 INT_MIN/-1 나눗셈 연산에서 0으로 나눗셈 및 오버플로우를 방지하는 코드를 제거하여 생성된 코드를 최적화합니다. 프로그램 실행 중에 이러한 산술 예외가 발생하지 않는다고 확신한다면 이 최적화를 활성화하십시오. 단, 이로 인해 표현할 수 없는 몫이 발생할 수도 있습니다.

이 최적화:

  • 실행 속도를 높여줍니다.

  • 그 결과 코드 크기가 줄어들어 ROM 사용량을 줄일 수 있습니다.

위험 요소

NoFixptDivByZeroProtection 파라미터를 선택하면 코드 생성기는 다음 오류로부터 보호하는 코드를 제거합니다:

  • 0으로 나누면 정의되지 않은 값이 되며, 코드 생성 과정에서 런타임 오류가 발생합니다.

  • 부호 있는 정수의 표현 가능한 최솟값을 음의 1로 나누면, 이상적인 결과는 표현 가능한 최댓값에 1을 더한 값(INT_MAX + 1)이 되는데, 이는 표현할 수 없는 값입니다. 이 예외로 인해 실행 중에 애플리케이션이 예기치 않게 중단되거나 충돌할 수 있습니다.

참고: 이 최적화 기능을 활성화하면 시뮬레이션 결과와 코드 생성으로 생성된 코드의 결과가 비트 단위로 정확히 일치하지 않을 수 있습니다. 이 예제를 사용하려면 Embedded Coder® 라이선스가 필요합니다.

예제 모델

DivisionExceptions 모델에서, int8 유형의 두 신호가 분할 블록으로 입력됩니다.

model = 'DivisionExceptions';
open_system(model);

코드 생성

모델을 빌드합니다.

set_param(model, 'NoFixptDivByZeroProtection', 'off');
slbuild(model);
### Searching for referenced models in model 'DivisionExceptions'.
### Total of 1 models to build.
### Starting build procedure for: DivisionExceptions
### Successful completion of code generation for: DivisionExceptions

Build Summary

Top model targets:

Model               Build Reason                                         Status           Build Duration
========================================================================================================
DivisionExceptions  Information cache folder or artifacts were missing.  Code generated.  0h 0m 5.7351s

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

최적화가 적용되지 않은 생성된 코드를 확인합니다. 다음은 DivisionExceptions.c의 일부입니다.

cfile = fullfile('DivisionExceptions_ert_rtw','DivisionExceptions.c');
coder.example.extractLines(cfile,'/* Real-time model','/* Model initialize function',1, 1);
/* Real-time model */
static RT_MODEL_DivisionExceptions DivisionExceptions_M_;
RT_MODEL_DivisionExceptions *const DivisionExceptions_M = &DivisionExceptions_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 DivisionExceptions_step(void)
{
  /* Product: '<Root>/Divide' incorporates:
   *  Inport: '<Root>/In1'
   *  Inport: '<Root>/In2'
   */
  Y = div_s32(U1, U2);
}

/* Model initialize function */

최적화 활성화

  1. 구성 파라미터 대화 상자를 엽니다.

  2. 최적화 창에서 정수 나눗셈 산술 예외를 방지하는 코드 제거를 선택합니다.

또는 명령줄 API를 사용하여 최적화를 활성화할 수도 있습니다:

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

최적화를 적용하여 코드 생성

최적화된 코드에는 나눗수가 0인지 여부를 확인하는 코드가 포함되어 있지 않습니다.

모델을 빌드합니다.

slbuild(model);
### Searching for referenced models in model 'DivisionExceptions'.
### Total of 1 models to build.
### Starting build procedure for: DivisionExceptions
### Successful completion of code generation for: DivisionExceptions

Build Summary

Top model targets:

Model               Build Reason                     Status           Build Duration
====================================================================================
DivisionExceptions  Generated code was out of date.  Code generated.  0h 0m 4.2651s

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

다음은 DivisionExceptions.c의 일부입니다. 나눗셈 연산 예외를 처리하는 코드가 생성된 코드에 포함되어 있지 않습니다.

coder.example.extractLines(cfile,'/* Real-time model','/* Model initialize function',1, 1);
/* Real-time model */
static RT_MODEL_DivisionExceptions DivisionExceptions_M_;
RT_MODEL_DivisionExceptions *const DivisionExceptions_M = &DivisionExceptions_M_;

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

/* Model initialize function */

추가 정보

나눗셈 연산에 대해 생성된 코드의 형태에 영향을 미칠 수 있는 다른 요인들이 몇 가지 더 있습니다. 정수 또는 고정소수점 나눗셈 연산이 포함된 MATLAB® 코드가 있는 블록에 대해 생성된 코드는 Simulink®의 내장 Divide 블록과 다릅니다. 이 블록들에서 고정 소수점 및 정수 나눗셈의 효율성과 의미론적 정확성 간의 균형을 맞추려면 fi 객체를 사용하고, 필요에 따라 fimath 속성을 설정해야 하며, 이를 위해서는 Fixed-Point Designer™ 라이선스가 필요합니다. 반올림 및 오버플로 모드 역시 생성된 코드의 크기와 효율성에 영향을 미칩니다.

참고 항목

도움말 항목