В этом примере показано, как удалить код, который сопоставлен NaN
в целое число нуль. Для преобразований с плавающей точкой в целое число, включающих насыщение, Simulink преобразует NaN
к целому нулю во время симуляции. Если ваша модель содержит вход значение NaN
можно указать, что генератор кода производит код, который отображается NaN
в нуль. Без этого кода существует несоответствие между результатами симуляции и генерации кода, потому что в Стандарте C каждое условие, связанное с NaN
вычисляет значение false.
Если входные значения NaN
doe не существует в вашем приложении, можно удалить код, который сопоставляется NaN
в целое число нуль. Удаление этого кода уменьшает размер и увеличивает скорость сгенерированного кода.
В этой модели блок Data Type Conversion преобразует входной сигнал из double
в uint8
. В этом примере модель называется conversion_ex
.
Используйте Inport, Outport и Data Type Conversion блоки для создания модели в качестве примера.
Откройте диалоговое окно Inport Block Parameters и щелкните вкладку Signal Attributes. Для параметра Data Type выберите double
.
Откройте диалоговое окно «Преобразование типа данных». Для параметра Output data type выберите uint8
.
Выберите Saturate on integer overflow. Выбор этого параметра указывает, что значение сигналов вне области допустимого равняется либо минимальному, либо максимальному значению, которое может представлять тип данных.
Для подачи сигнала в блок Data Type Conversion откройте диалоговое окно Signal Properties. Введите имя U
. В редакторе Code Mappings в разделе Signals установите класс памяти на ImportedExtern
.
Для сигнала, покидающего блок Data Type Conversion, откройте диалоговое окно Свойства. Введите имя Y
. В редакторе Code Mappings в разделе Signals установите класс памяти равным ImportedExtern
.
Установите Configuration Parameters> Solver> Solver options> Type параметр к Fixed-step
.
Отключите параметр Configuration Parameters Optimization > Advanced parameters > Remove code from floating-point to integer conversions with saturation that maps NaN to zero >.
Позвольте Configuration Parameters> Code Generation> Report> Create code generation report параметр и Open report automatically параметр.
Включите параметр Configuration Parameters Code Generation > Build process > Generate code only. Затем в окне модели нажмите Ctrl+B. Когда генерация кода завершена, открывается отчет генерации кода HTML.
В отчете Генерация кода выберите nan_int_ex.c
файл и просмотреть функцию шага модели. Для входного значения NaN
, существует согласие между сгенерированным кодом и симуляцией, потому что NaN
преобразуется в целое число с нулем.
/* Model step function */ void nan_int_ex_step(void) { /* DataTypeConversion: '<Root>/Data Type Conversion' incorporates: * Inport: '<Root>/In1' */ if (U < 256.0) { if (U >= 0.0) { Y = (uint8_T)U; } else { Y = 0U; } } else if (U >= 256.0) { Y = MAX_uint8_T; } else { Y = 0U; }
Включите параметр Configuration Parameters Optimization > Code generation > Integer and fixed-point > Remove code from floating-point to integer conversions that wraps out-of-range values. Сгенерируйте код.
В отчете Генерация кода выберите nan_int_ex.c
сечение и просмотр функции шага модели. Сгенерированный код сопоставлен NaN
255, а не целый нуль. Сгенерированный код более эффективен без дополнительного кода, который отображает NaN
в целый нуль, но выполнение сгенерированного кода не дает тех же результатов, что и симуляция для NaN
значения.
/* Model step function */ void nan_int_ex_step(void) { /* DataTypeConversion: '<Root>/Data Type Conversion' incorporates: * Inport: '<Root>/In1' */ if (U < 256.0) { if (U >= 0.0) { Y = (uint8_T)U; } else { Y = 0U; } } else { Y = MAX_uint8_T; } /* End of DataTypeConversion: '<Root>/Data Type Conversion' */
Удалите код из числа с плавающей точкой в целое число с насыщением, которое преобразует NaN в нуль