Оптимизация созданного кода путем удаления кода, защищающего от деления на ноль и переполнения в разделении 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);
}
Откройте диалоговое окно «Параметры конфигурации».
На панели Оптимизация выберите Удалить код, защищающий от арифметических исключений деления.
Кроме того, для оптимизации можно использовать 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™. Режимы округления и переполнения также влияют на размер и эффективность генерируемого кода.
Удаление кода, защищающего от арифметических исключений деления