При преобразовании кода MATLAB ® в фиксированную точку можно выделить потенциальные проблемы с типами данных в созданном отчете. В отчете выделен код MATLAB, который требует операций с одной точностью, двойной точностью или дорогих операций с фиксированной точкой.
Проверка двойной точности подсвечивает выражения, которые приводят к операции двойной точности. При попытке достичь строгой конструкции с одной точкой или с фиксированной точкой ручная проверка кода может быть трудоемкой и подверженной ошибкам.
Проверка с одной точностью подсвечивает выражения, которые приводят к одной операции.
Дорогостоящая проверка операций с фиксированной точкой определяет возможности оптимизации для кода с фиксированной точкой. Он выделяет выражения в коде MATLAB, которые требуют громоздкого умножения или деления, дорогостоящего округления, дорогостоящего сравнения или многословных операций. Дополнительные сведения об оптимизации генерируемого кода с фиксированной точкой см. в разделе Советы по повышению эффективности генерируемого кода.
Включить параметр выделения с помощью приложения Fixed-Point Converter
На странице «Преобразовать в фиксированную точку» щелкните стрелку «Параметры».![]()
В разделе «Печать и создание отчетов» установите для параметра «Выделить возможные проблемы типа данных» значение Yes.
По завершении преобразования откройте отчет о преобразовании с фиксированной точкой для просмотра выделения. Щелкните Показать отчет (View report) на вкладке Вывод проверки типа (Type Validation Output).
Включить опцию выделения с помощью интерфейса командной строки
Создайте объект конфигурации кода с фиксированной точкой:
fixptcfg = coder.config('fixpt');Установите HighlightPotentialDataTypeIssues свойства объекта конфигурации для true.
fixptcfg.HighlightPotentialDataTypeIssues = true;
Громоздкие операции обычно происходят из-за недостаточного диапазона выходных данных. Избегайте операций умножения или деления, которые имеют длину слов, превышающую базовый целочисленный тип процессора. Программное обеспечение может обрабатывать операции с большей длиной слов, но этот подход требует большего количества кода и работает медленнее.
В этом примере требуется Embedded Coder ® и Fixed-Point Designer™. Длина целевого слова для процессора в этом примере равна 64.
Создание функции myMul.
function out = myMul(in1, in2) out = fi(in1*in2, 1, 64, 0); end
Создать код для myMul.
cfg = coder.config('lib'); cfg.GenerateReport = true; cfg.HighlightPotentialDataTypeIssues = true; fm = fimath('ProductMode', 'SpecifyPrecision', 'ProductWordLength', 64); codegen -config cfg myMul -args {fi(1, 1, 64, 4, fm), fi(1, 1, 64, 4, fm)}
Щелкните Просмотр отчета.
В отчете о создании кода перейдите на вкладку Анализ кода.
Разверните раздел Потенциальные проблемы с типами данных. Затем разверните раздел Дорогостоящие операции с фиксированной точкой.

Отчет помечает выражение in1 * in2. Чтобы устранить проблему, измените типы данных in1 и in2 чтобы длина слова произведения не превышала целевую длину слова 64.
Традиционный рукописный код, особенно для управляющих приложений, почти всегда использует округление «без усилий». Например, для целочисленных чисел без знака и целых чисел с знаком дополнения два смещение вправо и отбрасывание битов эквивалентно округлению до пола. Чтобы получить результаты, сравнимые или лучшие, чем вы ожидаете от традиционного рукописного кода, используйте floor способ округления.
В этом примере требуется Embedded Coder и Fixed-Point Designer.
Создание функции myRounding.
function [quot] = myRounding(in1, in2) quot = in1 / in2; end
Создать код для myRounding.
cfg = coder.config('lib'); cfg.GenerateReport = true; cfg.HighlightPotentialDataTypeIssues = true; codegen -config cfg myRounding -args {fi(1, 1, 16, 2), fi(1, 1, 16, 4)}
Щелкните Просмотр отчета.
В отчете о создании кода перейдите на вкладку Анализ кода.
Разверните раздел Потенциальные проблемы с типами данных. Затем разверните раздел Дорогостоящие операции с фиксированной точкой.

Операция дивизии in1/in2 использует метод округления по умолчанию, nearest. Изменение метода округления на Floor обеспечивает более эффективную реализацию.
Операции сравнения генерируют дополнительный код, когда для выполнения сравнения требуется операция литья. Например, прежде чем сравнивать целое число без знака с целым числом со знаком, один из входов должен быть приведен к сигнатуре другого. Рассмотрите возможность оптимизации типов данных входных аргументов таким образом, чтобы приведение не требовалось в создаваемом коде.
В этом примере требуется Embedded Coder и Fixed-Point Designer.
Создание функции myRelop.
function out = myRelop(in1, in2) out = in1 > in2; end
Создать код для myRelop.
cfg = coder.config('lib'); cfg.GenerateReport = true; cfg.HighlightPotentialDataTypeIssues = true; codegen -config cfg myRelop -args {fi(1, 1, 14, 3, 1), fi(1, 0, 14, 3, 1)}
Щелкните Просмотр отчета.
В отчете о создании кода перейдите на вкладку Анализ кода.
Разверните раздел Потенциальные проблемы с типами данных. Затем разверните раздел Дорогостоящие операции с фиксированной точкой.

Первый входной аргумент, in1, подписан, в то время как in2 не подписан. Дополнительный код генерируется, так как перед сравнением двух входов должна произойти приведение.
Измените сигнатуру и масштаб одного из входов, чтобы создать более эффективный код.
Многословные операции могут оказаться неэффективными на оборудовании. Если тип входных или выходных данных операции превышает наибольший размер текста процессора, созданный код содержит многословные операции. Можно избежать многословных операций в создаваемом коде, указав локальный fimath свойства для переменных. Можно также вручную задать длины операций ввода и вывода слов, которые генерируют многословный код.
В этом примере требуется Embedded Coder и Fixed-Point Designer. В этом примере длина целевого слова равна 64.
Создание функции myMul.
function out = myMul(in1, in2) out = in1 * in2; end
Создать код для myMul.
cfg = coder.config('lib'); cfg.GenerateReport = true; cfg.HighlightPotentialDataTypeIssues = true; codegen -config cfg myMul -args {fi(1, 1, 33, 4), fi(1, 1, 32, 4)}
Щелкните Просмотр отчета.
В отчете о создании кода перейдите на закладку Анализ кода.
Разверните раздел Потенциальные проблемы с типами данных. Затем разверните раздел Дорогостоящие операции с фиксированной точкой.

Отчет помечает in1 * in2 работа в строке 2 myMul.
В области кода сделайте паузу in1, in2и выражение in1 * in2. Вы видите, что:
Длина слова in1 33 бита и длина слова in2 32 бита.
Длина слова выражения in1 * in2 составляет 65 бит.
Программное обеспечение обнаруживает многословную операцию, поскольку длина 65 слова больше длины 64 целевого слова.
Чтобы устранить эту проблему, измените типы данных in1 и in2 чтобы длина слова произведения не превышала длину целевого слова. Либо укажите ProductMode свойство местного fimath объект.