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

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

Программное обеспечение 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

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

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

    • Simulink.Signal объекты

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

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

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

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

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

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

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

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

Ограничения

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

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

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

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

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

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

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

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

      Блокам 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 соединитесь, чтобы просмотреть служебную функцию, которая содержит код для обработки деления на нуль.

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

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

  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);