exponenta event banner

Как генерируется код разделов кодера MATLAB

Секционирование созданных файлов

По умолчанию во время создания кода MATLAB ® Coder™ секционирует код в соответствии со структурой файла MATLAB. Это сопоставление «один к одному» позволяет легко сопоставить файлы, созданные в C/C + +, с скомпилированным кодом MATLAB. Кодер MATLAB не может создавать одно и то же однозначное соответствие для функций MATLAB, встроенных в сгенерированный код (см. раздел Разбиение файлов и вложение).

Можно также выбрать создание всех функций C/C + + в одном файле. Дополнительные сведения см. в разделе Выбор метода разбиения файлов. Этот параметр упрощает интеграцию кода с существующим встроенным программным обеспечением.

Выбор метода разбиения файлов

Использование приложения кодера MATLAB

  1. Чтобы открыть диалоговое окно «Генерация», на странице «Генерация кода» щелкните стрелку «Генерация».

  2. Щелкните Дополнительные параметры.

  3. На вкладке «Внешний вид кода» задайте для метода секционирования сгенерированных файлов значение Generate one file for each MATLAB file или Generate all functions into a single file.

В командной строке

Используйте codegen объект конфигурации FilePartitionMethod вариант. Например, для компиляции функции foo который не имеет входных данных и генерирует один файл C/C + + для каждой функции MATLAB:

  1. Создайте объект конфигурации MEX и установите FilePartitionMethod вариант:

    mexcfg = coder.config('mex');
    mexcfg.FilePartitionMethod = 'MapMFileToCFile';

  2. Использование -config , передать объект конфигурации в codegen:

    codegen -config mexcfg -O disable:inline foo
    % Disable inlining to generate one C/C++ file for each MATLAB function

Разбиение созданных файлов с одним файлом C/C + + на файл MATLAB

По умолчанию для функций MATLAB, которые не встроены, кодер MATLAB генерирует один файл C/C + + для каждого файла MATLAB. В этом случае разделы кодера MATLAB генерируют код C/C + + так, чтобы он соответствовал файлам MATLAB.

Как кодер MATLAB разделяет функции MATLAB точки входа

Для каждой функции MATLAB начального уровня (верхнего уровня) кодер MATLAB генерирует один исходный, верхний и объектный файл C/C + + с тем же именем, что и файл MATLAB.

Например, предположим, что вы определяете простую функцию foo который вызывает функцию identity. Исходный файл foo.m содержит следующий код:

function y = foo(u,v) %#codegen
s = single(u);
d = double(v);
y = double(identity(s)) + identity(d);

Вот код для identity.m :

function y = identity(u) %#codegen
y = u;

В приложении MATLAB Coder для создания статической библиотеки C для foo.m:

  1. Определение входных данных u и v. Дополнительные сведения см. в разделе Задание свойств входов функции точки входа с помощью приложения.

  2. Чтобы открыть диалоговое окно «Генерация», на странице «Генерация кода» щелкните стрелку «Генерация».

  3. Задайте для типа построения значение Static Library

  4. Щелкните Дополнительные параметры.

  5. На вкладке «All Settings» в разделе «Function Inlining» установите для параметра «Inline threshold» значение 0

  6. Щелкните Закрыть (Close)

  7. Чтобы создать библиотеку, нажмите кнопку «Создать».

Создание статической библиотеки C для foo.m, в командной строке введите:

codegen  -config:lib -O disable:inline foo -args {0, 0}
% Use the -args option to specify that u and v are both
% real, scalar doubles

Кодер MATLAB генерирует исходные, заголовочные и объектные файлы для foo и identity в папке вывода.

Как кодер MATLAB разделяет локальные функции

Для каждой локальной функции кодер MATLAB генерирует код в том же файле C/C + +, что и вызывающая функция. Например, предположим, что вы определяете функциюfoo который вызывает локальную функцию identity:

function y = foo(u,v) %#codegen
s = single(u);
d = double(v);
y = double(identity(s)) + identity(d);

function y = identity(u)
y = u;

Чтобы создать библиотеку C++, перед созданием кода выберите компилятор C++ и задайте C++ в качестве целевого языка. Например, в командной строке:

  1. Выберите C++ в качестве целевого языка:

    cfg = coder.config('lib')
    cfg.TargetLang='C++'

  2. Создайте библиотеку C++:

    codegen -config cfg   foo -args {0, 0}
    % Use the -args option to specify that u and v are both
    % real, scalar doubles

    В основной функции foo, Кодер MATLAB встраивает код для identity локальная функция.

    Примечание

    При указании C++, Кодер MATLAB оборачивает C код в .cpp файлы, чтобы можно было использовать C++ компилятор и интерфейс с внешним C++ приложения. Он не генерирует C++ классы.

    Вот фрагмент созданного кода в foo.cpp:

    ...
    /* Function Definitions */
    double foo(double u, double v)
    {
      return (double)(float)u + v;
    }
    ...

