exponenta event banner

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

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

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

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

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

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

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

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

  4. Откройте приложение Simulink Coder. Если у вас есть лицензия Embedded Coder, откройте приложение Embedded Coder.

  5. Выберите Интерфейс кода > Сопоставления кодов отдельных элементов.

  6. На вкладке Сопоставления кода - C > Inports установите класс хранения в значение ImportedExtern.

  7. В разделе «Код» инспектора свойств присвойте идентификатору имя, например Inport.

  8. На вкладке Сопоставления кодов-C > Выходы установите класс хранения в значение ImportedExtern.

  9. В разделе «Код» инспектора свойств присвойте идентификатору имя, например Outport.

Создание кода без оптимизации

  1. Откройте диалоговое окно «Параметры конфигурации». На панели «Решатель» для параметра «Тип» выберите Fixed-step.

  2. На панели Создание кода > Отчет выберите Создать отчет о создании кода и Открыть отчет автоматически.

  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) выберите Удалить код из преобразования с плавающей запятой в целое, которое переносит значения вне диапазона. Создать код.

  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.

См. также

Связанные темы