Трассировка Сгенерированного Кода C/C++ к Исходному коду MATLAB

Трассировка сгенерированного кода C/C++ к исходному исходному коду MATLAB® помогает вам к:

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

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

Можно проследить при помощи одного из этих методов:

  • Сконфигурируйте MATLAB Coder™, чтобы сгенерировать код, который включает исходный код MATLAB как комментарии. В комментариях тег трассируемости сразу предшествует каждой строке исходного кода. Тег трассируемости предоставляет подробную информацию о местоположении исходного кода. Если у вас есть Embedded Coder® в отчете генерации кода, теги трассируемости соединяются с соответствующим исходным кодом MATLAB.

  • С Embedded Coder представьте отчет генерации кода, который включает интерактивную трассируемость. Интерактивная трассировка в отчете помогает вам визуализировать отображение между исходным кодом MATLAB и сгенерированным кодом C/C++. Смотрите В интерактивном режиме Трассировку Между кодом MATLAB и Сгенерированным Кодом C/C++ (Embedded Coder).

Сгенерируйте теги трассируемости

Чтобы произвести теги трассируемости в сгенерированном коде, включите генерацию исходного кода MATLAB как комментарии.

  • В приложении MATLAB Coder, набор MATLAB source code as comments к Yes.

  • В объекте настройки генерации кода, набор MATLABSourceComments к true.

Формат тегов трассируемости

В сгенерированном коде теги трассируемости сразу появляются перед исходным кодом MATLAB в комментарии. Формат тега:
<filename>:<line number>.

Например, этот комментарий указывает, что код x = r * cos(theta); появляется в строке 4 в исходном файле straightline.m.

/* 'straightline:4' x = r * cos(theta); */

Местоположение комментариев в сгенерированном коде

Сгенерированные комментарии, содержащие исходный код и тег трассируемости, появляются в сгенерированном коде можно следующим образом.

Прямолинейный исходный код

В прямолинейном исходном коде без if, while, операторов for или switch, комментарий, содержащий исходный код, предшествует сгенерированному коду, который реализует оператор исходного кода. Этот комментарий появляется после комментариев пользователей, которые предшествуют сгенерированному коду.

Например, в следующем коде, комментарий пользователя, /* Convert polar to Cartesian */, появляется перед сгенерированным комментарием, содержащим первую строку исходного кода, вместе с его тегом трассируемости,
/* 'straightline:4' x = r * cos(theta); */.

КОД MATLAB

function [x, y] = straightline(r,theta)
%#codegen
% Convert polar to Cartesian
x = r * cos(theta);
y = r * sin(theta);

Прокомментированный код С

void straightline(double r, double theta, double *x, double *y)
{
  /*  Convert polar to Cartesian */
  /* 'straightline:4' x = r * cos(theta); */
  *x = r * cos(theta);

  /* 'straightline:5' y = r * sin(theta); */
  *y = r * sin(theta);
}

Операторы if

Комментарий для оператора if сразу предшествует коду, который реализует оператор. Этот комментарий появляется после комментариев пользователей, которые предшествуют сгенерированному коду. Комментарии для elseif и пункты else сразу появляются после кода, который реализует пункт, и прежде чем код сгенерировал для операторов в пункте.

КОД MATLAB

function y = ifstmt(u,v) 
%#codegen
if u > v
    y = v + 10;
elseif u == v
    y = u * 2;
else
    y = v - 10;
end

Прокомментированный код С

double ifstmt(double u, double v)
{
  double y;

  /* 'ifstmt:3' if u > v */
  if (u > v) {
    /* 'ifstmt:4' y = v + 10; */
    y = v + 10.0;
  } else if (u == v) {
    /* 'ifstmt:5' elseif u == v */
    /* 'ifstmt:6' y = u * 2; */
    y = u * 2.0;
  } else {
    /* 'ifstmt:7' else */
    /* 'ifstmt:8' y = v - 10; */
    y = v - 10.0;
  }

  return y;
}

Для операторов

Комментарий для заголовка оператора for сразу предшествует сгенерированному коду, который реализует заголовок. Этот комментарий появляется после комментариев пользователей, которые предшествуют сгенерированному коду.

КОД MATLAB

function y = forstmt(u) 
%#codegen
y = 0;
for i = 1:u
    y = y + 1;
end

Прокомментированный код С

double forstmt(double u)
{
  double y;
  int i;

  /* 'forstmt:3' y = 0; */
  y = 0.0;

  /* 'forstmt:4' for i = 1:u */
  for (i = 0; i < (int)u; i++) {
    /* 'forstmt:5' y = y + 1; */
    y++;
  }

  return y;
}

В то время как операторы

Комментарий для заголовка оператора while сразу предшествует сгенерированному коду, который реализует заголовок оператора. Этот комментарий появляется после комментариев пользователей, которые предшествуют сгенерированному коду.

КОД MATLAB

function y = subfcn(y) 
coder.inline('never');
while y < 100
    y = y + 1;
end

Прокомментированный код С

void subfcn(double *y)
{
  /* 'subfcn:2' coder.inline('never'); */
  /* 'subfcn:3' while y < 100 */
  while (*y < 100.0) {
    /* 'subfcn:4' y = y + 1; */
    (*y)++;
  }
}

Операторы switch

Комментарий для заголовка оператора switch сразу предшествует сгенерированному коду, который реализует заголовок оператора. Этот комментарий появляется после комментариев пользователей, которые предшествуют сгенерированному коду. Комментарии для case и пункты otherwise сразу появляются после сгенерированного кода, который реализует пункт, и прежде чем код сгенерировал для операторов в пункте.

КОД MATLAB

function y = switchstmt(u)
%#codegen
y = 0;
switch u
    case 1
        y = y + 1;
    case 3
        y = y + 2;
    otherwise
        y = y - 1;
end

Прокомментированный код С

double switchstmt(double u)
{
  double y;

  /* 'switchstmt:3' y = 0; */
  /* 'switchstmt:4' switch u */
  switch ((int)u) {
   case 1:
    /* 'switchstmt:5' case 1 */
    /* 'switchstmt:6' y = y + 1; */
    y = 1.0;
    break;

   case 3:
    /* 'switchstmt:7' case 3 */
    /* 'switchstmt:8' y = y + 2; */
    y = 2.0;
    break;

   default:
    /* 'switchstmt:9' otherwise */
    /* 'switchstmt:10' y = y - 1; */
    y = -1.0;
    break;
  }

  return y;
}

Ограничения тега трассируемости

  • Вы не можете включать исходный код MATLAB как комментарии для:

    • Функции тулбокса MathWorks®

    • Псевдокод

  • Внешний вид или местоположение комментариев могут отличаться:

    • Даже если код реализации устраняется, например, из-за сворачивания констант, комментарии могут все еще появиться в сгенерированном коде.

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

    • Для определенной оптимизации комментарии могут быть разделены от сгенерированного кода.

    • Даже если вы не принимаете решение включать комментарии исходного кода в сгенерированный код, сгенерированный код включает по закону требуемые комментарии из исходного кода MATLAB.

Похожие темы