exponenta event banner

Управление генерацией служебных функций с фиксированной точкой

Оптимизация сгенерированного кода с использованием указанных минимальных и максимальных значений

Программное обеспечение Fixed-Point Designer™ использует представляемые минимальные и максимальные значения и постоянные значения для определения возможности оптимизации генерируемого кода, например, путем исключения ненужных функций утилиты и кода насыщения из генерируемого кода.

Эта оптимизация приводит к:

  • Снижение потребления ПЗУ и ОЗУ

  • Повышенная скорость выполнения

При выборе параметра конфигурации Optimize using specified minimum and maximum value (Оптимизация с использованием заданного минимального и максимального значений) программа учитывает информацию о входном диапазоне, также известную как design minimum и maximum, которая задается для сигналов и параметров в модели. Он использует эти минимальные и максимальные значения для получения информации о диапазоне для сигналов нисходящего направления в модели, а затем использует эту полученную информацию о диапазоне для упрощения математических операций в сгенерированном коде, когда это возможно.

Предпосылки

Параметр Optimize using specified minimum and maximum values появляется только для целевых объектов на основе ERT и требует лицензии Embedded Coder ® при создании кода.

Настройка модели

Чтобы сделать оптимизацию более вероятной:

  • Предоставьте как можно больше проектной минимальной и максимальной информации. Укажите минимальное и максимальное значения для сигналов и параметров в модели для:

    • Блоки ввода и вывода

    • Блочные выходы

    • Входы блоков, например, для блоков MATLAB Function и Stateflow Chart

    • Simulink.Signal объекты

  • Перед формированием кода проверьте минимальное и максимальное значения сигналов и параметров. В противном случае оптимизация может привести к численному несоответствию с моделированием. Можно моделировать модель с включенной проверкой диапазона моделирования. При возникновении ошибок или предупреждений устраните эти неполадки перед созданием кода.

     Включение проверки диапазона моделирования

  • Используйте типы данных с фиксированной точкой с двоичным масштабированием «только точка» (мощность двух).

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

Как включить оптимизацию

  1. В диалоговом окне «Параметры конфигурации» установите параметр «Создание кода» > «Системный целевой файл» для выбора встроенного файла в режиме реального времени (ERT) target (требуется лицензия Embedded Coder).

  2. Укажите минимальное и максимальное значения для сигналов и параметров в модели, используя советы в разделе Настройка модели.

  3. Выберите «Оптимизация» > «Дополнительные параметры» > «Оптимизация», используя указанный параметр конфигурации минимального и максимального значений.

Ограничения

  • Эта оптимизация не выполняется для:

    • Многословные операции

    • Типы данных с фиксированной точкой с масштабированием уклона и смещения

    • Сложение, если только длина дроби не равна нулю

  • Эта оптимизация не учитывает минимальные и максимальные значения для:

    • Объединение входных данных блоков. Чтобы обойти эту проблему, используйте Simulink.Signal на выходе блока «Слияние» и укажите диапазон для этого объекта.

    • Элементы шины.

    • Условно выполняемая подсистема (например, запускаемая подсистема) выводит блоки, которые непосредственно соединены с блоком Outport.

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

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

  • Если модель содержит несколько экземпляров многоразовой подсистемы и каждый экземпляр использует входные сигналы с различными заданными минимальными и максимальными значениями, эта оптимизация может привести к различному сгенерированному коду для каждой подсистемы, поэтому повторное использование кода не происходит. Без этой оптимизации программное обеспечение Simulink Coder™ генерирует код для подсистемы один раз и совместно использует этот код для нескольких экземпляров подсистемы.

Устранение ненужных служебных функций с использованием указанных минимальных и максимальных значений

В этом примере показано, как программа Fixed-Point Designer использует диапазон ввода для операции разделения, чтобы определить, может ли она исключить ненужные функции утилиты из сгенерированного кода. Он использует fxpdemo_min_max_optimization модель. Во-первых, код создается без использования указанных минимального и максимального значений, чтобы убедиться в том, что созданный код содержит служебные функции, гарантирующие отсутствие деления на ноль. Затем включите оптимизацию и снова создайте код. При оптимизации сгенерированный код не содержит служебную функцию, поскольку она не является необходимой для диапазона ввода.

