Когда вы преобразовываете код MATLAB® в фиксированную точку, можно подсветить потенциальные проблемы типа данных в сгенерированном отчете. Отчет подсвечивает код MATLAB, который требует с одинарной точностью, с двойной точностью, или дорогие операции фиксированной точки.
Проверка с двойной точностью подсвечивает выражения, которые приводят к операции с двойной точностью. При попытке достигнуть проекта строго-одной или фиксированной точки, ручной контроль кода может быть длителен и подвержен ошибкам.
Проверка с одинарной точностью подсвечивает выражения, которые приводят к одной операции.
Дорогая проверка операций фиксированной точки идентифицирует возможности оптимизации для фиксированной точки. Это подсвечивает выражения в коде MATLAB, которые требуют громоздкого умножения или деления, дорогого округления, дорогого сравнения или операций многословных. Для получения дополнительной информации об оптимизации сгенерированной фиксированной точки смотрите Советы для того, чтобы Сделать Сгенерированный код Более эффективным.
Включите опцию подсветки с помощью приложения Fixed-Point Converter
На странице Convert to Fixed Point кликните по стрелке Settings.
Под Plotting and Reporting, набор Highlight potential data type issues к 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)}
Нажмите View report.
В отчете генерации кода кликните по вкладке Code Insights.
Расширьте раздел Potential data type issues. Затем расширьте раздел Expensive fixed-point operations.
Отчет отмечает выражение in1 * in2
. Чтобы решить вопрос, измените типы данных in1
и in2
так, чтобы размер слова продукта не превышал целевой размер слова 64.
Традиционный рукописный код, специально для приложений управления, почти всегда не использует "усилия" округление. Например, для беззнакового целого и дополнительных целых чисел со знаком two, переключая право и пропуская биты эквивалентно округлению на пол. Чтобы получить результаты, сопоставимые с, или лучше, чем, что вы ожидаете от традиционного рукописного кода, используют метод округления 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)}
Нажмите View report.
В отчете генерации кода кликните по вкладке Code Insights.
Расширьте раздел Potential data type issues. Затем расширьте раздел Expensive fixed-point operations.
Операция деления 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)}
Нажмите View report.
В отчете генерации кода кликните по вкладке Code Insights.
Расширьте раздел Potential data type issues. Затем расширьте раздел Expensive fixed-point operations.
Первый входной параметр, 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)}
Нажмите View report.
В отчете генерации кода кликните по вкладке Code Insights.
Расширьте раздел Potential data type issues. Затем расширьте раздел Expensive fixed-point operations.
Отчет отмечает операцию in1 * in2
в строке 2 из myMul
.
В панели кода сделайте паузу по in1
, in2
и выражению in1 * in2
. Вы видите что:
Размер слова in1
составляет 33 бита, и размер слова in2
составляет 32 бита.
Размер слова выражения in1 * in2
составляет 65 битов.
Программное обеспечение обнаруживает операцию многословную, потому что размер слова 65 больше, чем целевой размер слова 64.
Чтобы решить этот вопрос, измените типы данных in1
и in2
так, чтобы размер слова продукта не превышал целевой размер слова. Также задайте свойство ProductMode
локального объекта fimath
.