Найдите потенциальные проблемы типа данных в сгенерированном коде

Тип данных выпускает обзор

Когда вы генерируете код С из кода MATLAB®, можно подсветить потенциальные проблемы типа данных в отчете генерации кода C. Отчет подсвечивает код MATLAB, который требует с одинарной точностью, с двойной точностью, или дорогие операции фиксированной точки. Дорогие проверки операций фиксированной точки требуют Fixed-Point Designer™.

  • Проверка с двойной точностью подсвечивает выражения, которые приводят к операции с двойной точностью. При попытке достигнуть проекта строго-одной или фиксированной точки, ручной контроль кода может быть длителен и подвержен ошибкам.

    Для проекта строгой одинарной точности задайте стандартную математическую библиотеку, которая поддерживает реализации с одинарной точностью. Чтобы изменить библиотеку для проекта, во время Сгенерировать шага Кода, в диалоговом окне настроек проекта, на вкладке Custom Code, устанавливают Standard math library на C99 (ISO).

  • Проверка с одинарной точностью подсвечивает выражения, которые приводят к одной операции.

  • Дорогая проверка операций фиксированной точки идентифицирует возможности оптимизации для фиксированной точки. Это подсвечивает выражения в коде MATLAB, которые требуют громоздкого умножения или деления, дорогого округления, дорогого сравнения или операций многословных. Для получения дополнительной информации об оптимизации сгенерированной фиксированной точки смотрите Советы для того, чтобы Сделать Сгенерированный код Более эффективным (Fixed-Point Designer).

Позвольте подсветить потенциальных проблем типа данных

Включите опцию подсветки с помощью приложения MATLAB Coder

  1. На странице Generate Code, чтобы открыть диалоговое окно Generate, кликают по стрелке Generate.

  2. Установите Build type на одно из следующего:

    • Source Code

    • Static Library (.lib)

    • Dynamic Library (.dll)

    • Executable (.exe)

  3. Нажмите More Settings.

  4. На вкладке Debugging установите флажки Always create a code generation report и Highlight potential data type issues.

Включите опцию подсветки с помощью интерфейса командной строки

  1. Создайте встроенный объект настройки кода для 'lib', 'dll' или 'exe':

    cfg = coder.config('lib','ecoder',true); % or dll or exe
    

  2. Установите GenerateReport и свойства объектов настройки HighlightPotentialDataTypeIssues к true:

    cfg.GenerateReport = true;
    cfg.HighlightPotentialDataTypeIssues = true;

Найдите и обратитесь к громоздким операциям

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

Этот пример требует Embedded Coder® и Fixed-Point Designer. Целевой размер слова для процессора в этом примере равняется 64.

  1. Создайте функциональный myMul.

    function out = myMul(in1, in2)
        out = fi(in1*in2, 1, 64, 0);
    end
    

  2. Сгенерируйте код для 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)}

  3. Нажмите View report.

  4. В отчете генерации кода кликните по вкладке Code Insights.

  5. Расширьте раздел Potential data type issues. Затем расширьте раздел Expensive fixed-point operations.

    Отчет отмечает выражение in1 * in2. Чтобы решить вопрос, измените типы данных in1 и in2 так, чтобы размер слова продукта не превышал целевой размер слова 64.

Найдите и обратитесь к дорогому округлению

Традиционный рукописный код, специально для приложений управления, почти всегда не использует "усилия" округление. Например, для беззнакового целого и дополнительных целых чисел со знаком two, переключая право и пропуская биты эквивалентно округлению на пол. Чтобы получить результаты, сопоставимые с, или лучше, чем, что вы ожидаете от традиционного рукописного кода, используют метод округления floor.

Этот пример требует Embedded Coder и Fixed-Point Designer.

  1. Создайте функциональный myRounding.

    function [quot] = myRounding(in1, in2)
       quot = in1 / in2;
    end

  2. Сгенерируйте код для 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)}

  3. Нажмите View report.

  4. В отчете генерации кода кликните по вкладке Code Insights.

  5. Расширьте раздел Potential data type issues. Затем расширьте раздел Expensive fixed-point operations.

    Операция деления in1/in2 использует метод округления значения по умолчанию, nearest. Изменение метода округления к Floor обеспечивает более эффективное внедрение.

Найдите и обратитесь к дорогим операциям сравнения

Операции сравнения генерируют дополнительный код, когда операция кастинга требуется, чтобы делать сравнение. Например, прежде, чем сравнить беззнаковое целое с целым числом со знаком, одни из входных параметров должны быть брошены к со знаком из другого. Рассмотрите оптимизацию типов данных входных параметров так, чтобы бросок не требовался в сгенерированном коде.

Этот пример требует Embedded Coder и Fixed-Point Designer.

  1. Создайте функциональный myRelop.

    function out = myRelop(in1, in2)
        out = in1 > in2;
    end

  2. Сгенерируйте код для 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)}

  3. Нажмите View report.

  4. В отчете генерации кода кликните по вкладке Code Insights.

  5. Расширьте раздел Potential data type issues. Затем расширьте раздел Expensive fixed-point operations.

    Первый входной параметр, in1, подписывается, в то время как in2 без знака. Дополнительный код сгенерирован, потому что бросок должен произойти, прежде чем два входных параметров могут быть сравнены.

    Измените со знаком и масштабирующиеся из одних из входных параметров, чтобы сгенерировать более эффективный код.

Найдите и обратитесь к операциям многословным

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

Этот пример требует Embedded Coder и Fixed-Point Designer. В этом примере целевой размер слова равняется 64.

  1. Создайте функциональный myMul.

    function out = myMul(in1, in2)
        out = in1 * in2;
    end

  2. Сгенерируйте код для 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)}

  3. Нажмите View report.

  4. В отчете генерации кода кликните по вкладке Code Insights.

  5. Расширьте раздел Potential data type issues. Затем расширьте раздел Expensive fixed-point operations.

    Отчет отмечает операцию in1 * in2 в строке 2 из myMul.

  6. В панели кода сделайте паузу по in1, in2 и выражению in1 * in2. Вы видите что:

    • Размер слова in1 составляет 33 бита, и размер слова in2 составляет 32 бита.

    • Размер слова выражения in1 * in2 составляет 65 битов.

    Программное обеспечение обнаруживает операцию многословную, потому что размер слова 65 больше, чем целевой размер слова 64.

  7. Чтобы решить этот вопрос, измените типы данных in1 и in2 так, чтобы размер слова продукта не превышал целевой размер слова. Также задайте свойство ProductMode локального объекта fimath.

Похожие темы