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