В этом примере показано, как сгенерировать оптимизированный код путем удаления кода для плавающей точки из области значений к целочисленным преобразованиям. Стандарт C не задает поведение плавающей точки из области значений к целочисленным преобразованиям, в то время как эти преобразования четко определены в процессе моделирования. Когда вы выбираете параметр конфигурации, Удаляют код от с плавающей точкой до целочисленных преобразований, который переносит значения из области значений, генератор кода удаляет переносящийся код, который обрабатывает плавающую точку из области значений к целочисленному преобразованию и повышает эффективность кода. Без этого кода может быть несоответствие между симуляцией и результатами генерации кода для из значений области значений.
Если входные значения в вашем приложении находятся в области значений выходного типа, удаляют код для из области значений, с плавающей точкой к целочисленным преобразованиям. Удаление этого кода уменьшает размер и увеличивает скорость сгенерированного кода.
Откройте модель rtwdemo_float_mul_for_net_slope_correction
в качестве примера.
model = 'rtwdemo_float_mul_for_net_slope_correction';
open_system(model);
Модель содержит блок Data Type Conversion. Сконфигурировать модель, чтобы преобразовать входной сигнал от single
к uint8
, откройте диалоговое окно Data Type Conversion. Для параметра типа Выходных данных выберите uint8
. В качестве альтернативы используйте этот API командной строки, чтобы установить тип Выходных данных:
set_param('rtwdemo_float_mul_for_net_slope_correction/Data Type Conversion', 'OutDataTypeStr','uint8');
uint8 может поддержать значения от 0 до 255. Если входной сигнал имеет значение за пределами этой области значений, преобразование из области значений происходит.
1. Создайте временную папку для сборки и инспекционного процесса.
currentDir = pwd; [~,cgDir] = rtwdemodir();
2. Откройте диалоговое окно Configuration Parameters. На панели Оптимизации очистите Удалить код от с плавающей точкой до целочисленных преобразований, который переносит флажок параметра значений из области значений. В качестве альтернативы используйте API командной строки, чтобы отключить оптимизацию:
set_param(model, 'EfficientFloat2IntCast','off');
3. Создайте модель при помощи slbuild
функционируйте или путем нажатия Ctrl+B.
slbuild(model)
### Starting build procedure for: rtwdemo_float_mul_for_net_slope_correction ### Successful completion of build procedure for: rtwdemo_float_mul_for_net_slope_correction Build Summary Top model targets built: Model Action Rebuild Reason =========================================================================================================================== rtwdemo_float_mul_for_net_slope_correction Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 10.497s
4. Смотрите сгенерированный rtwdemo_float_mul_for_net_slope_correction_step
ступенчатая функция в rtwdemo_float_mul_for_net_slope_correction.c
.
file = fullfile('rtwdemo_float_mul_for_net_slope_correction_ert_rtw','rtwdemo_float_mul_for_net_slope_correction.c'); rtwdemodbtype(file,'/* Model step function */','/* Model initialize function',1,1);
/* Model step function */ void rtwdemo_float_mul_for_net_slope_correction_step(void) { real32_T tmp; /* DataTypeConversion: '<Root>/Data Type Conversion' incorporates: * Inport: '<Root>/Input' */ tmp = (real32_T)fmod((real_T)(real32_T)floor((real_T)rtU.Input), 256.0); /* Outport: '<Root>/Output' incorporates: * DataTypeConversion: '<Root>/Data Type Conversion' */ rtY.Output = (uint8_T)(tmp < 0.0F ? (int32_T)(uint8_T)(int32_T)-(int32_T) (int8_T)(uint8_T)-tmp : (int32_T)(uint8_T)tmp); }
Генератор кода применяет fmod
функционируйте, чтобы обработать из результатов области значений. В этом случае сгенерированный код больше, но результаты сгенерированного кода совпадают с результатами симуляции.
1. Откройте диалоговое окно Configuration Parameters. На панели Оптимизации выберите код Remove от с плавающей точкой до целочисленных преобразований, который переносит параметр значений из области значений. В качестве альтернативы используйте API командной строки, чтобы включить оптимизацию:
set_param(model, 'EfficientFloat2IntCast','on')
2. Создайте модель. Смотрите сгенерированный rtwdemo_float_mul_for_net_slope_correction_step
ступенчатая функция с оптимизацией в rtwdemo_float_mul_for_net_slope_correction.c
slbuild(model); file = fullfile('rtwdemo_float_mul_for_net_slope_correction_ert_rtw','rtwdemo_float_mul_for_net_slope_correction.c'); rtwdemodbtype(file,'/* Model step function */','/* Model initialize function',1,1);
### Starting build procedure for: rtwdemo_float_mul_for_net_slope_correction ### Successful completion of build procedure for: rtwdemo_float_mul_for_net_slope_correction Build Summary Top model targets built: Model Action Rebuild Reason ========================================================================================================== rtwdemo_float_mul_for_net_slope_correction Code generated and compiled Generated code was out of date. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 8.5251s /* Model step function */ void rtwdemo_float_mul_for_net_slope_correction_step(void) { /* Outport: '<Root>/Output' incorporates: * DataTypeConversion: '<Root>/Data Type Conversion' * Inport: '<Root>/Input' */ rtY.Output = (uint8_T)rtU.Input; }
Сгенерированный код более эффективен без защитного кода, но возможно, что выполнение сгенерированного кода не приводит к тем же результатам как симуляция для значений не в области значений от 0 до 255.
Закройте модель и удалите временные папки и файлы.
bdclose(model); cd(currentDir); rtwdemoclean;