В этом примере показано, как удалить код для преобразований с плавающей точкой вне области допустимого значения в целое число. Без этого кода может возникнуть несоответствие между результатами симуляции и генерации кода. Стандарт C не задает поведение преобразований с плавающей точкой вне области допустимого значения в целое число, в то время как эти преобразования хорошо определены во время симуляции. В Стандарте C и во время симуляции преобразования с плавающей точкой в целое число хорошо определены для входных значений в области значений выходного типа.
Если входные значения в вашем приложении находятся в области значений выходного типа, удалите код для обратного преобразования с плавающей точкой в целое число. Удаление этого кода уменьшает размер и увеличивает скорость сгенерированного кода.
В этой модели блок Data Type Conversion преобразует входной сигнал из double
в uint8
. A uint8
может поддерживать значения от 0 до 255. Если входной сигнал имеет значение вне этой области значений, происходит преобразование вне области допустимого. В этом примере модель называется conversion_ex
.
Используйте Inport, Outport и Data Type Conversion блоки для создания модели в качестве примера.
Откройте диалоговое окно Inport Block Parameters и выберите вкладку Signal Attributes. Для параметра Data Type выберите double
.
Откройте диалоговое окно «Преобразование типа данных». Для параметра 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
.
Откройте диалоговое окно Параметры конфигурации. На панели 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); }
Откройте диалоговое окно Параметры конфигурации. На панели 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.