Оптимизируйте сгенерированный код путем удаления кода, который защищает выражения параметра от целочисленного переполнения для данных фиксированной точки и целых чисел. Если вы уверены, что не настроите условия выражений настраиваемого параметра, чтобы заставить их оценивать к значению, которое является ниже или выше представимого значения типа данных, включите эту optimization.This скорость выполнения увеличений оптимизации и результаты в меньшем коде, который уменьшает потребление ROM.
Риски
Когда вы выбираете EfficientTunableParamExpr
параметр, и вы настраиваете условия выражения так, чтобы это столкнулось с целочисленным переполнением, результат повторится в сгенерированном коде. Это поведение может заставить приложение неожиданно вести себя во времени выполнения.
ПРИМЕЧАНИЕ: Если вы включаете эту оптимизацию, возможно, что результаты симуляции и следуют из сгенерированного кода, не находятся в поразрядном соглашении. Этот пример требует Embedded Coder®.
В модели matlab:mEfficientParamExpr, входной сигнал типа int8
подача в блок Gain.
model = 'mEfficientParamExpr';
open_system(model);
В вашей системе временная папка создайте другую временную папку для сборки и инспекционного процесса.
currentDir = pwd; [~,cgDir] = rtwdemodir();
Создайте модель.
set_param(model, 'EfficientTunableParamExpr', 'off'); evalc('rtwbuild(model)');
Просмотрите сгенерированный код без оптимизации. Вот фрагмент mEfficientParamExpr.c
.
cfile = fullfile(cgDir,'mEfficientParamExpr_ert_rtw','mEfficientParamExpr.c'); rtwdemodbtype(cfile,'/* Model step function ','/* Model initialize function',1, 1);
/* Model step function */ void mEfficientParamExpr_step(void) { int32_T tmp; /* Gain: '<Root>/Gain' */ tmp = P + Q; if (tmp > 127) { tmp = 127; } else { if (tmp < -128) { tmp = -128; } } /* Outport: '<Root>/Out1' incorporates: * Gain: '<Root>/Gain' * Inport: '<Root>/In1' */ rtY.Out1 = (int8_T)(tmp * rtU.In1); }
Откройте диалоговое окно Configuration Parameters.
На панели Оптимизации выберите код Remove из выражений настраиваемого параметра, который насыщает значения из области значений.
В качестве альтернативы используйте API командной строки, чтобы включить оптимизацию:
set_param(model, 'EfficientTunableParamExpr', 'on');
Оптимизированный код не содержит код, который проверяет границы представимого значения типа данных.
Создайте модель.
evalc('rtwbuild(model)');
Следующее является фрагментом mEfficientParamExpr.c
. Код, который защищает от переполнения выражения, не находится в сгенерированном коде.
rtwdemodbtype(cfile,'/* Model step function ','/* Model initialize function',1, 1);
/* Model step function */ void mEfficientParamExpr_step(void) { /* Outport: '<Root>/Out1' incorporates: * Gain: '<Root>/Gain' * Inport: '<Root>/In1' */ rtY.Out1 = (int8_T)((int8_T)(P + Q) * rtU.In1); }
Закройте отчет генерации кода и модель.
bdclose(model) rtwdemoclean; cd(currentDir)