В интерактивном режиме проследите между кодом MATLAB и сгенерированным кодом C/C++

Этот пример показывает, как проследить между исходным кодом MATLAB® и сгенерированным кодом C/C++. Трассировка между исходным кодом и сгенерированным кодом помогает вам к:

  • Поймите, как генератор кода реализовал ваш алгоритм.

  • Отладьте проблемы в сгенерированном коде.

  • Оцените качество сгенерированного кода.

Если вы имеете Embedded Coder® и включаете производство отчета генерации кода с трассируемостью, вы можете просмотреть исходный код MATLAB и сгенерировали код C/C++ друг рядом с другом. Когда вы перемещаете указатель через код, можно следовать за подсвеченными трассировками к соответствующему сгенерированному коду или источнику код MATLAB.

Создайте исходный код MATLAB

Чтобы проиллюстрировать интерактивную трассируемость, этот пример представляет отчет для генерации статической библиотеки C для функции MATLAB lpsolve, который решает линейную программу:

  • максимизируйте y = c*x

  • подвергните A*x <= b

  • где x> = 0 и b> = 0

 lpsolve

Пример также использует тестовую функцию lpsolve_test, который вызывает lpsolve с представительными входными значениями.

 lpsolve_test

Скопируйте lpsolve.m и lpsolve_test.m к перезаписываемой папке.

copyfile(fullfile(docroot, 'toolbox', 'ecoder', 'examples', 'lpsolve.m'))
copyfile(fullfile(docroot, 'toolbox', 'ecoder', 'examples', 'lpsolve_test.m'))

Подготовьтесь к генерации кода

Прежде чем вы сгенерируете код C/C++, это - лучшая практика экранировать ваш код MATLAB на готовность генерации кода.

coder.screener('lpsolve')

Отчет готовности генерации кода указывает, что lpsolve подходит для генерации кода.

Это - также лучшая практика проверять на проблемы во время выполнения путем генерации и тестирования MEX-функции.

  • Чтобы задать типы входных аргументов, передайте представительные входные значения опции -args codegen. Также, потому что у вас есть тестовая функция, можно использовать coder.getArgTypes, чтобы определить типы.

  • Чтобы сгенерировать и протестировать MEX-функцию, используйте опцию -test.

c = [2 3 1 1];
A = [2 3 1 -1;1 0 2 1;0 2 1 1];
b = [27;9;18];
codegen lpsolve -args {c A b} -test lpsolve_test
Running test file: 'lpsolve_test' with MEX function 'lpsolve_mex'.

x =

     5
     7
     0
     4


y =

    35

codegen успешно генерирует и запускает MEX-функцию.

Представьте отчет генерации кода с трассируемостью

Чтобы сгенерировать отчет, который имеет интерактивную трассируемость:

  • Создайте объект coder.EmbeddedCodeConfig. Свойство EnableTraceability управляет трассируемостью. По умолчанию свойством EnableTraceability является true.

  • Задайте типы входных параметров передающими представительными входными значениями к опции -args.

  • Включите производство отчета генерации кода при помощи опции -report.

cfg = coder.config('lib', 'ecoder', true);
codegen -config cfg lpsolve -args {c A b} -report

Доступ к режиму трассировки в отчете

Чтобы открыть отчет генерации кода, нажмите View report.

В панели кода вы видите lpsolve.m.

Чтобы позволить проследить, на вкладке Report, нажимают Trace Code.

Вы видите исходный код MATLAB и сгенерированный код C друг рядом с другом.

Проследите код

Можно проследить от кода MATLAB до кода С или от кода С до кода MATLAB. Прослеживаемый код отмечен синим на стороне, которую вы прослеживаете от и с оранжевым на стороне, до которой вы прослеживаете. Когда вы перемещаете указатель через прослеживаемый код, код подсвечен в фиолетовом, и вы видите трассировки к соответствующему коду с другой стороны. Когда вы выбираете подсвеченный код путем нажатия на него, код становится желтым, и вы видите трассировки, даже когда вы отодвигаете указатель от выбора. Код остается выбранным, пока вы не нажимаете Esc или выбираете различный код. Чтобы изменить сторону, от которой вы прослеживаете, выберите код с другой стороны.

Исследуйте трассировку в отчете в качестве примера.

  1. В коде MATLAB укажите на while - цикл, который запускается в строке 38, и прокрутите вниз до целого while - цикл в поле зрения.

    Вы видите этот символ, который говорит вам, что подсвеченный код MATLAB имеет одну трассировку, которая не является в поле зрения.

    Вы видите соответствующий код С в отдельном окне в панели кода С.

  2. В панели кода С прокрутите вниз, пока вы не видите код С, который соответствует циклу while.

  3. В коде MATLAB переместите указатель через различные элементы синтаксиса в цикле while. Подсветите переменные, выражения и блоки кода.

    Когда вы перемещаете указатель через выражения, которые являются частью больших выражений, различными оттенками фиолетовой справки вы, чтобы найти соответствующее выражение в соответствующем коде С. Например, в строке 43, сделайте паузу по i.

  4. В коде MATLAB положите обратно указатель к while - цикл, который запускается в строке 38. Когда целый цикл будет подсвечен в фиолетовом, выберите его путем нажатия. Когда вы перемещаете указатель за пределами трассировки, желтое выделение идентифицирует выбранную трассировку.

    Чтобы очистить выбор, нажмите Esc или выберите различный код.

Просмотрите несколько трассировок

Когда код прослеживает больше чем до одного места в соответствующем источнике или сгенерированном коде:

  • Если вы делаете паузу по коду, который вы прослеживаете наверху панели кода, вы видите количество трассировок.

  • Если некоторые трассировки не в поле зрения, вы видите символ, который говорит вам, сколько трассировок вне поля зрения.

  • В панели кода, если вы выбираете код, который вы хотите проследить наверху панели кода, можно выбрать трассировку, которую вы хотите видеть.

В отчете для lpsolve просмотрите несколько трассировок.

  1. Приостановите по строке 36.

    Наверху панели кода вы видите, что строка 36 имеет две трассировки.

  2. Избранная строка 36.

    Наверху панели кода вы видите местоположение первой трассировки.

  3. Чтобы перечислить все трассировки, кликните по стрелке вправо трассировок.

Просмотрите трассировки к различным файлам

В отчете генерации кода для lpsolve все трассировки из кода MATLAB переходят к одному файлу C lpsolve.c. Если код MATLAB прослеживает до нескольких файлов C выше кода С, вы видите, что символ, такой как это обеспечивает количество дополнительных файлов, в которых можно найти трассировку. Если вы кликаете по символу, можно выбрать файл, который вы хотите видеть. Если вы выбираете код MATLAB, то можно выбрать трассировку, которую вы хотите видеть.

Аналогично, выше исходного кода MATLAB, символ тот, который указывает, что подсвеченный код С прослеживает до нескольких файлов MATLAB.

Переключите местоположения исходного и сгенерированного кода

  1. К представлению lpsolve.c на левой стороне панели кода, в списке сгенерированных файлов, нажимают lpsolve.c.

  2. Чтобы просмотреть код MATLAB на левой стороне панели кода, кликните по функции MATLAB, например, lpsolve.

Включите подсказки кода и ссылки

Когда вы не находитесь в режиме трассировки:

  • В коде MATLAB, если вы указываете на переменную или выражение, подсказка предоставляет информацию, такую как тип.

  • В коде С ссылки переходят к другим частям кода, таким как тип или функциональные определения.

Когда вы будете в режиме трассировки, чтобы включить подсказки кода MATLAB и ссылки кода С, удерживайте Ctrl. Подсказки кода MATLAB доступны только для выбранной функции MATLAB.

В отчете для lpsolve просмотрите информацию о типе для переменной.

  1. В панели MATLAB Source выберите pivot.

  2. В панели кода удерживайте Ctrl и приостановите по входному параметру i.

Примечание

На платформе Macintosh используйте ключ Command вместо Ctrl.

Отключите трассируемость

Чтобы представить отчет генерации кода, который не включает трассируемость:

  • В объекте coder.EmbeddedCodeConfig, набор свойство EnableTraceability к false.

  • В приложении MATLAB Coder™, набор Enable code traceability к No.

Смотрите также

Похожие темы