Этот пример показывает, как удалить код для из области значений, с плавающей точкой к целочисленным преобразованиям. Без этого кода может быть несоответствие между результатами генерации кода и симуляцией. Стандарт C не задает поведение из области значений, с плавающей точкой к целочисленным преобразованиям, в то время как эти преобразования четко определены во время симуляции. В Стандарте C и во время симуляции, с плавающей точкой к целочисленным преобразованиям, четко определены для входных значений в области значений выходного типа.
Если входные значения в вашем приложении находятся в области значений выходного типа, удаляют код для из области значений, с плавающей точкой к целочисленным преобразованиям. Удаление этого кода уменьшает размер и увеличивает скорость сгенерированного кода.
В этой модели блок Data Type Conversion преобразовывает входной сигнал от double
до uint8
. uint8
может поддержать значения от 0 до 255. Если входной сигнал имеет значение за пределами этой области значений, преобразование из области значений происходит. В этом примере модель называют conversion_ex
.
Используйте Inport, Выходной порт и блоки Преобразования типа данных, чтобы создать модель в качестве примера.
Откройте диалоговое окно Inport Block Parameters и выберите вкладку Signal Attributes. Для параметра Data Type выберите double
.
Откройте диалоговое окно Data Type Conversion. Для параметра Output data type выберите uint8
.
Для сигнала, питающегося в блок Data Type Conversion, откройте диалоговое окно Signal Properties. Введите имя U
. На вкладке Code Generation, для параметра Storage Class, выбирают ImportedExtern
.
Для сигнала, оставляя блок Data Type Conversion, откройте диалоговое окно Signal Properties. Введите имя Y
. На вкладке Code Generation, для параметра Storage Class, выбирают ImportedExtern
.
Откройте диалоговое окно Model Configuration Parameters. На панели Solver, для параметра Type, выбирают Fixed-step
.
На панели Code Generation > Report выберите Create code generation report.
На панели Code Generation выберите Generate code only, и затем, в окне модели, нажмите Ctrl+B. Когда генерация кода завершена, отчет генерации кода HTML открывается.
В отчете Генерации кода выберите файл conversion_ex.c
и просмотрите образцовую ступенчатую функцию. Генератор кода применяет функцию fmod
, чтобы обработать из результатов области значений.
/* Model step function */ void conversion_ex_step(void) { real_T tmp; /* DataTypeConversion: '<Root>/Data Type Conversion' incorporates: Inport: '<>/In1' */ tmp = floor(U); if (rtIsNaN(tmp) || rtIsInf(tmp)) { tmp = 0.0; } else { tmp = fmod(tmp, 256.0); } Y = (uint8_T) (tmp < 0.0 ? (int32_T) (uint8_T)-(int8_T) (uint8_T)-tmp : (int32_T) (uint8_T) tmp);
Откройте диалоговое окно Configuration Parameters. На панели Optimization выберите Remove code from floating-point to integer conversions that wraps out-of-range values. Сгенерируйте код.
В отчете генерации кода выберите файл conversion_ex.c
и просмотрите образцовую ступенчатую функцию. Сгенерированный код не содержит код, который защищает от значений из области значений.
/* Model step function */ void conversion_ex_step(void) { /* DataTypeConversion: '<Root>/Data Type Conversion' incorporates: * Inport: '<Root>/In1' */ Y = (uint8_T)U;
Сгенерированный код более эффективен без этого защитного кода, но возможно, что выполнение сгенерированного кода не приводит к тем же результатам как симуляция для значений не в области значений от 0 до 255.