Когда вы генерируете код С из кода 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.
Традиционный рукописный код, специально для приложений управления, почти всегда не использует "усилия" округление. Например, для беззнакового целого и дополнительных целых чисел со знаком 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
объект.