В этом примере показано, как удалить код для из области значений, с плавающей точкой к целочисленным преобразованиям. Без этого кода может быть несоответствие между результатами генерации кода и симуляцией. Стандарт C не задает поведение из области значений, с плавающей точкой к целочисленным преобразованиям, в то время как эти преобразования четко определены в процессе моделирования. В Стандарте C и в процессе моделирования, с плавающей точкой к целочисленным преобразованиям четко определены для входных значений в области значений выходного типа.
Если входные значения в вашем приложении находятся в области значений выходного типа, удаляют код для из области значений, с плавающей точкой к целочисленным преобразованиям. Удаление этого кода уменьшает размер и увеличивает скорость сгенерированного кода.
В этой модели блок Data Type Conversion преобразует входной сигнал от double
к uint8
. uint8
может поддержать значения от 0 до 255. Если входной сигнал имеет значение за пределами этой области значений, преобразование из области значений происходит. В этом примере модель называют conversion_ex
.
Используйте Inport, Outport и блоки Data Type Conversion, чтобы создать модель в качестве примера.
Откройте диалоговое окно Inport Block Parameters и выберите вкладку Signal Attributes. Для параметра Data Type выберите double
.
Откройте диалоговое окно Data Type Conversion. Для параметра Output data type выберите uint8
.
Откройте приложение Simulink Coder. Если вы имеете лицензию Embedded Coder, открываете приложение Embedded Coder.
Выберите Code Interface> Individual Element Code Mappings.
На вкладке Code Mappings-C> Inports, набор класс памяти к ImportedExtern
.
В разделе Code Property Inspector присвойте имя к Identifier, такому как Inport
.
На вкладке Code Mappings-C> Outputs, набор класс памяти к ImportedExtern
.
В разделе Code Property Inspector присвойте имя к Identifier, такому как Outport
.
Откройте диалоговое окно Configuration Parameters. На панели Solver, для параметра Type, выбирают Fixed-step
.
На панели Code Generation > Report выберите Create code generation report и Open report automatically.
На панели Code Generation выберите Generate code only, и затем, в окне модели, нажмите Ctrl+B. Когда генерация кода завершена, отчет генерации кода HTML открывается.
В отчете Генерации кода выберите conversion_ex.c
файл и представление ступенчатая функция модели. Генератор кода применяет fmod
функционируйте, чтобы обработать из результатов области значений.
void conversion_ex_step(void) { real_T tmp; /* DataTypeConversion: '<Root>/Data Type Conversion' incorporates: * Inport: '<Root>/Input' */ tmp = floor(Inport); if (rtIsNaN(tmp) || rtIsInf(tmp)) { tmp = 0.0; } else { tmp = fmod(tmp, 256.0); } /* Outport: '<Root>/Out1' incorporates: * DataTypeConversion: '<Root>/Data Type Conversion' */ Outport = (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
файл и представление ступенчатая функция модели. Сгенерированный код не содержит код, который защищает от значений из области значений.
void conversion_ex_step(void) { /* Outport: '<Root>/Out1' incorporates: * DataTypeConversion: '<Root>/Data Type Conversion' * Inport: '<Root>/Input' */ Outport = (uint8_T)Inport; }
Сгенерированный код более эффективен без этого защитного кода, но возможно, что выполнение сгенерированного кода не приводит к тем же результатам как симуляция для значений не в области значений от 0 до 255.