Заставить Matlab Coder создавать структуры - PullRequest
1 голос
/ 30 сентября 2019

В моем коде была одна структура, которая была создана с помощью функции create_a_structure.m с a_struct = create_a_structure(). Несколько других функций, вызвавших эту функцию, изменили значения в полях этой структуры.

Используя coder.cstructname(a_struct, 'a_struct') и несколько настроек, мне удалось заставить кодировщик Matlab фактически создать структуру с именем a_struct в сгенерированном коде. Хотя фактическая переменная называлась b_a_struct и была объявлена ​​в My_project_types.h. Это значительно упростило работу с сгенерированным кодом.

Теперь я хотел добавить вторую структуру, которая должна вести себя аналогично, скажем, b_struct. Создав аналогичные функции для работы с этой новой структурой, я ожидал, что структура с именем b_struct также будет сгенерирована в коде, сгенерированном кодером Matlab, но это просто не тот случай.

У меня естьс тех пор я пытался повторить поведение, которое я получил с помощью a_struct.

Но вкратце:

Как заставить Matlab Coder создавать структуры C, соответствующие структурам Matlab, используемым вкод Matlab?

EDIT : написание заголовка вручную не является решением, так как я ожидаю, что содержимое этой структуры будет меняться немного часто, и я 'Я планирую добавить больше структур аналогичным образом.

1 Ответ

3 голосов
/ 01 октября 2019

coder.cstructname(myStructVariable, 'myStruct') указывает MATLAB Coder использовать указанное имя структуры myStruct в качестве типа, в основном используя typedef struct {...} myStruct.

Когда сгенерированный код должен ссылаться на переменную с этим typedef, MATLAB Coder будетвсе еще нужно сгенерировать имя переменной, которая не будет мешать типу, так что вы действительно можете видеть b_a_struct как имя переменной. Если вы сохраните имя структуры для типа и имя переменной достаточно разными, вы, скорее всего, увидите ожидаемый код из генератора, например, когда сгенерирован код с codegen -config:lib myfun -report из:

function [v, w, x] = myfun() 
%#codegen

v = struct('a',1,'b',2);
coder.cstructname(v, 'myStruct');
w = struct('a', 1, 'b', 3); 
coder.cstructname(w, 'b_struct'); 
x = struct('a', 1, 'b', 4); 
coder.cstructname(x, 'a_struct');

end

Это приводит к чему-тонапример:

void myfun(myStruct *v, b_struct *w, a_struct *x)
{
  v->a = 1.0;
  v->b = 2.0;
  w->a = 1.0;
  w->b = 3.0;
  x->a = 1.0;
  x->b = 4.0;
}

Таким образом, мы действительно видим typedef во входных аргументах как указатели, а имена переменных совпадают (v, w и x).

MATLABКодер достаточно хорош (иногда довольно агрессивен) в оптимизации сгенерированного кода, и его цель всегда состоит в том, чтобы обеспечить одинаковые выходные данные от функций точки входа с учетом указанных входных данных во время кодирования. Если вы вызываете сгенерированный код из другого кода C / C ++, фактические имена переменных в сгенерированном коде не должны быть слишком критичными, но, конечно, struct typedefs действительно имеет значение для взаимодействия между автоматически сгенерированным и другим кодом !!

...