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

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

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

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

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

Использование приложения 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, которые не inlined, MATLAB Coder генерирует один файл C/C + + для каждого файла MATLAB. В этом случае разделы MATLAB Coder сгенерировали код C/C + + так, чтобы он соответствовал вашим файлам MATLAB.

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

Для каждой функции 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. Для получения дополнительной информации смотрите Задать свойства входных параметров функции точки входа используя приложение.

  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 inlines код для 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 либо перейдите к местоположению файла выхода, либо введите полный путь. Расположение выходного файла не должно содержать:

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

    • Вкладки

    • \, $, #, *, ?

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

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

Разбиение файлов на разделы и инкрустация

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

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

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

Даже когда вы включите inlining, MATLAB Coder inlines только те функции, размеры которых попадают в порог inlining. Для функций MATLAB, которые не inlined, 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Программа работает менее эффективно

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

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

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

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

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

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

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

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

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

codegen  -O disable:inline foo

Для получения дополнительной информации смотрите описание codegen.

Как отключить Inlining для отдельных функций.  Чтобы отключить инкрустацию для отдельной функции 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.

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

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

Чтобы коррелировать код C/C + +, который вы генерируете с исходными inlined функциями, добавьте комментарии в код 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.