Программное обеспечение 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 объекты
Перед формированием кода проверьте минимальное и максимальное значения сигналов и параметров. В противном случае оптимизация может привести к численному несоответствию с моделированием. Можно моделировать модель с включенной проверкой диапазона моделирования. При возникновении ошибок или предупреждений устраните эти неполадки перед созданием кода.
Используйте типы данных с фиксированной точкой с двоичным масштабированием «только точка» (мощность двух).
Предоставьте проектную минимальную и максимальную информацию перед блоками как можно ближе к входам блоков. Если указать минимальное и максимальное значения для вывода блока, эти значения, скорее всего, повлияют на выходы блоков непосредственно в нисходящем направлении. Дополнительные сведения см. в разделе Устранение ненужных служебных функций с использованием указанных минимальных и максимальных значений.
В диалоговом окне «Параметры конфигурации» установите параметр «Создание кода» > «Системный целевой файл» для выбора встроенного файла в режиме реального времени (ERT) target (требуется лицензия Embedded Coder).
Укажите минимальное и максимальное значения для сигналов и параметров в модели, используя советы в разделе Настройка модели.
Выберите «Оптимизация» > «Дополнительные параметры» > «Оптимизация», используя указанный параметр конфигурации минимального и максимального значений.
Эта оптимизация не выполняется для:
Многословные операции
Типы данных с фиксированной точкой с масштабированием уклона и смещения
Сложение, если только длина дроби не равна нулю
Эта оптимизация не учитывает минимальные и максимальные значения для:
Объединение входных данных блоков. Чтобы обойти эту проблему, используйте Simulink.Signal на выходе блока «Слияние» и укажите диапазон для этого объекта.
Элементы шины.
Условно выполняемая подсистема (например, запускаемая подсистема) выводит блоки, которые непосредственно соединены с блоком Outport.
Блоки аутпорта в условно выполненных подсистемах могут иметь исходное значение, заданное для использования, только если система не запущена. В этом случае оптимизация не может использовать диапазон вывода блока, поскольку диапазон может не охватывать начальное значение блока.
Точность ограничена, поскольку минимальное и максимальное значения задаются как значения двойной точности. Если истинное значение минимального или максимального значения не может быть представлено как двойное значение, убедитесь, что минимальное и максимальное значения округляются правильно, чтобы они охватывали истинный проектный диапазон.
Если модель содержит несколько экземпляров многоразовой подсистемы и каждый экземпляр использует входные сигналы с различными заданными минимальными и максимальными значениями, эта оптимизация может привести к различному сгенерированному коду для каждой подсистемы, поэтому повторное использование кода не происходит. Без этой оптимизации программное обеспечение Simulink Coder™ генерирует код для подсистемы один раз и совместно использует этот код для нескольких экземпляров подсистемы.
В этом примере показано, как программа Fixed-Point Designer использует диапазон ввода для операции разделения, чтобы определить, может ли она исключить ненужные функции утилиты из сгенерированного кода. Он использует fxpdemo_min_max_optimization модель. Во-первых, код создается без использования указанных минимального и максимального значений, чтобы убедиться в том, что созданный код содержит служебные функции, гарантирующие отсутствие деления на ноль. Затем включите оптимизацию и снова создайте код. При оптимизации сгенерированный код не содержит служебную функцию, поскольку она не является необходимой для диапазона ввода.
Сначала создайте код без учета расчетных минимальных и максимальных значений для первого ввода операции деления, чтобы показать код без оптимизации. В этом случае программное обеспечение использует представимые диапазоны для двух входов, которые оба uint16. С этими входными диапазонами невозможно реализовать деление с заданной точностью с помощью сдвигов, поэтому сгенерированный код включает в себя служебную функцию деления.
Выполните пример fxpdemo_min_max_optimization.
В окне примера дважды нажмите кнопку View Optimization Configuration.
Появится панель Оптимизация (Optimization) диалогового окна Параметры конфигурации (Configuration Parameters).
Обратите внимание, что параметр Оптимизировать с использованием указанных минимальных и максимальных значений не выбран.
Дважды нажмите кнопку «Создать код».
Появится отчет о создании кода.
В модели щелкните правой кнопкой мыши значок Division with increased fraction length output type блок.
Появится контекстное меню.
В контекстном меню выберите C/C + + Code > Перейти к C/C + + Code.
Отчет о создании кода выделяет код, созданный для этого блока. Сгенерированный код включает в себя вызов div_repeat_u32 служебная функция.
rtY.Out3 = div_repeat_u32((uint32_T)rtU.In5 << 16, (uint32_T)rtU.In6, 1U);
Щелкните значок div_repeat_u32 ссылка для просмотра функции утилиты, которая содержит код для обработки деления на ноль.
Затем создайте код для той же операции разделения, на этот раз с учетом расчетных минимальных и максимальных значений для первого ввода блока «Изделие». Эти минимальные и максимальные значения указаны в блоке Inport непосредственно перед блоком Product. В этих диапазонах ввода сгенерированный код реализует разделение простым использованием сдвига. Ему не нужно создавать служебную функцию разделения, сокращая как использование памяти, так и время выполнения.
Дважды щелкните блок «Ввод» с меткой 5 для открытия диалогового окна параметров блока.
В диалоговом окне параметров блока выберите панель «Атрибуты сигнала» и обратите внимание, что:
Минимальное значение для этого сигнала: 1.
Максимальное значение для этого сигнала: 100.
Нажмите кнопку ОК, чтобы закрыть диалоговое окно.
Дважды нажмите кнопку «Просмотр конфигурации оптимизации».
Появится панель Оптимизация (Optimization) диалогового окна Параметры конфигурации (Configuration Parameters).
На этой панели выберите параметр Оптимизировать с использованием указанных минимальных и максимальных значений и нажмите кнопку Применить.
Дважды нажмите кнопку «Создать код».
Появится отчет о создании кода.
В модели щелкните правой кнопкой мыши значок Division with increased fraction length output type блок.
Появится контекстное меню.
В контекстном меню выберите 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-разрядного контейнера. Создайте код для операции разделения с учетом минимального и максимального значений. В этих диапазонах ввода сгенерированный код включает в себя служебную функцию разделения, чтобы гарантировать отсутствие переполнения.
Дважды щелкните блок ввода с меткой 5 для открытия диалогового окна параметров блока.
В диалоговом окне параметров блока выберите панель «Атрибуты сигнала» и задайте для параметра «Максимальное значение» значение 40000затем нажмите кнопку ОК, чтобы закрыть диалоговое окно.
Дважды нажмите кнопку «Создать код».
Появится отчет о создании кода.
В модели щелкните правой кнопкой мыши значок Division with increased fraction length output type блок.
Появится контекстное меню.
В контекстном меню выберите C/C + + Code > Перейти к C/C + + Code.
Отчет о создании кода выделяет код, созданный для этого блока. Сгенерированный код включает в себя вызов div_repeat_32 служебная функция.
rtY.Out3 = div_repeat_u32((uint32_T)rtU.In5 << 16, (uint32_T)rtU.In6, 1U);