Удалите код, который преобразует NaN в целый нуль

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

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

Пример модели

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

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

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

  3. Откройте диалоговое окно «Преобразование типа данных». Для параметра Output data type выберите uint8.

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

  5. Для подачи сигнала в блок Data Type Conversion откройте диалоговое окно Signal Properties. Введите имя U. В редакторе Code Mappings в разделе Signals установите класс памяти на ImportedExtern.

  6. Для сигнала, покидающего блок Data Type Conversion, откройте диалоговое окно Свойства. Введите имя Y. В редакторе Code Mappings в разделе Signals установите класс памяти равным 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' */

См. также

Похожие темы