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