Удалите код от с плавающей точкой до целочисленных преобразований, который переносит значения из области значений

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

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

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

В этой модели блок Data Type Conversion преобразует входной сигнал от double к uint8. uint8 может поддержать значения от 0 до 255. Если входной сигнал имеет значение за пределами этой области значений, преобразование из области значений происходит. В этом примере модель называют 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. Откройте приложение Simulink Coder. Если вы имеете лицензию Embedded Coder, открываете приложение Embedded Coder.

  5. Выберите Code Interface> Individual Element Code Mappings.

  6. На вкладке Code Mappings-C> Inports, набор класс памяти к ImportedExtern.

  7. В разделе Code Property Inspector присвойте имя к Identifier, такому как Inport.

  8. На вкладке Code Mappings-C> Outputs, набор класс памяти к ImportedExtern.

  9. В разделе Code Property Inspector присвойте имя к Identifier, такому как Outport.

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

  1. Откройте диалоговое окно Configuration Parameters. На панели Solver, для параметра Type, выбирают Fixed-step.

  2. На панели Code Generation > Report выберите Create code generation report и Open report automatically.

  3. На панели Code Generation выберите Generate code only, и затем, в окне модели, нажмите Ctrl+B. Когда генерация кода завершена, отчет генерации кода HTML открывается.

  4. В отчете Генерации кода выберите conversion_ex.c файл и представление ступенчатая функция модели. Генератор кода применяет fmod функционируйте, чтобы обработать из результатов области значений.

void conversion_ex_step(void)
{
  real_T tmp;

  /* DataTypeConversion: '<Root>/Data Type Conversion' incorporates:
   *  Inport: '<Root>/Input'
   */
  tmp = floor(Inport);
  if (rtIsNaN(tmp) || rtIsInf(tmp)) {
    tmp = 0.0;
  } else {
    tmp = fmod(tmp, 256.0);
  }

  /* Outport: '<Root>/Out1' incorporates:
   *  DataTypeConversion: '<Root>/Data Type Conversion'
   */
  Outport = (uint8_T)(tmp < 0.0 ? (int32_T)(uint8_T)-(int8_T)(uint8_T)-tmp :
                      (int32_T)(uint8_T)tmp);
}

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

  1. Откройте диалоговое окно Configuration Parameters. На панели Optimization выберите Remove code from floating-point to integer conversions that wraps out-of-range values. Сгенерируйте код.

  2. В отчете генерации кода выберите conversion_ex.c файл и представление ступенчатая функция модели. Сгенерированный код не содержит код, который защищает от значений из области значений.

    void conversion_ex_step(void)
    {
      /* Outport: '<Root>/Out1' incorporates:
       *  DataTypeConversion: '<Root>/Data Type Conversion'
       *  Inport: '<Root>/Input'
       */
      Outport = (uint8_T)Inport;
    }

Сгенерированный код более эффективен без этого защитного кода, но возможно, что выполнение сгенерированного кода не приводит к тем же результатам как симуляция для значений не в области значений от 0 до 255.

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

Похожие темы