Как сгенерированный код разделов MATLAB Coder

Разделение сгенерированных файлов

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

В качестве альтернативы можно выбрать, чтобы сгенерировать все функции C/C++ в один файл. Для получения дополнительной информации смотрите, Как Выбрать File Partitioning Method. Эта опция упрощает интеграцию вашего кода с существующим встроенным программным обеспечением.

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

Используя приложение MATLAB Coder

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

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

  3. На вкладке Code Appearance, набор Generated file partitioning method к 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 Coder генерирует один файл C/C++ для каждого файла MATLAB. В этом случае разделы MATLAB Coder сгенерировали код C/C++ так, чтобы он соответствовал вашим файлам MATLAB.

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

Для каждой точки входа (верхний уровень) функция MATLAB MATLAB Coder генерирует один источник 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. Для получения дополнительной информации смотрите Specify Properties Входных параметров функции Точки входа Используя Приложение.

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

  3. Установите Build type на Static Library

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

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

  6. Нажмите Close

  7. Чтобы сгенерировать библиотеку, нажмите Generate.

Сгенерировать статическую библиотеку 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 Coder генерирует источник, заголовок и объектные файлы для foo и identity в вашей выходной папке.

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

Для каждой локальной функции MATLAB Coder генерирует код в том же файле 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 Coder встраивает код для identity локальная функция.

    Примечание

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

    Вот выборка сгенерированного кода в foo.cpp:

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

Как перегруженные функции разделов MATLAB Coder

Перегруженная функция является функцией, которая имеет несколько реализаций, чтобы вместить различные классы входа. Для каждой реализации (который не встраивается), MATLAB Coder генерирует разделять файл 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));

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

codegen -O disable:inline -config:lib call_multiply_defined

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

Сгенерированные файлы и местоположения

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

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

Сгенерированные файлы для целей MEX

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

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

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

codegen/mex/function_name

Отчеты HTML

codegen/mex/function_name/html

Сгенерированные Файлы для C/C++ Статические Цели Библиотеки

По умолчанию MATLAB Coder генерирует следующие файлы для 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 Coder генерирует следующие файлы для исполнимых целей C/C++.

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

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

codegen/exe/function_name

Отчеты HTML

codegen/exe/function_name/html

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

Используя приложение MATLAB Coder

ИзменитьсяДействие
Имя выходного файла
  1. Чтобы открыть диалоговое окно Generate, на странице Generate Code, кликают по стреле Generate.

  2. В поле Output file name введите имя файла.

Местоположение выходного файла
  1. Чтобы открыть диалоговое окно Generate, на странице Generate Code, кликают по стреле Generate.

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

  3. На вкладке Paths, набор Build folder к Specified folder.

  4. Для поля Build folder name, или просмотреть к местоположению выходного файла или вводят полный путь. Местоположение выходного файла не должно содержать:

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

    • Вкладки

    • \, $, #, *, ?

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

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

Разделение файла и встраивание

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

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

Места встроили функции в том же файле C/C++ как функция, в которую они встраиваются.

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

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

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

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

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

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

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

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

Как отключить встраивание глобально Используя приложение MATLAB Coder

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

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

  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 Coder

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

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

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

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

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