codegen

Сгенерируйте код C/C++ из кода MATLAB

Синтаксис

codegen options function -args {func_inputs}
codegen options files function -args {func_inputs}
codegen options files function -args {func_inputs} -nargout number_args
codegen options files function1 -args {func1_inputs} ... functionN -args {funcN_inputs}
codegen project

Описание

пример

опциифункцияcodegen -args {func_inputs} генерирует C или Код С++ от функции MATLAB® с входными параметрами типа func_inputs и создает сгенерированный код. Используйте аргумент options, чтобы задать настройки, такие как объект настройки генерации кода. Объект настройки управляет типом сборки (MEX, lib, dll, или exe) и параметры генерации кода. Для получения информации о создании и использовании объекта настройки, смотрите, Конфигурируют Настройки Сборки, coder.config и страницы ссылки на объект настройки: coder.CodeConfig, coder.MexCodeConfig и coder.EmbeddedCodeConfig.

Если функция не имеет входных параметров, не используйте функционально-специализированную опцию -args {func_inputs}.

опцииfilesфункцияcodegen -args {func_inputs} генерирует код C/C++ от функции MATLAB, которая использует пользовательский исходный код, заданный во внешнем files. Для получения дополнительной информации смотрите Вызов Код C/C++ из КОДА MATLAB и Сконфигурируйте Сборку для Внешнего Кода C/C++.

опцииfilesфункцияcodegen -args {func_inputs} -nargout number_args генерирует код C/C++ и управляет количеством выходных аргументов в пользу кода функции C/C++, сгенерированного от функции MATLAB. Файлы и аргументы опций являются дополнительными. Используйте опцию -nargout если не вся функция MATLAB, выходные параметры необходимы. Для получения дополнительной информации смотрите, Задают Количество Входного параметра функции Точки входа или Выходных аргументов, чтобы Сгенерировать.

опцииfilescodegen function1 -args {func1_inputs} ... functionN -args {funcN_inputs} генерирует код C/C++ от нескольких функций MATLAB. Запишите входные параметры отдельно для каждой функции после имени функции. Можно также использовать опцию -nargout для каждой функции. Функции, от которых вы генерируете код, являются вызванными функциями точки входа. Для получения дополнительной информации смотрите, Генерируют Код для Нескольких Функций Точки входа.

codegen project генерирует код для проекта MATLAB Coder™, например, test.prj. Генератор кода использует файл проекта, созданный из приложения MATLAB CODER, чтобы установить входные определения типа и другие опции. Чтобы открыть приложение, используйте функцию coder.

Примеры

свернуть все

Запишите функцию MATLAB, coderRand, который генерирует случайное скалярное значение от стандартного равномерного распределения на открытом интервале (0,1).

function r = coderRand() %#codegen
% The directive %#codegen indicates that the function
% is intended for code generation
r = rand();

Сгенерируйте и запустите MEX-функцию. Значения по умолчанию генерации кода генерации кода MEX, когда вы не задаете цель сборки. По умолчанию codegen называет сгенерированную MEX-функцию coderRand_mex.

codegen coderRand
coderRand_mex

Запишите функцию MATLAB, mcadd, который возвращает сумму двух значений.

function y = mcadd(u,v) %#codegen
y = u + v;

Сгенерируйте файлы библиотеки C в пользовательской папке mcaddlib с помощью опции -config:lib. Задайте первый входной тип как вектор 1 на 4 16-битных целых чисел без знака. Задайте второй входной параметр как с двойной точностью скаляр.

codegen -d mcaddlib -config:lib  mcadd -args {zeros(1,4,'uint16'),0}

Запишите функцию MATLAB, coderRand, который генерирует случайное скалярное значение от стандартного равномерного распределения на открытом интервале (0,1).

function r = coderRand() %#codegen
r = rand();

Запишите основную функцию C, c:\myfiles\main.c, который вызывает coderRand.