Как кодер MATLAB секционирует перегруженные функции

Перегруженная функция - это функция, которая имеет несколько реализаций для размещения различных классов ввода. Для каждой реализации (не встроенной) кодер MATLAB генерирует отдельный файл C/C + + с уникальным числовым суффиксом.

Например, предположим, что вы определяете простую функцию multiply_defined:

%#codegen
function y = multiply_defined(u)

y = u+1;

Затем добавляются еще две реализации multiply_defined, один для управления входами типа single@single подпапка) и другой для входов типа double@double подпапка).

Для вызова каждой реализации определите функцию. call_multiply_defined:

%#codegen
function [y1,y2,y3] = call_multiply_defined

y1 = multiply_defined(int32(2));
y2 = multiply_defined(2);
y3 = multiply_defined(single(2));

Затем создайте код C для перегруженной функции multiply_defined. Например, в командной строке MATLAB введите:

codegen -O disable:inline -config:lib call_multiply_defined

Кодер MATLAB генерирует исходные, заголовочные и объектные файлы C для каждой реализации multiply_defined, как было подчеркнуто. Используйте числовые суффиксы для создания уникальных имен файлов.

Созданные файлы и расположения

Типы и расположения созданных файлов зависят от указанного целевого объекта. Для всех целей, если ошибки или предупреждения возникают во время построения или если явно запрашивается отчет, MATLAB Coder создает отчеты.

Каждый раз, когда кодер MATLAB генерирует один и тот же тип выходных данных для одного и того же кода или проекта, он удаляет файлы из предыдущей сборки. Если необходимо сохранить файлы из сборки, скопируйте их в другое место перед запуском другой сборки.

Созданные файлы для конечных объектов MEX

По умолчанию кодер MATLAB генерирует следующие файлы для функции MEX (mex) цели.

Тип файловМестоположение
Файлы MEX для конкретной платформыТекущая папка

Файлы источников, заголовков и объектов MEX и C/C + +

codegen/mex/function_name

HTML-отчеты

codegen/mex/function_name/html

Созданные файлы для целей статической библиотеки C/C + +

По умолчанию кодер MATLAB генерирует следующие файлы для целей статической библиотеки C/C + +.

Тип файловМестоположение

Исходные, библиотечные, заголовочные и объектные файлы C/C + +

codegen/lib/function_name

HTML-отчеты

codegen/lib/function_name/html

Созданные файлы для целей динамической библиотеки C/C + +

По умолчанию программа MATLAB Coder генерирует следующие файлы для целей динамической библиотеки C/C + +.

Тип файловМестоположение

Исходные, библиотечные, заголовочные и объектные файлы C/C + +

codegen/dll/function_name

HTML-отчеты

codegen/dll/function_name/html

Созданные файлы для исполняемых конечных объектов C/C + +

По умолчанию кодер MATLAB генерирует следующие файлы для исполняемых целевых файлов C/C + +.

Тип файловМестоположение

Исходные, заголовочные и объектные файлы C/C + +

codegen/exe/function_name

HTML-отчеты

codegen/exe/function_name/html

Изменение имен и расположений созданных файлов

Использование приложения кодера MATLAB

ИзменитьсяДействие
Имя выходного файла
  1. Чтобы открыть диалоговое окно «Генерация», на странице «Генерация кода» щелкните стрелку «Генерация».

  2. В поле Имя выходного файла введите имя файла.

Расположение выходного файла
  1. Чтобы открыть диалоговое окно «Генерация», на странице «Генерация кода» щелкните стрелку «Генерация».

  2. Щелкните Дополнительные параметры.

  3. На вкладке «Пути» задайте для папки Build значение Specified folder.

  4. В поле Имя папки построения перейдите к расположению выходного файла или введите полный путь. Расположение выходного файла не должно содержать:

    • Пробелы (пробелы могут привести к сбоям генерации кода в определенных конфигурациях операционной системы).

    • Счета

    • \, $, #, *, ?

    • Non-7-bit символов ASCII, например японских символов.

В командной строке.  Можно изменить имя и расположение созданных файлов с помощью codegen варианты -o и -d.

Разбиение и вложение файлов

Способ создания кодовыми секциями MATLAB кода C/C + + зависит от того, нужно ли создавать один файл C/C + + для каждого файла MATLAB и встроены ли функции MATLAB.

