Удалите код для плавающей точки из области значений к целочисленным преобразованиям

В этом примере показано, как сгенерировать оптимизированный код путем удаления кода для плавающей точки из области значений к целочисленным преобразованиям. Стандарт 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;

Смотрите также

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте