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

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

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

Это результаты оптимизации в:

  • Уменьшаемый ROM и потребление RAM

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

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

Предпосылки

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

Как сконфигурировать вашу модель

Сделать оптимизацию более вероятно:

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

    • Inport и блоки Outport

    • Блокируйте выходные параметры

    • Блокируйте входные параметры, например, для блоков функции MATLAB и диаграммы Stateflow

    • Объекты Simulink.Signal

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

     Как включить проверку диапазона симуляции

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

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

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

  1. В диалоговом окне Configuration Parameters, устанавливает Code Generation> System target file, чтобы выбрать цель Embedded Real-Time (ERT) (требует лицензии Embedded Coder).

  2. Задайте проект минимальные и максимальные значения для сигналов и параметров в вашей модели с помощью советов в том, Как Сконфигурировать Модель.

  3. Выберите Optimization> параметр конфигурации Optimize using specified minimum and maximum values.

Ограничения

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

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

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

    • Сложение, если дробная длина не является нулем

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

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

    • Соедините шиной элементы.

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

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

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

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

Устраните ненужные служебные функции Используя заданные минимальные и максимальные значения

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

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

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

  1. Запустите fxpdemo_min_max_optimization пример.

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

    Панель Оптимизации диалогового окна Configuration Parameters появляется.

    Обратите внимание на то, что параметр Optimize using specified minimum and maximum values не выбран.

  3. Дважды кликните Сгенерировать Кнопку кода.

    Отчет генерации кода появляется.

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

    Контекстное меню появляется.

  5. Из контекстного меню выберите C/C++ Code> Navigate To 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 непосредственно в восходящем направлении блока продукта. С этими входными диапазонами сгенерированный код реализует деление путем простого использования сдвига. Это не должно генерировать служебную функцию деления, уменьшая и использование памяти и время выполнения.

  1. Дважды кликните блок Inport маркировал 5, чтобы открыть диалоговое окно параметров блоков.

  2. На диалоговом окне параметров блоков выберите панель Signal Attributes и обратите внимание что:

    • Значением Minimum для этого сигнала является 1.

    • Значением Maximum для этого сигнала является 100.

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

  4. Дважды кликните кнопку View Optimization Configuration.

    Панель Оптимизации диалогового окна Configuration Parameters появляется.

  5. На этой панели выберите параметр Optimize using specified minimum and maximum values и нажмите Apply.

  6. Дважды кликните Сгенерировать Кнопку кода.

    Отчет генерации кода появляется.

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

    Контекстное меню появляется.

  8. Из контекстного меню выберите C/C++ Code> Navigate To 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. Дважды кликните блок Inport маркировал 5, чтобы открыть диалоговое окно параметров блоков.

  2. На диалоговом окне параметров блоков выберите панель Signal Attributes и установите значение Maximum к 40000, затем нажмите OK, чтобы закрыть диалоговое окно.

  3. Дважды кликните Сгенерировать Кнопку кода.

    Отчет генерации кода появляется.

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

    Контекстное меню появляется.

  5. Из контекстного меню выберите C/C++ Code> Navigate To C/C++ Code.

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

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