Если вы Кодер MATLAB
Создание всех функций C/C + + в одном файле и отключение встраиванияСоздает один файл C/C + + без встроенных функций.
Создание всех функций C/C + + в одном файле и включение встраиванияСоздает один файл C/C + +. Встроенные функции, размеры которых находятся в пределах порогового значения.
Создайте один файл C/C + + для каждого файла MATLAB и отключите встраиваниеРазделы создали код C/C + +, соответствующий структуре файла MATLAB. См. раздел Разбиение созданных файлов с одним файлом C/C + + на файл MATLAB.
Создайте один файл C/C + + для каждого файла MATLAB и включите встраивание

Помещает встроенные функции в тот же файл C/C + +, в который они встроены.

Даже при включении встраивания кодер MATLAB встраивает только те функции, размеры которых находятся в пределах порога встраивания. Для функций MATLAB, которые не встроены, кодер MATLAB разделяет сгенерированный код C/C + +, как описано выше.

Компромиссы между разбиением файлов и вложением

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

При созданииСгенерированный код C/C + +ПреимуществаНедостатки
Все функции C/C + + в одном файлеНе соответствует структуре файла MATLABПростота интеграции с существующим встроенным ПОТрудно сопоставить код C/C + + с исходным файлом MATLAB
Один файл C/C + + для каждого файла MATLAB и включить встраиваниеНе совсем соответствует структуре файла MATLABПрограмма выполняется быстрееТрудно сопоставить код C/C + + с исходным файлом MATLAB
Один файл C/C + + для каждого файла MATLAB и отключение встраиванияСоответствует структуре файла MATLABЛегко сопоставить код C/C + + с исходным файлом MATLABПрограмма работает менее эффективно

Как отключение встраивания влияет на разбиение файлов

Встраивание включено по умолчанию. Поэтому для создания одного файла C/C + + для каждой функции MATLAB верхнего уровня необходимо:

  • Используется для создания одного файла C/C + + для каждой функции MATLAB верхнего уровня. Дополнительные сведения см. в разделе Выбор метода разбиения файлов.

  • Явное отключение встраивания (глобально или для отдельных функций MATLAB).

Как отключить встраивание в глобальном масштабе с помощью приложения MATLAB Coder App

  1. Чтобы открыть диалоговое окно «Генерация», на странице «Генерация кода» щелкните стрелку «Генерация».

  2. Щелкните Дополнительные параметры.

  3. На вкладке All Settings (Все настройки) в разделе Function Inlining (Встроенная функция) установите для параметра Inline threshold значение 0.

Как отключить глобальную вставку в командной строке.  Чтобы отключить встраивание функций, используйте -O disable:inline вариант с codegen. Например, чтобы отключить встраивание и создать функцию MEX для функции foo который не имеет входных данных:

codegen  -O disable:inline foo

Дополнительные сведения см. в описании codegen.

Как отключить встраивание для отдельных функций.  Чтобы отключить встраивание для отдельной функции MATLAB, добавьте директиву coder.inline('never'); в отдельной строке исходного файла MATLAB после подписи функции.

function y = foo(u,v) %#codegen
coder.inline('never');
s = single(u);
d = double(v);
y = double(identity(s)) + identity(d);

codegen не является встроенными функциями точки входа.

coder.inline директива применяется только к функции, в которой она отображается. В этом примере инлайнинг отключен для функции foo, но не для identity, функция верхнего уровня, определенная в отдельном файле MATLAB и вызванная foo. Как отключить встраивание для identity, добавить эту директиву после подписи ее функции в исходный файл identity.m. Дополнительные сведения см. в разделе coder.inline.

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

Корреляция кода C/C + + с встроенными функциями

Чтобы сопоставить код C/C + +, создаваемый с исходными встроенными функциями, добавьте комментарии в код MATLAB для идентификации функции. Эти комментарии появятся в коде C/C + + и помогут сопоставить созданный код с исходными функциями MATLAB.

Изменение порога встраивания

Чтобы изменить поведение встраивания, настройте параметр порога встраивания.

Изменение порога встраивания с помощью приложения кодера MATLAB

  1. Чтобы открыть диалоговое окно «Генерация», на странице «Генерация кода» щелкните стрелку «Генерация».

  2. Щелкните Дополнительные параметры.

  3. На вкладке All Settings в разделе Function Inlining задайте значение параметра Inline threshold.

Изменение порога встраивания в командной строке.  Установка значения InlineThreshold параметра объекта конфигурации. Посмотрите coder.MexCodeConfig, coder.CodeConfig, coder.EmbeddedCodeConfig.