/*
** main.c
*/
#include <stdio.h>
#include <stdlib.h>
#include "coderRand.h"
#include "coderRand_initialize.h"
#include "coderRand_terminate.h"
int main()
{
    coderRand_initialize();
    printf("coderRand=%g\n", coderRand());
    coderRand_terminate();
    
    puts("Press enter to quit:");
    getchar();

    return 0;
}

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

cfg = coder.config('exe')
cfg.CustomSource = 'main.c'
cfg.CustomInclude = 'c:\myfiles'
codegen -config cfg coderRand

codegen генерирует исполняемый файл C, coderRand.exe, в текущей папке и вспомогательных файлах в папке по умолчанию, codegen\exe\coderRand.

Этот пример показывает, как задать основную функцию в качестве параметра в объекте coder.CodeConfig настройки. Также можно задать файл, содержащий main() отдельно в командной строке. Можно использовать источник, объект или файл библиотеки.

Для более подробного примера смотрите Использование Пример C Основной в Приложении.

Запишите функцию MATLAB, которая берет единственный входной параметр.

function y = halfValue(vector) %codegen
    y = 0.5 * vector;
end

Используйте coder.typeof, чтобы задать входной тип, когда вектор - строка из удваивает размер имеющий 1 16 с переменным размером второго измерения.

vectorType = coder.typeof(1, [1 16], [false true]);

Сгенерируйте статическую библиотеку C.

codegen -config:lib halfValue -args {vectorType}

Запишите функцию MATLAB, use_globals, который берет входной параметр того u и использует две глобальных переменные AR и B.

function y = use_globals(u)
%#codegen
% Turn off inlining to make 
% generated code easier to read
coder.inline('never');
global AR;
global B;
AR(1) = u(1) + B(1);
y = AR * 2;

Сгенерируйте MEX-функцию. По умолчанию codegen генерирует MEX-функцию под названием use_globals_mex в текущей папке. Задайте свойства глобальных переменных в командной строке при помощи опции -globals. Укажите, что входной параметр u является действительным, скалярным, дважды, при помощи опции -args.

codegen -globals {'AR', ones(4), 'B', [1 2 3 4]} use_globals -args {0}

Также можно инициализировать глобальные данные в MATLAB workspace. В посдказке MATLAB войдите:

global AR B;
AR = ones(4);
B = [1 2 3];

Сгенерируйте MEX-функцию.

codegen use_globals -args {0}

Запишите функцию, displayState, который использует перечислимые данные, чтобы активировать светодиодный дисплей, на основе состояния устройства. Это освещает зеленый светодиодный дисплей, чтобы указать на состояние ON. Это освещает красный светодиодный дисплей, чтобы указать на состояние OFF.

function led = displayState(state)
%#codegen

if state == sysMode.ON
    led = LEDcolor.GREEN;
else
    led = LEDcolor.RED;
end

Задайте перечисление LEDColor. На пути MATLAB создайте файл с именем 'LEDColor', содержащий:

classdef LEDcolor < int32
    enumeration
        GREEN(1),
        RED(2),
    end
end

Создайте объект coder.EnumType с помощью значения от существующего перечисления MATLAB.

Задайте перечисление sysMode. На пути MATLAB создайте файл с именем 'sysMode' содержащий:

classdef sysMode < int32
  enumeration
    OFF(0)
    ON(1)
  end
end

Создайте объект coder.EnumType из этого перечисления.

t = coder.typeof(sysMode.OFF);

Сгенерируйте MEX-функцию для displayState.

codegen  displayState -args {t}

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

function y = mcsqrtfi(x) %#codegen
y = sqrt(x);

Задайте свойства numerictype и fimath для фиксированной точки, вводит x и генерируют код библиотеки C для mcsqrtfi с помощью опции -config:lib.

T = numerictype('WordLength',32, ...
                'FractionLength',23, ...
                'Signed',true)
F = fimath('SumMode','SpecifyPrecision', ...
           'SumWordLength',32, ...
           'SumFractionLength',23, ...
           'ProductMode','SpecifyPrecision', ...
           'ProductWordLength',32, ...
           'ProductFractionLength',23)
% Define a fixed-point variable with these
%  numerictype and fimath properties
myfiprops = {fi(4.0,T,F)}
codegen -config:lib mcsqrtfi -args myfiprops
codegen генерирует библиотеку C и вспомогательные файлы в папке по умолчанию, codegen/lib/mcsqrtfi.

Этот пример требует Фиксированной точки Designer™.

Запишите функцию MATLAB, myadd, который возвращает сумму двух значений.

function y = myadd(u,v) %#codegen
    y = u + v;
end

Запишите функцию MATLAB, myadd_test, чтобы протестировать myadd.

function y = myadd_test %#codegen
    y = myadd(10,20);
end

Создайте объект coder.FixptConfig, fixptcfg, с настройками по умолчанию.

fixptcfg = coder.config('fixpt');

Определите имя испытательного стенда.

fixptcfg.TestBenchName = 'myadd_test';

Создайте объект настройки генерации кода сгенерировать автономную статическую библиотеку C.

cfg = coder.config('lib');

Сгенерируйте код с помощью опции -float2fixed.

codegen -float2fixed fixptcfg -config cfg myadd

Входные параметры

свернуть все

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

Заданный как один или несколько из этих значений:

C

Сгенерируйте код C/C++, но не вызывайте команду make.

-config:dll

Сгенерируйте динамическую библиотеку C/C++ с помощью параметров конфигурации по умолчанию.

-config:exe

Сгенерируйте статический исполняемый файл C/C++ использование параметров конфигурации по умолчанию.

-config:lib

Сгенерируйте статическую библиотеку C/C++ с помощью параметров конфигурации по умолчанию.

-config:mex

Сгенерируйте MEX-функцию с помощью параметров конфигурации по умолчанию.

-config:single

Сгенерируйте код MATLAB с одинарной точностью с помощью параметров конфигурации по умолчанию.

Требует Fixed-Point Designer.

-config config_object

Задайте объект настройки, который содержит параметры генерации кода. config_object является одним из следующих объектов настройки:

  • coder.CodeConfig — Параметры для автономной библиотеки C/C++ или исполняемой генерации, если Встроенный Coder® не доступен.

    % Configuration object for a dynamic linked library
    cfg = coder.config('dll')
    % Configuration object for an executable
    cfg = coder.config('exe')
    % Configuration object for a static standalone library
    cfg = coder.config('lib')
    

  • coder.EmbeddedCodeConfig — Параметры для автономной библиотеки C/C++ или исполняемой генерации, если Embedded Coder доступен.

    % Configuration object for a dynamic linked library
    ec_cfg = coder.config('dll')
    % Configuration object for an executable
    ec_cfg = coder.config('exe')
    % Configuration object for a static standalone library
    ec_cfg = coder.config('lib')
    

  • coder.MexCodeConfig — Параметры для генерации кода MEX.

    mex_cfg = coder.config
    % or 
    mex_cfg = coder.config('mex')

Для получения дополнительной информации смотрите, Конфигурируют Настройки Сборки.

-d out_folder

Храните сгенерированные файлы в абсолютном или относительном пути, заданном out_folder. out_folder не должен содержать:

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

  • Не 7-битные символы ASCII, такие как японские символы,

Если папка, заданная out_folder, не существует, codegen создает его.

Если вы не задаете местоположение папки, codegen генерирует файлы в папке по умолчанию:

codegen/target/fcn_name. 

target может быть:

  • mex для MEX-функций

  • exe для встраиваемых исполняемых файлов C/C++

  • lib для встраиваемых библиотек C/C++

  • dll для C/C++ динамические библиотеки

fcn_name является именем первой функции MATLAB (в алфавитном порядке) в командной строке.

Функция не поддерживает следующие символы на имена папок: звездочка (*), вопросительный знак (?), доллар ($) и фунт (#).

Примечание

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

-double2single double2single_cfg_name

Генерирует код MATLAB с одинарной точностью с помощью настроек, которые задает объект coder.SingleConfig double2single_cfg_name. codegen генерирует файлы в папке codegen/fcn_name/single.

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

Когда используется с опцией -config, также генерирует код C/C++ с одинарной точностью. codegen генерирует файлы с одинарной точностью в папке codegen/target/folder_name

. target может быть:

  • mex для MEX-функций

  • exe для встраиваемых исполняемых файлов C/C++

  • lib для встраиваемых библиотек C/C++

  • dll для C/C++ динамические библиотеки

folder_name является конкатенацией fcn_name и singlesuffix.

singlesuffix является суффиксом, который задает свойство coder.SingleConfig OutputFileNameSuffix. Файлы с одинарной точностью в этой папке также имеют этот суффикс.

Для получения дополнительной информации смотрите, Генерируют КОД MATLAB С одинарной точностью. У вас должен быть Fixed-Point Designer, чтобы использовать эту опцию.

-float2fixed float2fixed_cfg_name

Когда используется с опцией -config, генерирует фиксированную точку код C/C++ с помощью настроек, которые задает с плавающей точкой к объекту float2fixed_cfg_name настройки преобразования фиксированной точки.

codegen генерирует файлы в папке codegen/target/fcn_name_fixpt. target может быть:

  • mex для MEX-функций

  • exe для встраиваемых исполняемых файлов C/C++

  • lib для встраиваемых библиотек C/C++

  • dll для C/C++ динамические библиотеки

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

Когда используется без опции -config, генерирует фиксированную точку код MATLAB с помощью настроек, которые задает с плавающей точкой к объекту настройки преобразования фиксированной точки, названному float2fixed_cfg_name. codegen генерирует файлы в папке codegen/fcn_name/fixpt.

Необходимо установить свойство TestBenchName float2fixed_cfg_name. Например:

fixptcfg.TestBenchName = 'myadd_test';
Эта команда указывает, что myadd_test является тестовым файлом для с плавающей точкой к объекту fixptcfg настройки фиксированной точки.

Для получения дополнительной информации смотрите, Преобразовывают КОД MATLAB в код С Фиксированной точки. У вас должен быть Fixed-Point Designer, чтобы использовать эту опцию.

G

Задайте, использовать ли параметр отладки для компилятора C. Если вы включаете режим отладки, компилятор C отключает некоторую оптимизацию. Компиляция быстрее, но выполнение медленнее.

-globals global_values

Задайте имена и начальные значения для глобальных переменных в файлах MATLAB.

global_values является массивом ячеек имен глобальной переменной и начальных значений. Формат global_values:

{g1, init1, g2, init2, ..., gn, initn}

gn является именем глобальной переменной, заданной как вектор символа. initn является начальным значением. Например:

-globals {'g', 5}

Также используйте этот формат:

-globals {global_var, {type, initial_value}}

type является текстовым объектом. Чтобы создать текстовый объект, используйте coder.typeof. Для переменных типа массив глобальной ячейки необходимо использовать этот формат.

Прежде, чем сгенерировать код с codegen, инициализируйте глобальные переменные. Если вы не обеспечиваете начальные значения для глобальных переменных с помощью опции -globals, codegen проверяет на переменную в глобальной рабочей области MATLAB. Если вы не предоставляете начальное значение, codegen генерирует ошибку.

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

Чтобы задать постоянное значение для глобальной переменной, используйте coder.Constant. Например:

-globals {'g', coder.Constant(v)}
указывает, что g является глобальной переменной с постоянным значением v.

Для получения дополнительной информации смотрите, Генерируют Код для Глобальных данных.

-I include_path

Добавьте include_path к началу пути генерации кода. Когда codegen ищет функции MATLAB и пользовательские файлы C/C++, он ищет путь генерации кода сначала. Это не ищет классы на пути генерации кода. Классы должны быть на пути поиска файлов MATLAB. Для получения дополнительной информации смотрите Пути и Setup Инфраструктуры Файла.

Если путь содержит символы, которые не являются 7-битным ASCII, таким как японские символы, возможно, что codegen не находит файлы на этом пути.

Если ваш include_path содержит пути, которые содержат пробелы, заключают каждый экземпляр в двойные кавычки, например:

'C:\Project "C:\Custom Files"'
-jit

Используйте своевременную (JIT) компиляцию для генерации MEX-функции. JIT-компиляция может ускорить генерацию MEX-функции. Эта опция применяется только к генерации MEX-функции. Эта опция не совместима с определенными функциями генерации кода или опциями, такова как пользовательский код или пользование библиотекой OpenMP.

-launchreport

Сгенерируйте и откройте отчет генерации кода. Если вы не задаете эту опцию, codegen генерирует отчет, только если сообщения об ошибке или предупреждающие сообщения происходят или если вы задаете опцию -report.

-o output_file_name

Сгенерируйте MEX-функцию, библиотеку C/C++ или исполняемый файл C/C++ с базовым именем output_file_name плюс расширение:

  • .a или .lib для C/C++ статические библиотеки

  • .exe или никакое расширение для исполняемых файлов C/C++

  • .dll для C/C++ динамические библиотеки по системам Microsoft® Windows®

  • .so для C/C++ динамические библиотеки по системам Linux®

  • .dylib для C/C++ динамические библиотеки по системам Mac

  • Зависимое платформой расширение для сгенерированных MEX-функций

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

Для MEX-функций output_file_name должен быть допустимым именем функции MATLAB.

Если вы не задаете имя выходного файла для библиотек и исполняемых файлов, базовым именем является fcn_1. fcn_1 является именем первой функции MATLAB, заданной в командной строке. Для MEX-функций базовым именем является fcn_1_mex. Можно запустить исходную функцию MATLAB и MEX-функцию и сравнить результаты.

-O optimization_option

Оптимизируйте сгенерированный код, на основе значения optimization_option:

  • enable:inline — Включите функциональное встраивание

  • disable:inline — Отключите функциональное встраивание

  • Библиотека enable:openmp — Use OpenMP при наличии. Пользуясь библиотекой OpenMP, MEX-функциями или кодом C/C++, который codegen генерирует для parfor - циклы могут работать на нескольких потоках.

  • Библиотека disable:openmp — Disable OpenMP. С отключенным OpenMP codegen обрабатывает parfor - циклы как for - циклы и генерирует MEX-функцию или код C/C++, который работает на единственном потоке. Смотрите Компиляцию Управления циклов parfor.

Specify-O в командной строке однажды для каждой оптимизации.

Если не заданный, встраивание использования codegen и OpenMP для оптимизации.

-preservearraydims

Сгенерируйте код, который использует N-мерную индексацию. Для получения дополнительной информации смотрите, Генерируют Код, Который Использует N-мерную Индексацию.

Профиль

Позвольте профилировать сгенерированной MEX-функции при помощи профилировщика MATLAB. Для получения дополнительной информации смотрите MEX-функции Профиля при помощи профилировщика MATLAB.

-report

Представьте отчет генерации кода. Если вы не задаете эту опцию, codegen представляет отчет, только если сообщения об ошибке или предупреждающие сообщения происходят или если вы задаете опцию -launchreport.

Если у вас есть Embedded Coder, эта опция также включает производство Заменяющего отчета Кода.

-rowmajor

Сгенерируйте код, который использует размещение главного массива строки. Главное столбцом размещение является значением по умолчанию. Для получения дополнительной информации смотрите, Генерируют Код Который Размещение Главного массива строки Использования.

-singleC

Сгенерируйте код C/C++ с одинарной точностью. Для получения дополнительной информации смотрите, Генерируют код С С одинарной точностью в Командной строке.

У вас должен быть Fixed-Point Designer, чтобы использовать эту опцию.

-test test_file

Запустите test_file, заменив вызов исходной функции MATLAB с вызовом MEX-функции. Используя эту опцию совпадает с рабочим coder.runTest runTest.

Эта опция поддержана только при генерации MEX-функций или при использовании объекта настройки с набором VerificationMode к 'SIL' или 'PIL'. Создание объекта настройки, который имеет параметр VerificationMode, требует продукта Embedded Coder.

Эта опция не поддержана с преобразованием фиксированной точки или преобразованием с одинарной точностью.

V

Позвольте многословному режиму показать шаги сборки. Используйте при генерации библиотек или исполняемых файлов только.

-?

Отобразите справку для команды codegen.

Заданный как функция, существующая в текущей рабочей папке или на пути. Если файл MATLAB находится на пути, который содержит не 7-битные символы ASCII, такие как японские символы, команда codegen не может найти файл.

При использовании компилятор LCC, не называйте функцию точки входа main.

Пример: codegen myAddFunction

Значения в качестве примера, которые задают размер, класс и сложность входных параметров предыдущей функции MATLAB. Положение входного параметра в массиве ячеек должно соответствовать положению входного параметра в определении функции MATLAB. Также вместо значения в качестве примера, можно обеспечить объект coder.Type. Чтобы создать объект coder.Type, используйте coder.typeof.

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

Для получения дополнительной информации смотрите Specify Properties Входных параметров функции Точки входа.

Пример: нечто-args {1} codegen

Пример: codegen foo2-args {1, единицы (3,5)}

Пример: codegen foo3-args {1, единицы (3,5), coder.typeof ("привет")}

Разделенный пробелом список пользовательских файлов, чтобы включать в сгенерированный код. Порядок опций, внешних файлов и функциональных спецификаций является взаимозаменяемым. Можно включать эти типы файлов:

  • C файл (.c c

  • Файл C++ (.cpp)

  • Заголовочный файл. h

  • Объектный файл (.o или .obj)

  • Библиотека (.a a. so, .dylib или .lib)

  • Обработайте make-файл по шаблону (.tmf)

Если эти файлы находятся на пути, который содержит не 7-битные символы ASCII, такие как японские символы, команда codegen не может найти файлы.

Пример: нечто codegen myLib.lib

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

Пример: codegen myMLfnWithThreeOuts-nargout 2

Ограничения

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

Советы

  • По умолчанию код сгенерирован в папке codegen/target/function. MEX-функции и исполняемые файлы копируются в текущую рабочую папку.

  • Чтобы упростить ваш процесс генерации кода, можно написать команды генерации кода в отдельном скрипте. В скрипте задайте свои типы входного параметра функции и опции генерации кода. Чтобы сгенерировать код, вызовите скрипт.

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

  • Используйте функцию coder, чтобы открыть приложение MATLAB CODER и создать проект MATLAB CODER. Приложение обеспечивает пользовательский интерфейс, который упрощает добавляющие файлы MATLAB, задавая входные параметры, и задавая параметры сборки.

  • Можно вызвать codegen при помощи синтаксиса функций. Задайте аргументы codegen как векторы символов или представьте скаляры в виде строки. Например:

    codegen('myfunction','-args',{2 3},'-report')
    
  • Чтобы обеспечить скаляр строки как входной параметр или задать аргумент codegen как скаляр строки, используйте синтаксис функций. Например:

    codegen('myfunction','-args',"mystring",'-report')
    codegen("myfunction","-args","mystring","-report")
    

    Обеспечение скалярных входных параметров строки к форме команды codegen может привести к неожиданным результатам. Смотрите Сравнение синтаксиса команд и функций (MATLAB).

  • Чтобы выполнить программируемые вызовы codegen, используйте синтаксис функций. Например:

    A = {'myfunction','-args',{2 3}};
    codegen(A{:})
    

Введенный в R2011a

Была ли эта тема полезной?