Этот пример показывает, как удалить код, который сопоставляет NaN
с целочисленным нулем. Для с плавающей точкой к целочисленным преобразованиям включающее насыщение Simulink преобразовывает NaN
в целочисленный нуль во время симуляции. Если ваша модель содержит входное значение NaN
, можно указать, что генератор кода производит код, который сопоставляет NaN
, чтобы обнулить. Без этого кода существует несоответствие между симуляцией и результатами генерации кода, потому что в Стандарте C, каждое условие, включающее NaN
, оценивает ко лжи.
Если входные значения самки NaN
не существуют в вашем приложении, можно удалить код, который сопоставляет NaN
с целочисленным нулем. Удаление этого кода уменьшает размер и увеличивает скорость сгенерированного кода.
В этой модели блок Data Type Conversion преобразовывает входной сигнал от double
до uint8
. В этом примере модель называют conversion_ex
.
Используйте Inport, Выходной порт и блоки Преобразования типа данных, чтобы создать модель в качестве примера.
Откройте диалоговое окно 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' */