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

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

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

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

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

  1. Используйте Inport, Outport и блоки Data Type Conversion, чтобы создать модель в качестве примера.

  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 и параметр Open report automatically.

  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' */

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

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте