По умолчанию во время генерации кода MATLAB® Coder™ разделяет код, соответствующий структуре файла MATLAB. Это сопоставление один в один позволяет вам легко коррелировать ваши файлы, сгенерированные на C/C + + с скомпилированным кодом MATLAB. MATLAB Coder не может создать то же соответствие один к одному для функций MATLAB, которые встроены в сгенерированный код (см. Раздел файла и Inlining).
Также можно выбрать, чтобы сгенерировать все функции C/C + + в один файл. Для получения дополнительной информации см. Раздел «Как выбрать метод разбиения файлов». Эта опция облегчает интеграцию вашего кода с существующим встроенным программным обеспечением.
Чтобы открыть диалоговое окно Generate, на странице Generate Code щелкните стрелу Generate.
Нажмите More Settings.
На вкладке 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:
Создайте объект строения MEX и установите FilePartitionMethod
опция:
mexcfg = coder.config('mex'); mexcfg.FilePartitionMethod = 'MapMFileToCFile';
Использование -config
опция, передайте объект строения в codegen
:
codegen -config mexcfg -O disable:inline foo % Disable inlining to generate one C/C++ file for each MATLAB function
По умолчанию для функций MATLAB, которые не inlined, MATLAB Coder генерирует один файл C/C + + для каждого файла MATLAB. В этом случае разделы MATLAB Coder сгенерировали код C/C + + так, чтобы он соответствовал вашим файлам 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
:
Задайте входы u
и v
. Для получения дополнительной информации смотрите Задать свойства входных параметров функции точки входа используя приложение.
Чтобы открыть диалоговое окно Generate, на странице Generate Code щелкните стрелу Generate.
Установите Build type равным Static Library
Нажмите More Settings.
На вкладке All Settings, под Function Inlining, установите параметр Inline threshold равным 0
Нажмите Close
Чтобы сгенерировать библиотеку, нажмите 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 генерирует код в том же файле 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++. Для примера в командной строке:
Выберите C++ в качестве целевого языка:
cfg = coder.config('lib') cfg.TargetLang='C++'
Сгенерируйте библиотеку 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 генерирует отдельный файл 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 генерирует один и тот же тип выхода для того же кода или проекта, он удаляет файлы из предыдущей сборки. Если вы хотите сохранить файлы из сборки, скопируйте их в другое место, прежде чем запускать другую сборку.
По умолчанию MATLAB Coder генерирует следующие файлы для MEX-функции (mex
) цели.
Тип файлов | Местоположение |
---|---|
Специфичные для платформы файлы MEX | Текущая папка |
MEX и исходные файлы C/C + +, заголовки и файлы объектов | codegen/mex/function_name |
HTML | codegen/mex/function_name /html |
По умолчанию MATLAB Coder генерирует следующие файлы для статических библиотек на C/C + +.
Тип файлов | Местоположение |
---|---|
Исходный код C/C + +, библиотека, заголовок и файлы объектов | codegen/lib/function_name |
HTML | codegen/lib/function_name /html |
По умолчанию MATLAB Coder генерирует следующие файлы для динамических библиотек на C/C + +.
Тип файлов | Местоположение |
---|---|
Исходный код C/C + +, библиотека, заголовок и файлы объектов | codegen/dll/function_name |
HTML | codegen/dll/function_name /html |
По умолчанию MATLAB Coder генерирует следующие файлы для исполняемых файлов C/C + +.
Тип файлов | Местоположение |
---|---|
Исходный код C/C + +, заголовок и файлы объектов | codegen/exe/function_name |
HTML | codegen/exe/function_name /html |
Использование приложения MATLAB Coder
Измениться | Действие |
---|---|
Имя выходного файла |
|
Расположение выходного файла |
|
В командной строке. Вы можете изменить имя и расположение сгенерированных файлов, используя 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
Чтобы открыть диалоговое окно Generate, на странице Generate Code щелкните стрелу Generate.
Нажмите More Settings.
На вкладке 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 + +, который вы генерируете с исходными inlined функциями, добавьте комментарии в код MATLAB, чтобы идентифицировать функцию. Эти комментарии появятся в коде C/C + + и помогут вам сопоставить сгенерированный код с исходными функциями MATLAB.
Чтобы изменить поведение встраивания, настройте параметр встраивания порога.
Изменение входного порога с помощью приложения MATLAB Coder
Чтобы открыть диалоговое окно Generate, на странице Generate Code щелкните стрелу Generate.
Нажмите More Settings.
На вкладке All Settings под Function Inlining установите значение параметра Inline threshold.
Изменение входного порога в командной строке. Установите значение InlineThreshold
параметр объекта строения. См. coder.MexCodeConfig
, coder.CodeConfig
, coder.EmbeddedCodeConfig
.