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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/* Model step function */
void conversion_ex_step(void)
{
  real_T tmp;
 
  /* DataTypeConversion: 
       '<Root>/Data Type Conversion' incorporates:
          Inport: '<>/In1'
   */
  tmp = floor(U);
  if (rtIsNaN(tmp) || rtIsInf(tmp)) {
    tmp = 0.0;
  } else {
    tmp = fmod(tmp, 256.0);
  }
 
  Y = (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 и просмотрите образцовую ступенчатую функцию. Сгенерированный код не содержит код, который защищает от значений из области значений.

    /* Model step function */
    void conversion_ex_step(void)
    {
      /* DataTypeConversion: '<Root>/Data Type Conversion' incorporates:
       *  Inport: '<Root>/In1'
       */
      Y = (uint8_T)U;
    

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

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

Похожие темы