Удалите код, который сопоставляет NaN с целочисленным нулем

Этот пример показывает, как удалить код, который сопоставляет NaN с целочисленным нулем. Для с плавающей точкой к целочисленным преобразованиям включающее насыщение Simulink преобразовывает NaN в целочисленный нуль во время симуляции. Если ваша модель содержит входное значение NaN, можно указать, что генератор кода производит код, который сопоставляет NaN, чтобы обнулить. Без этого кода существует несоответствие между симуляцией и результатами генерации кода, потому что в Стандарте C, каждое условие, включающее NaN, оценивает ко лжи.

Если входные значения самки NaN не существуют в вашем приложении, можно удалить код, который сопоставляет NaN с целочисленным нулем. Удаление этого кода уменьшает размер и увеличивает скорость сгенерированного кода.

Модель в качестве примера

В этой модели блок Data Type Conversion преобразовывает входной сигнал от double до uint8. В этом примере модель называют conversion_ex.

  1. Используйте Inport, Выходной порт и блоки Преобразования типа данных, чтобы создать модель в качестве примера.

  2. Откройте диалоговое окно Inport Block Parameters и кликните по вкладке Signal Attributes. Для параметра Data Type выберите double.

  3. Откройте диалоговое окно Data Type Conversion. Для параметра Output data type выберите uint8.

  4. Выберите Saturate on integer overflow. Выбор этого параметра указывает, что значение сигналов из области значений равняется или минимальному или максимальному значению, которое может представлять тип данных.

  5. Для сигнала, питающегося в блок Data Type Conversion, откройте диалоговое окно Signal Properties. Введите имя U. На вкладке Code Generation, для параметра Storage Class, выбирают ImportedExtern.

  6. Для сигнала, оставляя блок Data Type Conversion, откройте диалоговое окно Signal Properties. Введите имя Y. На вкладке Code Generation, для параметра Storage Class, выбирают ImportedExtern.

Сгенерируйте код

  1. Установите Configuration Parameters> Solver> Solver options> параметр Type к Fixed-step.

  2. Отключите Configuration Parameters> Optimization> Advanced parameters> параметр Remove code from floating-point to integer conversions with saturation that maps NaN to zero.

  3. Включите Configuration Parameters> Code Generation> Report> параметр Create code generation report.

  4. Включите Configuration Parameters> Code Generation> Build process> параметр Generate code only. Затем в окне модели нажмите Ctrl+B. Когда генерация кода завершена, отчет генерации кода HTML открывается.

  5. В отчете Генерации кода выберите файл 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;
  }

Сгенерируйте код с оптимизацией

  1. Включите Configuration Parameters> Optimization> Code generation> Integer and fixed-point> параметр Remove code from floating-point to integer conversions that wraps out-of-range values. Сгенерируйте код.

  2. В отчете Генерации кода выберите раздел 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' */

Смотрите также

Похожие темы