В этом примере показано, как удалить код, который сопоставляет NaN
к целочисленному нулю. Для с плавающей точкой к целочисленным преобразованиям включающее насыщение Simulink преобразует NaN
к целочисленному нулю в процессе моделирования. Если ваша модель содержит входное значение NaN
, можно указать, что генератор кода производит код, который сопоставляет NaN
обнулять. Без этого кода существует несоответствие между симуляцией и результатами генерации кода потому что в Стандарте C, каждое условие, включающее NaN
оценивает ко лжи.
Если входные значения NaN
самка не существует в вашем приложении, можно удалить код, который сопоставляет NaN
к целочисленному нулю. Удаление этого кода уменьшает размер и увеличивает скорость сгенерированного кода.
В этой модели блок Data Type Conversion преобразует входной сигнал от double
к uint8
. В этом примере модель называют conversion_ex
.
Используйте Inport, Outport и блоки Data Type Conversion, чтобы создать модель в качестве примера.
Откройте диалоговое окно Inport Block Parameters и кликните по вкладке Signal Attributes. Для параметра Data Type выберите double
.
Откройте диалоговое окно Data Type Conversion. Для параметра Output data type выберите uint8
.
Выберите Saturate on integer overflow. Выбор этого параметра указывает, что значение сигналов из области значений равняется или минимальному или максимальному значению, которое может представлять тип данных.
Для сигнала, питающегося в блок Data Type Conversion, откройте диалоговое окно Signal Properties. Введите имя U
. На вкладке Code Generation, для параметра Storage Class, выбирают ImportedExtern
.
Для сигнала, оставляя блок Data Type Conversion, откройте диалоговое окно Signal Properties. Введите имя Y
. На вкладке Code Generation, для параметра Storage Class, выбирают 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.
Включите 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' */