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

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

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

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

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

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

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

  3. Откройте диалоговое окно «Преобразование типа данных». Для параметра 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. Откройте диалоговое окно Параметры конфигурации. На панели 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. Откройте диалоговое окно Параметры конфигурации. На панели 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.

См. также

Похожие темы