Когда вы генерируете код С из MATLAB® код, можно выделить потенциальные проблемы типа данных в Генерацию кода C отчете. В отчете описывается код MATLAB, который требует одинарной точности, двойной точности или дорогих операций с фиксированной точкой. Для дорогих операции с фиксированной точкой требуется Fixed-Point Designer™.
Проверка двойной точности подсвечивает выражения, которые приводят к операции двойной точности. При попытке достижения строгого проекта с одной или с фиксированной точкой ручной осмотр кода может быть длительным и подверженным ошибкам.
Для строго-одинарного проекта точности задайте стандартную математическую библиотеку, которая поддерживает реализации с одной точностью. Чтобы изменить библиотеку для проекта, во время шага Сгенерировать код, в диалоговом окне параметров проекта, на вкладке Custom Code, установите Standard math library равным C99 (ISO)
.
Проверка с одной точностью подсвечивает выражения, которые приводят к одной операции.
Дорогая проверка операций с фиксированной точкой идентифицирует возможности оптимизации для кода с фиксированной точкой. В нем выделены выражения в коде MATLAB, которые требуют громоздкого умножения или деления, дорогого округления, дорогого сравнения или многословных операций. Для получения дополнительной информации об оптимизации сгенерированного кода с фиксированной точкой смотрите Советы по повышению эффективности сгенерированного кода (Fixed-Point Designer).
Включите опцию подсветки с помощью приложения MATLAB Coder
На странице Generate Code, чтобы открыть диалоговое окно Generate, щелкните стрелу Generate.
Установите Build type в одно из следующих значений:
Source Code
Static Library (.lib)
Dynamic Library (.dll)
Executable (.exe)
Нажмите More Settings.
На вкладке Debugging установите флажки Always create a report и Highlight potential data type issues.
Включите опцию подсветки с помощью интерфейса командной строки
Создайте объект строения встроенного кода для 'lib'
, 'dll'
, или 'exe'
:
cfg = coder.config('lib','ecoder',true); % or dll or exe
Установите GenerateReport
и HighlightPotentialDataTypeIssues
свойства объекта строения в true
:
cfg.GenerateReport = true; cfg.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.
Традиционный рукописный код, особенно для приложений управления, почти всегда использует округление «без усилий». Для примера, для беззнаковых целых и двух комплементарных целых чисел, перемещение вправо и падение бит эквивалентно округлению к полу. Чтобы получить результаты, сопоставимые с или лучше, чем вы ожидаете от традиционного рукописного кода, используйте 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
(Fixed-Point Designer) объект.