이 페이지는 기계 번역을 사용하여 번역되었습니다. 영어 원문을 보려면 여기를 클릭하십시오.
정수 및 고정소수점 데이터에 대한 나눗셈 예외를 방지하는 코드 제거
정수 및 고정 소수점 데이터에 대한 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 */
최적화 활성화
구성 파라미터 대화 상자를 엽니다.
최적화 창에서 정수 나눗셈 산술 예외를 방지하는 코드 제거를 선택합니다.
또는 명령줄 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™ 라이선스가 필요합니다. 반올림 및 오버플로 모드 역시 생성된 코드의 크기와 효율성에 영향을 미칩니다.
참고 항목
Remove code that protects against integer division arithmetic exceptions