Создание кода без использования минимальных и максимальных значений

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

  1. Выполните пример fxpdemo_min_max_optimization.

  2. В окне примера дважды нажмите кнопку View Optimization Configuration.

    Появится панель Оптимизация (Optimization) диалогового окна Параметры конфигурации (Configuration Parameters).

    Обратите внимание, что параметр Оптимизировать с использованием указанных минимальных и максимальных значений не выбран.

  3. Дважды нажмите кнопку «Создать код».

    Появится отчет о создании кода.

  4. В модели щелкните правой кнопкой мыши значок Division with increased fraction length output type блок.

    Появится контекстное меню.

  5. В контекстном меню выберите C/C + + Code > Перейти к C/C + + Code.

    Отчет о создании кода выделяет код, созданный для этого блока. Сгенерированный код включает в себя вызов div_repeat_u32 служебная функция.

    rtY.Out3 = div_repeat_u32((uint32_T)rtU.In5 << 16, 
      (uint32_T)rtU.In6, 1U);

  6. Щелкните значок div_repeat_u32 ссылка для просмотра функции утилиты, которая содержит код для обработки деления на ноль.

Создание кода с использованием минимальных и максимальных значений

Затем создайте код для той же операции разделения, на этот раз с учетом расчетных минимальных и максимальных значений для первого ввода блока «Изделие». Эти минимальные и максимальные значения указаны в блоке Inport непосредственно перед блоком Product. В этих диапазонах ввода сгенерированный код реализует разделение простым использованием сдвига. Ему не нужно создавать служебную функцию разделения, сокращая как использование памяти, так и время выполнения.

  1. Дважды щелкните блок «Ввод» с меткой 5 для открытия диалогового окна параметров блока.

  2. В диалоговом окне параметров блока выберите панель «Атрибуты сигнала» и обратите внимание, что:

    • Минимальное значение для этого сигнала: 1.

    • Максимальное значение для этого сигнала: 100.

  3. Нажмите кнопку ОК, чтобы закрыть диалоговое окно.

  4. Дважды нажмите кнопку «Просмотр конфигурации оптимизации».

    Появится панель Оптимизация (Optimization) диалогового окна Параметры конфигурации (Configuration Parameters).

  5. На этой панели выберите параметр Оптимизировать с использованием указанных минимальных и максимальных значений и нажмите кнопку Применить.

  6. Дважды нажмите кнопку «Создать код».

    Появится отчет о создании кода.

  7. В модели щелкните правой кнопкой мыши значок Division with increased fraction length output type блок.

    Появится контекстное меню.

  8. В контекстном меню выберите C/C + + Code > Перейти к C/C + + Code.

    Отчет о создании кода выделяет код, созданный для этого блока. На этот раз сгенерированный код реализует разделение со сменной операцией и не имеет функции разделения утилиты.

    tmp = rtU.In6;
    rtY.Out3 = (uint32_T)tmp == 
      (uint32_T)0 ? MAX_uint32_T : ((uint32_T)rtU.In5 << 17) /
        (uint32_T)tmp;

Изменение указанных минимальных и максимальных значений

Наконец, измените минимальное и максимальное значения для первого входа в операцию деления так, чтобы его диапазон ввода был слишком большим, чтобы гарантировать, что значение не перетекает при сдвиге. Здесь нельзя сдвинуть 16-разрядное число на 17 бит вправо без переполнения 32-разрядного контейнера. Создайте код для операции разделения с учетом минимального и максимального значений. В этих диапазонах ввода сгенерированный код включает в себя служебную функцию разделения, чтобы гарантировать отсутствие переполнения.

  1. Дважды щелкните блок ввода с меткой 5 для открытия диалогового окна параметров блока.

  2. В диалоговом окне параметров блока выберите панель «Атрибуты сигнала» и задайте для параметра «Максимальное значение» значение 40000затем нажмите кнопку ОК, чтобы закрыть диалоговое окно.

  3. Дважды нажмите кнопку «Создать код».

    Появится отчет о создании кода.

  4. В модели щелкните правой кнопкой мыши значок Division with increased fraction length output type блок.

    Появится контекстное меню.

  5. В контекстном меню выберите C/C + + Code > Перейти к C/C + + Code.

    Отчет о создании кода выделяет код, созданный для этого блока. Сгенерированный код включает в себя вызов div_repeat_32 служебная функция.

    rtY.Out3 = div_repeat_u32((uint32_T)rtU.In5 << 16, 
      (uint32_T)rtU.In6, 1U);