Оптимизируйте сгенерированный код путем удаления кода, который защищает от деления на нуль и переполнения в делении INT_MIN/-1
операции для целых чисел и данных фиксированной точки. Если вы уверены, что эти арифметические исключения не происходят во время выполнения программы, включают эту оптимизацию, но это может привести к частному, которое не может быть представлено.
Эта оптимизация:
Скорость выполнения увеличений.
Результаты в меньшем коде, таким образом, уменьшающем потребление ROM.
Риски
Когда вы выбираете 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); }
Откройте диалоговое окно Configuration Parameters.
На панели Оптимизации выберите код Remove, который защищает от арифметических исключений деления.
В качестве альтернативы можно использовать 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™. Округление и режимы переполнения также влияет на размер и КПД сгенерированного кода.
Удалите код, который защищает от арифметических исключений деления